- 操作系統:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 編程語言:C++11
算法描述
計算二維向量的大小和角度。
cartToPolar 函數計算每個二維向量 (x(I), y(I)) 的大小、角度,或同時計算兩者:
magnitude ( I ) = x ( I ) 2 + y ( I ) 2 , angle ( I ) = atan2 ( y ( I ) , x ( I ) ) [ ? 180 / π ] \begin{array}{l} \texttt{magnitude} (I)= \sqrt{\texttt{x}(I)^2+\texttt{y}(I)^2} , \\ \texttt{angle} (I)= \texttt{atan2} ( \texttt{y} (I), \texttt{x} (I))[ \cdot180 / \pi ] \end{array} magnitude(I)=x(I)2+y(I)2?,angle(I)=atan2(y(I),x(I))[?180/π]?
cartToPolar 函數計算角度的準確度約為0.3度。對于點 (0,0),其角度被設定為0。
第一個輸出是一個與輸入 x 具有相同大小和深度的矩陣,表示各個向量的大小(magnitude)。 第二個輸出也是一個與 x 具有相同大小和深度的矩陣,但表示的是各個向量的角度(angle)。這些角度以弧度(范圍從 0 到 2π)或度數(0 到 360 度)測量。
注意事項:
函數的文本ID是 “org.opencv.core.math.cartToPolar”。
函數原型
std::tuple<GMat, GMat> cv::gapi::cartToPolar
(const GMat & x,const GMat & y,bool angleInDegrees = false
)
參數
- 參數x:CV_32FC1 類型的 x 坐標的矩陣。
- 參數y:CV_32FC1 類型的 y 坐標的數組。
- 參數angleInDegrees:一個標志,指示角度是用弧度(這是默認設置)測量,還是用度數測量。
返回值
返回一個 std::tuple<GMat, GMat>,其中:
- 第一個元素是表示向量大小(magnitude)的 GMat。
- 第二個元素是表示向量角度(angle)的 GMat。
代碼示例
#include <opencv2/gapi/core.hpp> // 包含G-API核心功能
#include <opencv2/opencv.hpp>
#include <tuple>int main()
{// 創建示例數據cv::Mat x = ( cv::Mat_< float >( 4, 1 ) << 1.0f, 0.0f, -1.0f, 0.0f );cv::Mat y = ( cv::Mat_< float >( 4, 1 ) << 0.0f, 1.0f, 0.0f, -1.0f );// 檢查輸入矩陣是否為空if ( x.empty() || y.empty() ){std::cerr << "無法加載輸入矩陣,請檢查數據。" << std::endl;return -1;}// 定義G-API圖中的輸入cv::GMat gx, gy;auto res = cv::gapi::cartToPolar( gx, gy, true ); // 將角度轉換為度數// 創建一個計算圖cv::GComputation cartToPolar_graph( cv::GIn( gx, gy ), cv::GOut( std::get< 0 >( res ), std::get< 1 >( res ) ) );// 輸出矩陣cv::Mat magnitude, angle;// 編譯并執行計算圖cartToPolar_graph.apply( cv::gin( x, y ), cv::gout( magnitude, angle ) );// 打印結果std::cout << "Magnitude: " << magnitude << std::endl;std::cout << "Angle (degrees): " << angle << std::endl;return 0;
}
運行結果
Magnitude: [1;1;1;1]
Angle (degrees): [0;90;180;270]