1

我正在尝试反转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() 会产生相同的结果。

我错过了什么?

谢谢。

4

3 回答 3

4

只有非奇异、平方、正定矩阵才能有逆矩阵。

请参阅此页面了解更多信息

于 2012-04-08T15:48:58.177 回答
2

就像 vasile 这里指出的那样, invert() 仅支持双精度或浮点矩阵类型。将我的矩阵类型从 CV_32SC2 更改为 CV_32FC1 似乎已经解决了它。

于 2012-04-10T07:08:11.873 回答
0

invert使用先前答案指出的简单功能必须遵循一些标准。首先,矩阵必须是 32 浮点型。

但是 invert 函数可以有第三个参数,它是一个标志,它告诉执行 invert 背后的算法类型:

DECOMP_LU,DECOMP_SVD并且DECOMP_CHOLESKY是使用的三种类型。

从 opencv-3.0 文档:

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

在 DECOMP_LU 方法的情况下,如果逆计算成功,则函数返回非零值,如果 src 是奇异的,则返回 0。

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

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

于 2017-01-25T11:54:49.510 回答