Opencv转换图像

Mud*_*sar 5 opencv transform

我是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图像

在此输入图像描述

目的地图片

在此输入图像描述

输出图像

在此输入图像描述

绝对差异图像

在此输入图像描述

谢谢

jno*_*cho 5

你对这个过程有一些误解。

方法cv::estimateRigidTransform将两组对应点作为输入。然后求解方程组以找到变换矩阵。转换的输出将 src 点匹配到 dst 点(精确或接近,如果不可能精确匹配 - 例如浮点坐标)。

如果您在两个图像上应用estimateRigidTransform,OpenCV 首先使用一些内部方法找到匹配的点对(请参阅opencv 文档)。

cv::warpAffine然后根据给定的转换矩阵将 src 图像转换为 dst。但是任何(几乎任何)转换都是损失操作。该算法必须估计一些数据,因为它们不可用。此过程称为插值,使用已知信息计算未知值。一些关于图像缩放的信息可以在wiki上找到。相同的规则适用于其他变换——旋转、倾斜、透视……显然这不适用于平移。

鉴于您的测试图像,我猜想 OpenCV 以灯罩为参考。从差异中可以看出,灯罩的改造效果最好。默认情况下,OpenCV 使用线性插值进行变形,因为它是最快的方法。但是您可以设置更多高级方法以获得更好的结果 - 再次咨询opencv 文档

结论:你得到的结果非常好,如果你记住,这是自动化过程的结果。如果你想要更好的结果,你必须找到另一种选择对应点的方法。或者使用更好的插值方法。无论哪种方式,在转换之后,diff 都不会是 0。这几乎不可能实现,因为位图是像素的离散网格,所以总会有一些间隙,需要估计。