2013-07-29 3 views
2

나는 cv::Matx33f으로 변환하려는 cv::Mat을 가지고 있습니다. 나는 이렇게하려고 애를 씁니다 :cv :: Mat를 cv :: Matx33f로 변환하는 방법

cv::Mat m; 
cv::Matx33f m33; 
......... 
m33 = m; 

그러나 모든 데이터가 손실됩니다! 어떤 생각을 어떻게 할 것인가?

cv::Point2f Order::warpPoint(cv::Point2f pTmp){ 
    cv::Matx33f warp = this->getTransMatrix() ; // the getter gives a cv::Mat back 
    transformMatrix.copyTo(warp); // because the first method didn't work, I tried to use the copyto function 

    // and the last try was 
    warp = cv::Matx33f(transformationMatrix); // and waro still 0 
    cv::Point3f warpPoint = cv::Matx33f(transformMatrix)*pTmp; 
    cv::Point2f result(warpPoint.x, warpPoint.y); 
    return result; 
} 

답변

3

http://opencv.willowgarage.com/documentation/cpp/core_basic_structures.html는 말한다 : 여기 UPDATE

내 문제를 일으키는 코드의 일부이다

"당신이 구현되지 Matx에 대한 몇 가지 작업을 수행해야하는 경우 행렬을 매트와 뒤쪽으로 쉽게 변환 할 수 있습니다. "

Matx33f m(1, 2, 3, 
      4, 5, 6, 
      7, 8, 9); 
cout << sum(Mat(m*m.t())) << endl; 
+0

감사하지만이 올바르게 나를 위해 노력하고 있습니다 – Engine

+0

에 작동하지 않았다 : Matx33f m (1, 2, 3, 4, 5, 6, 7, 8, 9); Mat x = Mat (m); std :: cout << x; – Barshan

+0

솔직히 말해서 여기서는 작동하지 않는 이유를 알지 못합니다. 프레임을 다른 클래스에서 얻으려면 제대로 작동해야합니다. 간단한 기본 함수를 썼기 때문에 작동했습니다.) (,하지만 감사합니다. – Engine

8

Mat에서 Matx로 변환하려면 데이터 포인터를 사용할 수 있습니다. 예를 들어,

cv::Mat m; // assume we know it is CV_32F type, and its size is 3x3 

cv::Matx33f m33((float*)m.ptr()); 

m의 연속 메모리를 가정 할 때이 작업을 수행해야합니다. 나는 질문이 오래 실현

std::cout << "m " << m << std::endl; 

std::cout << "m33 " << m33 << std::endl; 
+5

m.ptr() 대신에 m.clone(). ptr()을 사용하는 것이 더 좋습니다. 이렇게하면 원래의 행렬 m이 연속적이지 않아도 작동합니다 메모리에. –

0

하지만,이 또한 작동합니다 : 당신은하여 확인할 수 있습니다 답변

auto m33 = Matx33f(m.at<float>(0, 0), m.at<float>(0, 1), m.at<float>(0, 2), 
        m.at<float>(1, 0), m.at<float>(1, 1), m.at<float>(1, 2), 
        m.at<float>(2, 0), m.at<float>(2, 1), m.at<float>(2, 2)); 
관련 문제