我确实有两组点,我想找到它们之间的最佳变换。在OpenCV中,您有以下函数:
Mat H = Calib3d.findHomography(src_points, dest_points);
返回一个3x3的单应矩阵,使用RANSAC。我现在的问题是,我只需要平移和旋转(&也许是比例),我不需要仿射和透视。
问题是,我的点只是二维的
(1)是否有一个函数可以计算类似于单应性但自由度更小的东西?
(2)如果不存在,是否可以从3x3单应矩阵中提取一个只平移和旋转的3x3矩阵?
提前感谢您的帮助!
Isa
OpenCV estimateRigidTransform函数正是你所需要的:它返回平移,旋转和缩放(使用false值为fulllafine标志)。并且它确实使用RANSAC(请参阅源代码以确定它)。
专为二维点而设,第三维仅用于在3个昏暗的同质坐标中投射点并执行透视效果。你总是可以将点数转换回来:
齐次[x, y, w]笛卡尔[x/w, y/w]
然而,由于你计算6DOF而不是4DOF(相似性),你的结果与你期望的4DOF非常不同。更灵活的转换将在RANSAC中适应更多的点,代价是您所关心的转换中的扭曲。底线-不要试图分解H,而是拟合相似或等距(也称为刚性或欧几里得)。它们在库中缺席的原因是-即使在点坐标中使用正确的最小二乘度量,它们也以封闭形式表示,因此不需要非线性优化。换句话说,它们非常简单。
如果你只有旋转和平移,我写了一个快速的函数来找到它们(没有RANSAC)。它可能类似于rigidTransform,但更容易理解(希望如此)https://stackoverflow.com/a/18091472/457687
对于缩放,仍然有一个封闭形式的解决方案,但平移和缩放的公式略有不同。参见学习相似参数,第25页