运行时错误而使用反转()或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()产生相同的结果。
我错过了什么?
谢谢。
只有非奇广场,正定矩阵可以有逆..
请参阅this page更多信息
这一切都是正确的,但是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
这种情况在这种情况下是错误的。 OpenCV提供了伪逆矩阵。 – Kev1n91 2017-01-24 12:19:35
对于单数,伪逆不等于逆。如果非单数你不需要伪。 – 2017-01-25 10:26:30
像瓦西里在这里指出,反转()只支持双或浮动矩阵类型。改变从CV_32SC2到CV_32FC1我的矩阵型似乎已经解决了这个问题。
有一些性判据有要遵循使用简单invert
功能的由以前的答案指出。首先,矩阵必须是32浮点型。
但反向功能可以有第三个参数,它是一个标志,告诉什么样的反转背后的算法完成:
DECOMP_LU
,DECOMP_SVD
和DECOMP_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.
你只能倒置一个方阵 - 即使这样你几乎就不会想要(反演经常在数值上很不稳定,所以即使理论上它应该工作,它产生的结果也会赢得'非常准确)。 – 2012-04-08 15:55:27
您需要一个浮动或双重方形矩阵 – Sam 2012-04-09 11:32:39
感谢vasile!将CV_32SC2更改为CV_32FC1似乎解决了这个问题。 – 2012-04-10 07:05:18