在OpenCV中通过cartToPolar放置一个点向量

时间:2014-10-30 15:39:54

标签: c++ opencv

我有一个vector<Point2f>点,我需要转换为极地。我看到的唯一一个函数是cartToPolar(),由于某种原因,它不允许只有一个点矢量,而是需要两个,每个只包含x坐标和y坐标。

对此有没有优雅的解决方案,还是我必须手动制作其他两个向量?

1 个答案:

答案 0 :(得分:6)

由于cv::Matconstructor 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]