opencv矩阵伪逆失败
Posted
技术标签:
【中文标题】opencv矩阵伪逆失败【英文标题】:opencv matrix Pseudo Inverse fails 【发布时间】: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_32F
和CV_64F
之间发生了一些冲突,但我根本没有使用CV_64F
格式。怎么会这样?
【问题讨论】:
【参考方案1】:您正在使用Mat1b
(即Mat_<uchar>
,类型为CV_8UC1
),但它应该是Mat1f
(即Mat_<float>
,类型为CV_32FC1
)或Mat1d
(即Mat_<double>
,类型为CV_64FC1
)
你可以看到CV_8U
既不是CV_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);
【讨论】:
我现在明白了。我现在需要更多地了解 OpenCV 中的格式。非常感谢【参考方案2】:您使用的是CV_32FC1
,而不是CV_32F
。查看this answer 以了解差异。我想如果你把它改成CV_32F
它应该可以工作。
【讨论】:
以上是关于opencv矩阵伪逆失败的主要内容,如果未能解决你的问题,请参考以下文章