使用invert()或inv()反转opencv中的矩阵时的运行时错误

时间:2012-04-08 15:43:17

标签: c++ opencv matrix-inverse

我正在尝试在opencv中反转矩阵。没有构建错误,但我在未知函数,文件.. \ .. \ .. \ .. \ ocv \ opencv \ modules \ core \ src \ lapack.cpp中得到“不支持的格式或格式组合()”,第1469行“,这对我理解我做错了什么并没什么帮助。 我正在使用以下代码:

Mat centerPointsMat = Mat(5, 3, CV_32SC2);
Mat centerPointsMatInv = Mat(5, 3, CV_32SC2);
for(int i=0; i<5; i++)
{
    Point p1=Point(0,i);
    centerPointsMat.at<float>(p1) = ((CvPoint*)CV_GET_SEQ_ELEM(CvPoint,centerPointsSeq,i))->x^2;
    Point p2=Point(1,i);
    centerPointsMat.at<float>(p2) = ((CvPoint*)CV_GET_SEQ_ELEM(CvPoint,centerPointsSeq,i))->x;
    Point p3=Point(2,i);
    centerPointsMat.at<float>(p3) = 1;
}
centerPointsMatInv = centerPointsMat.inv(1);

使用invert()而不是inv()会产生相同的结果。

我错过了什么?

感谢。

3 个答案:

答案 0 :(得分:4)

只有非奇异,正方形,正定矩阵才能反转..

有关详细信息,请参阅this page

答案 1 :(得分:2)

像这里指出的vasile一样,invert()只支持double或float矩阵类型。将我的矩阵类型从CV_32SC2更改为CV_32FC1似乎已经解决了它。

答案 2 :(得分:0)

必须遵循一些标准来使用简单的invert函数,如前面的答案所指出的那样。首先,矩阵必须是32浮点型。

但是反转函数可以有一个第三个参数,它是一个标志,用于说明反转背后的算法类型:

DECOMP_LUDECOMP_SVDDECOMP_CHOLESKY是使用的thre类型。

来自opencv-3.0文档:

  

函数invert将矩阵src反转并存储结果   dst。当矩阵src是奇异或非正方形时,函数   计算伪逆矩阵(dst矩阵)使得   norm(src * dst - I)是最小的,其中我是一个单位矩阵。

     

对于DECOMP_LU方法,该函数返回非零值   如果已成功计算逆,则如果src为0则为0   单数。

     

对于DECOMP_SVD方法,该函数返回反转   src的条件数(最小奇异值与...的比率)   最大的奇异值)和0如果src是奇异的。 SVD方法   如果src是单数,则计算伪逆矩阵。

     

与DECOMP_LU类似,方法DECOMP_CHOLESKY仅适用于   非奇异平方矩阵,也应该是对称的   肯定的。在这种情况下,函数存储倒置   dst中的矩阵并返回非零。否则,它返回0.