我有一个vector<Point2f>
点,我需要转换为极地。我看到的唯一一个函数是cartToPolar()
,由于某种原因,它不允许只有一个点矢量,而是需要两个,每个只包含x坐标和y坐标。
对此有没有优雅的解决方案,还是我必须手动制作其他两个向量?
答案 0 :(得分:6)
由于cv::Mat
有constructor with a data pointer and a step,因此您可以将{2}作为Point2f
中每个vector
的交错x和y分量的容器,它们具有连续的数据。
<强>代码强>
#include "opencv2/opencv.hpp"
int main(int argc,const char* argv[])
{
std::vector<cv::Point2f> sides;
sides.push_back(cv::Point2f(3, 4));
sides.push_back(cv::Point2f(6, 8));
sides.push_back(cv::Point2f(1, 1));
cv::Mat xpts(sides.size(), 1, CV_32F, &sides[0].x, 2 * sizeof(float));
cv::Mat ypts(sides.size(), 1, CV_32F, &sides[0].y, 2 * sizeof(float));
std::cout << "x: " << xpts.t() << std::endl;
std::cout << "y: " << ypts.t() << std::endl;
cv::Mat magnitude, angle;
cv::cartToPolar(xpts, ypts, magnitude, angle);
std::cout << "\nmagnitude: " << magnitude.t();
std::cout << "\nangle: " << angle.t() *180. / CV_PI << std::endl;
return 0;
}
关键是步骤2 * sizeof(float)
。除非您clone
。
<强>输出强>
x: [3, 6, 1]
y: [4, 8, 1]
magnitude: [5, 10, 1.4142135]
angle: [53.136284, 53.136284, 44.990456]