笛卡尔坐标、极坐标互转
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;
}