2014-10-30 8 views
1

나는 극좌표로 변환해야 할 점이 vector<Point2f>입니다. 이 작업을 수행하는 유일한 기능은 cartToPolar()입니다. 어떤 이유로 점의 벡터가 허용되지 않고 각 좌표에 x 좌표와 y 좌표 만 들어있는 두 개가 필요합니다.OpenCV에서 cartToPolar를 통해 점 벡터 벡터 넣기

이에 대한 적절한 해결책이 있습니까? 아니면이 두 벡터를 수동으로 만들어야합니까? cv::Mat 이후

+1

출력 :'이력서 :: 매트의 tmp = CV : 매트 (yourVectorOfPoints가)'후 매트의 채널 분리 :'표준을 :: 벡터 분할; cv :: split (testMat, split);'이제 첫 번째 매트는 x 좌표를 가지며 두 번째 매트는 y 좌표를가집니다. 하지만 아마도 수동 솔루션보다 느릴 것입니다 =) – Micka

+0

오 이런. 천천히 그냥하지 않습니다. –

답변

5

는 연속 데이터를 갖는 vector, 인터리빙 X 컨테이너 Point2f 각각의 Y 구성 요소로 두 가지를 할 수하는 constructor with a data pointer and a step 갖는다.

코드

#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]