天天看點

OpenCV 笛卡爾坐标、極坐标互轉1.笛卡爾坐标轉為極坐标2.極坐标轉為笛卡爾坐标

笛卡爾坐标、極坐标互轉

  • 1.笛卡爾坐标轉為極坐标
  • 2.極坐标轉為笛卡爾坐标

1.笛卡爾坐标轉為極坐标

函數原型:

void cartToPolar(InputArray x,    //x坐标的數組,且必須是單精度或雙精度浮點數組
				 InputArray y,    //y坐标的數組,且必須是單精度或雙精度浮點數組
				 OutputArray magnitude,   //輸出與x大小和類型相同的幅值數組
				 OutputArray angle,    //輸出與x大小和類型相同的角度數組; 角度的範圍是弧度(0~2pi)或角度(0~360)
				 bool angleInDegrees = false)   //一個标志,訓示角度是以弧度(預設為弧度)還是以度為機關
           

示例代碼1:

#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;

int main()
{
 vector<Point2f> sides;//建立容器存坐标
 sides.push_back(Point2f(3, 4));
 sides.push_back(Point2f(6, 8));
 sides.push_back(Point2f(1, 1));

 Mat xpts(sides.size(), 1, CV_32F, &sides[0].x, 2 * sizeof(float));
 Mat ypts(sides.size(), 1, CV_32F, &sides[0].y, 2 * sizeof(float));

 cout << "x: " << xpts.t() << endl;
 cout << "y: " << ypts.t() << endl;

 Mat magnitude, angle;
 cartToPolar(xpts, ypts, magnitude, angle);  //調用函數

 cout << "\nmagnitude: " << magnitude.t();
 cout << "\nangle: " << angle.t() *180. / CV_PI <<endl;
 return 0;
}
           

示例代碼2:

#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;

int main()
{
	Mat x = (Mat_<float>(3, 1) << 3, 6, 1);
	Mat y = (Mat_<float>(3, 1) << 4, 8, 1);
	Mat magnitude, angle;
	cartToPolar(x, y, magnitude, angle);  //調用函數

	cout << "\nmagnitude: " << magnitude.t();
	cout << "\nangle: " << angle.t() * 180. / CV_PI << endl;
	
	return 0;
}
           

2.極坐标轉為笛卡爾坐标

函數原型:

void polarToCart(InputArray magnitude,   //輸入二維矢量幅度的浮點數組;
										 //它可以是一個空矩陣(= Mat()),在這種情況下,該函數假定			所有的幅度都是= 1; 
										 //如果不為空,則必須具有與角度相同的大小和類型
				 InputArray angle,   //輸入2D向量角度的浮點數組
                 OutputArray x,    //2D向量的x坐标輸出數組; 它的大小和類型與角度相同
                 OutputArray y,   //2D向量的y坐标的輸出數組; 它的大小和類型與角度相同
                 bool angleInDegrees = false)
           

示例代碼:

#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;

int main()
{
	Mat magnitude = (Mat_<float>(3, 1) << 5, 10, 1.4142135);
	Mat angle = (Mat_<float>(3, 1) << 0.92740309, 0.92740309, 0.78523159);
	Mat x, y;
	polarToCart(magnitude, angle, x, y);  //調用函數

	cout << "\nx: " << x.t() << endl;
	cout << "\ny: " << y.t() << endl;
	
	return 0;
}