首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用OpenCVs findTransformECC查找与OpenCVs一起应用的仿射变换,warpAffine不会像已使用的那样返回相同的翘曲矩阵。

使用OpenCVs findTransformECC查找与OpenCVs一起应用的仿射变换,warpAffine不会像已使用的那样返回相同的翘曲矩阵。
EN

Stack Overflow用户
提问于 2016-09-02 09:04:48
回答 1查看 1.2K关注 0票数 0

我目前正在尝试对函数findtranfromECC (tracking.html#findtransformecc )的OpenCVs实现进行一种自我测试。

为此,我自己创建了一个翘曲矩阵,并用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

计算经度矩阵特征值:

2.945044

有没有人有过同样的经历,或者现在是什么导致了这个错误?

我很感谢大家的帮助

代码语言:javascript
运行
复制
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;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-16 13:25:31

用给定的OpenCV函数逆矩阵给出了正确的解。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39288466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档