运行时错误而使用反转()或INV()反转矩阵,在OpenCV中

问题描述:

我试图反转在OpenCV的矩阵。有没有生成错误,但我不断收到格式的“不支持的格式或组合()的未知功能,文件.. \ .. \ .. \ .. \ OCV \ OpenCV的\模块\核心的\ src \ lapack.cpp, 1469行“,这无助于理解我做错了什么。 我使用以下代码:运行时错误而使用反转()或INV()反转矩阵,在OpenCV中

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

同样使用反相()而不是INV()产生相同的结果。

我错过了什么?

谢谢。

+0

你只能倒置一个方阵 - 即使这样你几乎就不会想要(反演经常在数值上很不稳定,所以即使理论上它应该工作,它产生的结果也会赢得'非常准确)。 – 2012-04-08 15:55:27

+0

您需要一个浮动或双重方形矩阵 – Sam 2012-04-09 11:32:39

+1

感谢vasile!将CV_32SC2更改为CV_32FC1似乎解决了这个问题。 – 2012-04-10 07:05:18

只有非奇广场,正定矩阵可以有逆..

请参阅this page更多信息

+1

这一切都是正确的,但是invert()也可以处理奇异非矩形矩阵。以下内容来自http://opencv.willowgarage.com/documentation/cpp/operations_on_arrays.html:“当矩阵src是单数或非方形时,函数计算伪逆矩阵,即矩阵dst,使得是最小的...在DECOMP_SVD方法的情况下,函数返回src的反转条件数(最小奇异值与最大奇异值的比值),如果src是奇异值,则返回0 SVD方法计算伪逆矩阵如果src是奇异的。“ – 2012-04-10 06:56:10

+0

这种情况在这种情况下是错误的。 OpenCV提供了伪逆矩阵。 – Kev1n91 2017-01-24 12:19:35

+0

对于单数,伪逆不等于逆。如果非单数你不需要伪。 – 2017-01-25 10:26:30

像瓦西里在这里指出,反转()只支持双或浮动矩阵类型。改变从CV_32SC2到CV_32FC1我的矩阵型似乎已经解决了这个问题。

有一些性判据有要遵循使用简单invert功能的由以前的答案指出。首先,矩阵必须是32浮点型。

但反向功能可以有第三个参数,它是一个标志,告诉什么样的反转背后的算法完成:

DECOMP_LUDECOMP_SVDDECOMP_CHOLESKY是使用THRE类型。

从OpenCV的-3.0文档:

功能倒置倒置矩阵src和将结果存储在 DST。当矩阵src是单数或非正方形时,函数 计算伪逆矩阵(dst矩阵),以使标准(src * dst-I)最小,其中I是单位矩阵。

在DECOMP_LU方法的情况下,函数返回非零值 (如果逆已成功计算),如果src为 则返回0单数。

在DECOMP_SVD方法的情况下,函数返回src的条件数(最小奇异值与最大奇异值的比值)的逆 ,如果src是奇异值,则返回0。如果src的奇异SVD方法 计算伪逆矩阵。

与DECOMP_LU类似,DECOMP_CHOLESKY方法仅适用于 非奇异方阵,它们也应该是对称的,并且 是正定义的。在这种情况下,函数将反转的 矩阵存储在dst中,并返回非零值。否则,它返回0.