我是Open Cv的新手,我想要转换两个图像src和dst图像.我cv::estimateRigidTransform()用来计算变换矩阵,之后使用cv::warpAffine()从dst变换到src.当我将新的变换图像与src图像进行比较时,它几乎相同(变换),但是当我得到新变换图像和src图像的abs差异时,会有很多不同.我该怎么办,因为我的dst图像也有一些旋转和平移因子.这是我的代码
cv::Mat transformMat = cv::estimateRigidTransform(src, dst, true);
cv::Mat output;
cv::Size dsize = leftImageMat.size(); //This specifies the output image size--change needed
cv::warpAffine(src, output, transformMat, dsize);
Run Code Online (Sandbox Code Playgroud)
Src图像

目的地图片

输出图像

绝对差异图像

谢谢
你对这个过程有一些误解。
方法cv::estimateRigidTransform将两组对应点作为输入。然后求解方程组以找到变换矩阵。转换的输出将 src 点匹配到 dst 点(精确或接近,如果不可能精确匹配 - 例如浮点坐标)。
如果您在两个图像上应用estimateRigidTransform,OpenCV 首先使用一些内部方法找到匹配的点对(请参阅opencv 文档)。
cv::warpAffine然后根据给定的转换矩阵将 src 图像转换为 dst。但是任何(几乎任何)转换都是损失操作。该算法必须估计一些数据,因为它们不可用。此过程称为插值,使用已知信息计算未知值。一些关于图像缩放的信息可以在wiki上找到。相同的规则适用于其他变换——旋转、倾斜、透视……显然这不适用于平移。
鉴于您的测试图像,我猜想 OpenCV 以灯罩为参考。从差异中可以看出,灯罩的改造效果最好。默认情况下,OpenCV 使用线性插值进行变形,因为它是最快的方法。但是您可以设置更多高级方法以获得更好的结果 - 再次咨询opencv 文档。
结论:你得到的结果非常好,如果你记住,这是自动化过程的结果。如果你想要更好的结果,你必须找到另一种选择对应点的方法。或者使用更好的插值方法。无论哪种方式,在转换之后,diff 都不会是 0。这几乎不可能实现,因为位图是像素的离散网格,所以总会有一些间隙,需要估计。
| 归档时间: |
|
| 查看次数: |
4629 次 |
| 最近记录: |