OpenCV 图形API(7)用于将笛卡尔坐标(x, y)转换为极坐标(magnitude, angle)函数cartToPolar()
- 操作系统: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]
