Opencv变换图像

Opencv变换图像,opencv,transform,Opencv,Transform,我是新打开Cv,我想转换两个图像src和dst图像。我使用cv::EstimaterialGidTransform()计算转换矩阵,然后使用cv::warpAffine()从dst转换到src。当我比较新变换图像和src图像时,它几乎是相同的(变换),但是当我得到新变换图像和src图像的abs差异时,有很多差异。我应该怎么做,因为我的dst图像也有一些旋转和平移因子。这是我的密码 cv::Mat transformMat = cv::estimateRigidTransform(src, dst

我是新打开Cv,我想转换两个图像src和dst图像。我使用
cv::EstimaterialGidTransform()
计算转换矩阵,然后使用
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);
Src图像

目的地图像

输出图像

绝对差分图像


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

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

如果在两幅图像上应用变换,OpenCV首先使用一些内部方法查找匹配的点对(请参见)

然后根据给定的变换矩阵将src图像变换为dst。但任何(几乎任何)转型都是亏损操作。算法必须估计一些数据,因为它们不可用。此过程称为插值,使用已知信息计算未知值。有关图像缩放的一些信息,请访问。同样的规则也适用于其他变换-旋转、倾斜、透视。。。显然这不适用于翻译

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

结论:
你得到的结果很好,如果你记住,这是自动化过程的结果。如果你想要更好的结果,你必须找到另一种方法来选择相应的点。或者使用更好的插值方法。无论哪种方式,转换后,差异都不会为0。实际上不可能做到这一点,因为位图是离散的像素网格,所以总会有一些间隙,需要进行估计

首先,你到底想要实现什么?当然,在进行一般变换时,abs差异将为非零。即使是1度的旋转变化也会因为像素插值而引起很大的变化。您好,jnovacho,我想用opencvI校正图像,但仍然没有看到问题。我觉得你的代码很好。你能提供一些截图吗?源图像和目标图像以及输出图像。另外,还有一个问题,我如何在应用扭曲仿射之前设置旋转中心?你好,jnovacho,你能告诉我如何在应用扭曲仿射之前设置旋转中心吗,实际上,它是从左上角旋转的,而在立体图像中,大部分时间是从中心旋转的。谢谢,有个陷阱。所有变换都与原点[0,0]有关。这里的诀窍是将所需的中心平移到原点,进行旋转并向后平移。这里有一些关于矩阵变换的信息,但我认为这在OpenCV中不起作用,因为在负坐标中会丢失数据。而且我觉得你真的不需要这个。函数在内部处理此问题,它转换图像以使对应点匹配。您好,您能告诉我在“cv::EstimaterialGidTransform()”函数的后端实现了什么技术吗?对不起,我不知道(但您可以深入源代码并找到答案。)我猜他们正在使用cv::GoodFeatures跟踪两幅图像,然后运行一些计算以获得转换矩阵。