2016-11-25 18 views
0

pinv() exampleが見つかり、正常に実行されました。opencv行列疑似逆転が失敗する

しかし、私のバージョンは失敗します。

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のいずれか)である:

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を使用して:

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

おかげで仲間。それはまた助けて –

関連する問題