2016-10-28 10 views
2

Ich habe zwei 2x3 Matrizen A und B - jedes ist für affine Transformation. Ich muss A und B zu einer dritten Matrix C kombinieren, die die affine Transformation von A und B in eine Matrix kombiniert.Kombiniere zwei affine Transformationsmatrizen in OpenCV

Wie muss ich sie multiplizieren?

A B oder B A?

Der Unterschied ist, dass entweder A oder B transponiert wird, oder macht es überhaupt einen Unterschied?

Ich lese eine weitere Lösung ist, 3x3 Matrizen zu verwenden und in die ersten beiden Zeilen zu kopieren und nur die ersten beiden Zeilen im Ergebnis zu verwenden. Aber es kommt auf die gleiche Frage, ob es eine einfache Möglichkeit gibt, dies in OpenCV zu implementieren, oder muss ich jeden Schritt wie oben beschrieben implementieren?

+3

Keiner umgesetzt werden sollte. Fügen Sie eine dritte Zeile hinzu. Die Multiplikationsreihenfolge hängt von Ihrem Szenario ab. –

+2

Es macht einen Unterschied und hängt von der Reihenfolge ab, welche Transformation zuerst durchgeführt werden sollte. Aber hüte dich davor, dass 2x3 affine Transformationen nicht auf diese Weise multipliziert werden können, du musst sie zuerst auf 3x3 Matrizen erweitern, indem du unten eine 0 0 1 Zeile hinzufügst. Danach berechnen Sie C = BA, wenn Sie A vor B oder C = AB ausführen möchten, wenn Sie B zuerst ausführen möchten. – Micka

+0

Danke, das hat funktioniert. Aber OpenCV bietet keine Funktion dafür? – Kev1n91

Antwort

1

Die folgende Funktion kombiniert diese beiden Matrizen:

Mat AffineTransform::concatenateMatrix(Mat first, Mat second){ 

     Mat mul1 = Mat::eye(3, 3, CV_64F); 
     Mat mul2 = Mat::eye(3, 3, CV_64F); 
     Mat x_; 
     Mat temp_inv_; 
     Mat mul_r; 
     first.convertTo(temp_inv_, CV_64F); 
     second.convertTo(x_, CV_64F); 

     temp_inv_.row(0).copyTo(mul1.row(0)); 
     temp_inv_.row(1).copyTo(mul1.row(1)); 

     x_.row(1).copyTo(mul2.row(1)); 
     x_.row(0).copyTo(mul2.row(0)); 

     try{ 
      mul_r = mul1*mul2; 
     } 
     catch (Exception& e){ 
      const char* err_msg = e.what(); 
      cout << err_msg; 
     } 

     mul1.release(); 
     mul2.release(); 
     temp_inv_.release(); 

     return mul_r; 
} 
+0

ändern 'mul_r = mul1 * mul2;' zu 'mul_r = mul2 * mul1;', die ist die korrekte Operation zu * 1. Warpaffine (Mat firfirst) 2. Warpaffine (Mat second) * –

Verwandte Themen