2012-04-08 1 views
1

opencvで行列を反転しようとしています。ビルドエラーはありませんが、未知の関数、ファイル.. \ .. \ .. \ .. \ ocv \ opencv \ modules \ core \ src \ lapack.cppにはサポートされていないフォーマットやフォーマットの組み合わせ()私が間違っていることを理解するのにあまり役立たない1469行目。 私は次のコードを使用しています:代わりに、INVのopencvで行列を反転するためにinvert()またはinv()を使用しているときにランタイムエラーが発生する

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

同じ使用して反転は、()()と同じ結果を生成します。

私には何が欠けていますか?

ありがとうございました。

+0

逆行列は反転することができますが、ほとんどの場合は逆もありません(反転は数値的には非常に不安定であることが多いため、理論的には動作しなくても、 tは非常に正確です)。 –

+0

浮動小数点または二重の正方行列が必要 – Sam

+1

おかげでvasile!CV_32SC2をCV_32FC1に変更することで解決されたようです。 –

答えて

4

のみ非単数、正方形、正定値行列が逆行列を持つことができます。..

バシレなどのようなより多くの情報

+1

これはすべて正しいですが、invert()は単数の非正方行列を扱うこともできます。以下はhttp://opencv.willowgarage.com/documentation/cpp/operations_on_arrays.htmlからのものです: "行列srcが特異行列または非正方行列のとき、この関数は擬似逆行列、すなわち行列dstを計算します。最小値... DECOMP_SVDメソッドの場合、srcの逆の条件番号(最小の特異値と最大の特異値の比)が返され、srcが特異な場合は0が返されます.SVDメソッドは、 srcが単数形の場合は行列。 " –

+0

この文脈では、このアンカーは間違っています。 OpenCVは疑似逆行列を提供します。 – Kev1n91

+0

疑似逆行列は、単項式の逆行列と等しくありません。非特異的な場合は疑似を必要としません。 –

2

ためthis pageを参照してくださいここでの唯一の二重またはフロートマトリックスタイプをサポートしています)(反転し、指摘しました。私の行列型をCV_32SC2からCV_32FC1に変更すると、それが解決されたようです。

0

単純なinvert関数を以前の回答で指摘したように使用するには、いくつかの基準があります。まず、行列は32-float型でなければなりません。行われている反転の背後にあるアルゴリズムの種類を告げる

しかし、反転機能がフラグである三番目のパラメータを持つことができ、:

DECOMP_LUDECOMP_SVDDECOMP_CHOLESKYが使用THREタイプです。 OpenCVの-3.0のドキュメントから

機能の反転は、行列srcを反転させ 、結果をdstに格納します。行列srcが特異行列または非正方行列の場合、関数 は、 ノルム(src * dst - I)が最小になるように擬似逆行列(dst行列)を計算します。ここで、Iは単位行列です。

DECOMP_LUメソッドの場合、この関数は逆数が正常に計算された場合は0以外の値 を返し、srcが の場合は0を返します。

DECOMP_SVDメソッドの場合、この関数は逆の src(最小特異値と の最大特異値の比)を返します。srcが単数の場合は0を返します。 SVD方法 は、srcが特異である場合に擬似逆行列を計算します。

DECOMP_LUと同様に、DECOMP_CHOLESKYメソッドは、対称であるべき の非特異正方行列のみを使用し、 を積極的に定義する必要があります。この場合、関数は逆行列 をdstに格納し、非ゼロを返します。

関連する問題