- 操作系统: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]