는 연속 데이터를 갖는 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]
출력 :'이력서 :: 매트의 tmp = CV : 매트 (yourVectorOfPoints가)'후 매트의 채널 분리 :'표준을 :: 벡터 분할; cv :: split (testMat, split);'이제 첫 번째 매트는 x 좌표를 가지며 두 번째 매트는 y 좌표를가집니다. 하지만 아마도 수동 솔루션보다 느릴 것입니다 =) –
Micka
오 이런. 천천히 그냥하지 않습니다. –