2016-10-28 2 views
2

У меня есть две матрицы 2x3 и B - каждая из них предназначена для аффинной трансформации. Мне нужно объединить A и B в чередующуюся матрицу C, которая объединит аффинное преобразование из A и B в одну матрицу.Объедините две аффинные матрицы трансформаций в OpenCV

Как его использовать для их умножения?

A B или B A?

Разница в том, что либо A, либо B получает транспонирование или вообще имеет какое-либо значение?

Я прочитал еще одно решение - использовать матрицы 3x3 и скопировать в первые две строки и использовать только первые две строки в результате. Но это сводится к тому же вопросу, если это A B или B A.

Кроме того, есть ли простой способ реализовать это в OpenCV или мне нужно реализовать каждый шаг, как описано выше?

+3

Ни один не должен быть перенесены. Добавьте третью строку. Порядок умножения зависит от вашего сценария. –

+2

, он имеет значение и зависит от последовательности, которая должна быть выполнена в первую очередь. Но будьте осторожны, что 2x3 аффинные преобразования не могут быть умножены таким образом, вам сначала нужно расширить их до 3x3 матриц, добавив 0 0 1 строку внизу. После этого вы вычисляете C = BA, если хотите выполнить A до B или C = AB, если вы хотите сначала выполнить B. – Micka

+0

Спасибо, что сработало. Но OpenCV не предоставляет каких-либо функций форта? – Kev1n91

ответ

1

Следующая функция объединяет эти две матрицы:

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

change 'mul_r = mul1 * mul2;' to 'mul_r = mul2 * mul1;', который это правильная операция для * 1. warpaffine (Mat firirst) 2. warpaffine (Mat second) * –

Смежные вопросы