使用opencv surf在两个图像之间移位

时间:2014-03-24 04:33:18

标签: c++ opencv

我正在使用OPENCV进行图像处理。 我想在OPENCV中找到两个图像之间的x,y和旋转位移。 我已经使用SURF找到了图像的功能,并且功能已经匹配。 现在我想找到图像之间的位移。我怎么做? RANSAC能在这里有用吗?

的问候, shiksha

1 个答案:

答案 0 :(得分:1)

旋转和两个平移是三个未知数,因此您的最小匹配数是两个(因为每个匹配提供两个方程或约束)。实际上,想象一个图像中两个点之间的线段和另一个图像中的相应(匹配)线段。段的方向之间的差异为您提供旋转角度。旋转后,只需使用任何匹配的点即可找到翻译。因此这是需要两点的3DOF问题。它被称为欧几里德变换或刚体变换或正交Procrustes。

使用没有紧密形式解决方案且依赖于非线性优化的Homography(即8DOF问题)是一个坏主意。它很慢(在RANSAC案例中)并且不准确,因为它增加了5个额外的DOF。只有你有异常值才需要RANSAC。在纯噪声和超限系统(超过2个点)的情况下,最小化匹配点之间几何距离平方和的最优解通过以下形式给出:

问题陈述:min([R * P + t-Q] 2 ,R-旋转,t-平移
解决方案:R = VU T ,t = R * Pmean-Qmean
其中X = P-Pmean; Y = Q-Qmean,我们用SVD得到X * Y T = ULV T ;所有矩阵都将数据点作为列。有关刚性转换的简要介绍,请参阅this