2012-04-08 84 views
1

我試圖反轉在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

回答

4

只有非奇廣場,正定矩陣可以有逆..

請參閱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

2

像瓦西里在這裏指出,反轉()只支持雙或浮動矩陣類型。改變從CV_32SC2到CV_32FC1我的矩陣型似乎已經解決了這個問題。

0

有一些性判據有要遵循使用簡單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.