Объедините две матрицы аффинных преобразований в OpenCV

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

Как мне их умножить?

AB or BA ?

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

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

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


person Kev1n91    schedule 28.10.2016    source источник
comment
Ни один из них не должен быть транспонирован. Добавьте третий ряд. Порядок умножения зависит от вашего сценария.   -  person Nico Schertler    schedule 28.10.2016
comment
это имеет значение и зависит от последовательности, какое преобразование должно быть выполнено первым. Но имейте в виду, что аффинные преобразования 2x3 не могут быть умножены таким образом, вам сначала придется расширить их до матриц 3x3, добавив строку 0 0 1 внизу. После этого вы вычисляете C = BA, если вы хотите выполнить A до B, или C = AB, если вы хотите выполнить B сначала.   -  person Micka    schedule 28.10.2016
comment
Спасибо, это сработало. Но OpenCV не предоставляет для этого никаких функций?   -  person Kev1n91    schedule 28.10.2016
comment
вы могли бы легко написать небольшую функцию, которая неявно умножает две аффинные матрицы 2x3 без добавления дополнительной строки. Может быть, где-то в openCV скрыта такая функция, но если я этого не знаю...   -  person Micka    schedule 28.10.2016
comment
в 2012 году похоже, что не было... встроенная функция для объединения аффинных преобразований в opencv">stackoverflow.com/questions/13557066/   -  person Micka    schedule 28.10.2016
comment
@Micka, ты хочешь оставить свой комментарий в качестве ответа, чтобы я мог его принять?   -  person Kev1n91    schedule 23.01.2017
comment
Конечно, я сделаю - я просто хотел отдать тебе должное   -  person Kev1n91    schedule 23.01.2017
comment
@Micka Я так и сделал, спасибо за ваши идеи   -  person Kev1n91    schedule 06.02.2017


Ответы (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;
}
person Kev1n91    schedule 27.01.2017
comment
измените mul_r = mul1*mul2; на mul_r = mul2*mul1;, что является правильной операцией на 1. warpaffine(первый мат) 2. warpaffine(мат второй) - person Peter Zhu; 01.11.2017