我正在尝试在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()会产生相同的结果。
我错过了什么?
感谢。
答案 0 :(得分:4)
只有非奇异,正方形,正定矩阵才能反转..
有关详细信息,请参阅this page
答案 1 :(得分:2)
答案 2 :(得分:0)
必须遵循一些标准来使用简单的invert
函数,如前面的答案所指出的那样。首先,矩阵必须是32浮点型。
但是反转函数可以有一个第三个参数,它是一个标志,用于说明反转背后的算法类型:
DECOMP_LU
,DECOMP_SVD
和DECOMP_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.