我目前正在尝试对函数findtranfromECC(http://docs.opencv.org/3.0-beta/modules/video/doc/motion_analysis_and_object_tracking.html#findtransformecc)的OpenCVs实现进行一种自测试。
为此,我自己创建一个warp-matrix,并使用OpenCV给出的函数warpAffine进行仿射变换。 在仿射变换之后,我使用仿射变换的输入和TransfromECC函数中的变形输出。我希望我会像在仿射变换中那样得到相同的矩阵,遗憾的是它差别很大 - 它是一个完全不同的矩阵。
在帖子末尾的代码示例中,我得到了以下用于进行仿射变换的矩阵:
[0.850332161003909,0.1778601204261232,0] [-0.06752637272097255,0.3701713812908899,712.799877929688]
但是,通过findTransformECC计算的Matrix是:
[1.0151283,-0.0033983635,-5.6531301]
[-0.023056569,1.038756,-8.7541409]
我还比较了特征值:
进行仿射变换:
[127021.1755113913]
[0]
Calulated Warp-Matrix特征值:
[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 :(得分:0)
使用给定的OpenCV函数反转矩阵给出了正确的解决方案。