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

lei*_*paC 2 c++ opencv

我有一个vector<Point2f>点,我需要转换为极地.我认为这样做的唯一功能是cartToPolar(),由于某种原因,它不仅允许一个点矢量,而是需要两个,每个只包含x坐标和y坐标.

有没有任何优雅的解决方案或我必须手动制作这两个向量?

cha*_*pjc 7

由于cv::Mat具有与数据指针和步骤的构造,就可以使2作为交织X容器和每个y分量Point2fvector,其具有连续的数据.

#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;
}
Run Code Online (Sandbox Code Playgroud)

关键是步骤,2 * sizeof(float).除非您,否则不会复制数据clone.

产量

x: [3, 6, 1]
y: [4, 8, 1]

magnitude: [5, 10, 1.4142135]
angle: [53.136284, 53.136284, 44.990456]
Run Code Online (Sandbox Code Playgroud)