【问题标题】:opencv matrix Pseudo Inverse failsopencv矩阵伪逆失败
【发布时间】:2016-11-25 08:40:18
【问题描述】:

我找到了pinv() example 并成功运行。

但是我的版本失败了:

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 中的错误是:

类似这样的错误消息:OpenCV Error: Assertion failed (type == CV_32F || type == CV_64F) in cv::invert。

看起来CV_32FCV_64F 之间发生了一些冲突,但我根本没有使用CV_64F 格式。怎么会这样?

【问题讨论】:

    标签: c++ opencv


    【解决方案1】:

    您正在使用Mat1b(即Mat_&lt;uchar&gt;,类型为CV_8UC1),但它应该是Mat1f(即Mat_&lt;float&gt;,类型为CV_32FC1)或Mat1d(即Mat_&lt;double&gt;,类型为CV_64FC1)

    你可以看到CV_8U既不是CV_32F也不是CV_64F。请注意,只检查深度,而不是通道数。

    所以使用Mat_&lt;Tp&gt; 的正确代码是(Mat1fMat1d):

    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);
    

    【讨论】:

    • 我现在明白了。我现在需要更多地了解 OpenCV 中的格式。非常感谢
    【解决方案2】:

    您使用的是CV_32FC1,而不是CV_32F。查看this answer 以了解差异。我想如果你把它改成CV_32F 它应该可以工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-18
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 2020-05-18
      • 1970-01-01
      • 1970-01-01
      • 2018-01-10
      相关资源
      最近更新 更多