笛卡爾坐标、極坐标互轉
- 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;
}