Использование OpenCVs findTransformECC для поиска аффинного преобразования, примененного с OpenCVs warpAffine не возвращает ту же матрицу деформации обратно, как использованная

В настоящее время я пытаюсь сделать своего рода самотестирование реализации OpenCV функции findtranfromECC (http://docs.opencv.org/3.0-beta/modules/video/doc/motion_analysis_and_object_tracking.html#findtransformecc ).

Для этого я сам создаю матрицу деформации и выполняю аффинное преобразование с помощью функции warpAffine, предоставленной OpenCV.
После аффинного преобразования я использую вход аффинного преобразования и деформированный выход в функции TransfromECC. Я надеялся, что вернусь к той же матрице, которую использовал в аффинном преобразовании, но, к сожалению, она сильно отличается — она ​​совершенно другая.

В примере кода, который я поместил в конце поста, я получил следующую матрицу для создания аффинного преобразования:

[0.850332161003909, 0.1778601204261232, 0] [-0,06752637272097255, 0,3701713812908899, 712,799877929688]

Но вычисленная Матрица по findTransformECC имеет вид:

[1,0151283, -0,0033983635, -5,6531301] [-0,023056569, 1,038756, -8,7541409]

Я также сравнил собственные значения:

Для выполнения аффинного преобразования:

[+127021,1755113913] [0]

Вычисленные собственные значения матрицы деформации:

[2.945044] [0]

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

Я ценю всякую помощь

Point2f srcTri[3];
Point2f dstTri[3];
float scale = (float)1 / (float)255;

//Matri for first affine transform
Mat warp_mat(2, 3, CV_32FC1);
//Matrix for back affine transform
Mat warp_mat2 = Mat::eye(2, 3, CV_32FC1);Mat src, warp_dst, warp_rotate_dst;//Get Image from Image class and convert it to 8 bit which is used by
//findtransfromsEcc
this->DemosaicedDestination.convertTo(src, CV_8UC1, scale, 0);//container for warp destination
warp_dst = Mat::zeros(src.rows, src.cols, CV_8UC1);//Points for warp matrix
srcTri[0] = Point2f(0, 0);
srcTri[1] = Point2f(src.cols - 1, 0);
srcTri[2] = Point2f(0, src.rows - 1);

dstTri[0] = Point2f(src.cols*0.0, src.rows*0.33);
dstTri[1] = Point2f(src.cols*0.85, src.rows*0.25);
dstTri[2] = Point2f(src.cols*0.15, src.rows*0.7);//get the affine transformation warp mat
warp_mat = getAffineTransform(srcTri, dstTri);
//Do the affine transformation
warpAffine(src, warp_dst, warp_mat, warp_dst.size());

//show affine transformation
imshow("src", src);
waitKey(0);

cout << "warp matrix used: " << warp_mat << endl;
namedWindow("warped to ", WINDOW_NORMAL);
imshow("warped to",warp_dst);

TermCriteria criteria(TermCriteria::COUNT + TermCriteria::EPS, 2500, 1e-1);
try{
this->cc = findTransformECC(warp_dst, src, warp_mat2, MOTION_AFFINE, criteria);
}
catch (Exception& e){
const char* err_msg = e.what();
cout << err_msg;
return false;
}//Do the affine transformation back
warpAffine(warp_dst, src, warp_mat2, src.size());//show backwarded afine transform
namedWindow("back warped transform", WINDOW_NORMAL);
imshow("back warped transform", src);
waitKey(0);//show calculated matrix, should be the same was warp matrix used
cout << "calculated warp matrix 1 " << warp_mat2 << endl;

0

Решение

Обращение матрицы с заданной функцией OpenCV дало правильное решение.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]