2016-11-25 1 views
0

pinv() example이 발견되어 성공적으로 실행되었습니다.opencv matrix Pseudo Inverse가 실패했습니다.

하지만 내 버전은 실패

Mat1b B = Mat(400, 10, CV_32FC1); 
for (r = 0; r < 20; r++) 
{ 
    for (c = 0; c < 20; c++) 
    { 
     B(n,0) = 1; 
     B(n,1) = r; 
     B(n,2) = c; 
     B(n,3) = r*r; 
     B(n,4) = c*r; 
     B(n,5) = c*c; 
     B(n,6) = r*r*r; 
     B(n,7) = c*r*r; 
     B(n,8) = c*c*r; 
     B(n,9) = c*c*c; 
     n = n + 1; 
    } 
} 
Mat1b Bpinv = Mat(10, 400, CV_32FC1); 
invert(B, Bpinv, DECOMP_SVD); 

invert의 오류는 다음과 같습니다

Error message like this:OpenCV Error: Assertion failed (type == CV_32F || type == CV_64F) in cv::invert.

일부 충돌이 CV_32FCV_64F 사이에 일어나는 것처럼 보이는,하지만 난 전혀 CV_64F 형식을 사용하지 않은 . 어떻게 그럴 수 있죠?

답변

0

당신은 사용되는 Mat1b (즉, 유형 CV_8UC1Mat_<uchar>),하지만 Mat1f해야한다 (즉, 유형 CV_32FC1Mat_<float>)

당신에게 (유형 CV_64FC1의 즉 Mat_<double>), 또는 Mat1dCV_8UCV_32F도 아니고 CV_64F도 아닌 것을 볼 수 있습니다. 수표는 채널 수가 아닌 깊이에만 표시됩니다.

그래서 Mat_<Tp>를 사용하여 올바른 코드 (중 Mat1f 또는 Mat1d)입니다 : Mat를 사용

Mat1f B(400, 10); 
for (r = 0; r < 20; r++) 
{ 
    for (c = 0; c < 20; c++) 
    { 
     B(n,0) = 1; 
     B(n,1) = r; 
     B(n,2) = c; 
     B(n,3) = r*r; 
     B(n,4) = c*r; 
     B(n,5) = c*c; 
     B(n,6) = r*r*r; 
     B(n,7) = c*r*r; 
     B(n,8) = c*c*r; 
     B(n,9) = c*c*c; 
     n = n + 1; 
    } 
} 

// You don't have to initialize 'OutputArray' for OpenCV functions 
Mat1f Bpinv; 
invert(B, Bpinv, DECOMP_SVD); 

또는 :

Mat B(400, 10, CV_32FC1); 
for (r = 0; r < 20; r++) 
{ 
    for (c = 0; c < 20; c++) 
    { 
     B.at<float>(n,0) = 1; 
     B.at<float>(n,1) = r; 
     B.at<float>(n,2) = c; 
     B.at<float>(n,3) = r*r; 
     B.at<float>(n,4) = c*r; 
     B.at<float>(n,5) = c*c; 
     B.at<float>(n,6) = r*r*r; 
     B.at<float>(n,7) = c*r*r; 
     B.at<float>(n,8) = c*c*r; 
     B.at<float>(n,9) = c*c*c; 
     n = n + 1; 
    } 
} 

// You don't have to initialize 'OutputArray' for OpenCV functions 
Mat Bpinv; 
invert(B, Bpinv, DECOMP_SVD); 
+0

지금 이해합니다. OpenCV의 형식에 대해 더 자세히 알아야합니다. –

0

CV_32FC1이 (가) CV_32F이 아니라 사용하고 있습니다. 차이점을 확인하려면 this answer을 확인하십시오. 나는 당신이 그것을 CV_32F으로 바꾸면 그것이 효과가 있다고 생각합니다.

+0

덕분에 형제. 그것도 도움이 –

관련 문제