使用 OpenCVs findTransformECC 查找应用于 OpenCVs warpAffine 的仿射变换不会像使用的那样返回相同的扭曲矩阵
Using OpenCVs findTransformECC to find the affine transformation applied with OpenCVs warpAffine does not give the same warp matrix back like used
我目前正在尝试对函数 findtranfromECC (http://docs.opencv.org/3.0-beta/modules/video/doc/motion_analysis_and_object_tracking.html#findtransformecc) 的 OpenCVs 实现进行一种自测。
为此,我自己创建了一个扭曲矩阵,并使用OpenCV提供的函数warpAffine进行仿射变换。
在仿射变换之后,我使用仿射变换的输入和 TransfromECC 函数中的变形输出。我希望我能得到与我在仿射变换中使用的矩阵相同的矩阵,遗憾的是它有很大不同——这是一个完全不同的矩阵。
在我放在 post 末尾的代码示例中,我得到了以下用于进行仿射变换的矩阵:
[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]
计算的扭曲矩阵特征值:
[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;
用给定的 OpenCV 函数对矩阵求逆给出了正确的解。
我目前正在尝试对函数 findtranfromECC (http://docs.opencv.org/3.0-beta/modules/video/doc/motion_analysis_and_object_tracking.html#findtransformecc) 的 OpenCVs 实现进行一种自测。
为此,我自己创建了一个扭曲矩阵,并使用OpenCV提供的函数warpAffine进行仿射变换。 在仿射变换之后,我使用仿射变换的输入和 TransfromECC 函数中的变形输出。我希望我能得到与我在仿射变换中使用的矩阵相同的矩阵,遗憾的是它有很大不同——这是一个完全不同的矩阵。
在我放在 post 末尾的代码示例中,我得到了以下用于进行仿射变换的矩阵:
[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]
计算的扭曲矩阵特征值:
[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;
用给定的 OpenCV 函数对矩阵求逆给出了正确的解。