微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如果将平移部分缩放后,为什么将我从OpenCV findTransformECC派生的仿射变换应用于坐标集,为什么

如何解决如果将平移部分缩放后,为什么将我从OpenCV findTransformECC派生的仿射变换应用于坐标集,为什么

我使用OpenCV findTransformECC注册两个低分辨率图像,效果很好。此后,我想将仿射变换应用于表示图像像素位置的坐标集,以在子像素级别上插入两个图像的叠加层,包括两个图像的放大比例,以获得超分辨率图像。据我所知,findTransformECC使用图像的原点0,0(左上)位置为我提供了旋转和平移信息。我简单地将x,y坐标对生成为2xn Mat,将仿射变换的旋转和平移部分隔离开,然后将坐标mat与旋转矩阵相乘。旋转后,我从仿射变换的平移部分按缩放的tx,ty值移动坐标。

            warp_m.convertTo(warp_m,CV_64F); // converting affine transform to CV_64F 
            hconcat(vector<cv::Mat>{ c,r },coord); // Merge column & row indices into 2xn Mat
            cv::Mat rot = warp_m(Rect(0,2,2)); // isolate rotation part form affine transform
            cv::Mat trans = warp_m(Rect(2,1,2)); // isolate translation part form affine transform

            coord = coord * rot; // rotate indices  

            r = coord(Rect(1,img.width * img.height)) 
            + factor*trans.at<double>(Point(0,1)); // isolate row indices an shift by "factor" scaled y
            c = coord(Rect(0,img.width * img.height))
            + factor*trans.at<double>(Point(0,0)); // isolate col indices an shift by "factor" scaled x

如果我是正确的话,这将导致对我的坐标集进行仿射变换,就像在OpenCV中将warpAffine与注册图像一起使用一样。不幸的是,在应用缩放转换和覆盖图的插值后,两个图像的x,y偏差仍然很小。

作为概念证明,我使用相同的图像,只是将第二个图像移动了-20,-20像素并将其旋转了5度。 OpenCV findTransformECC找到一个很好的近似旋转角度0.087156974(sinα),该值为5.00007082°,并且由于0,0原点88.275993,-136.78032而导致tx,ty的值有些偏离。如果不应用缩放(因数= 1),则插值后,缩放后得到的图像将不再对齐,从而得到了两个图像的完美覆盖。任何提示我做错了什么? Factor four upscale interpolated super resolution image,overlay of 2 identical images

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。