在Opencv中仅使用平移、旋转和缩放计算单应性
我有两组点,我想找到它们之间的最佳转换。 在OpenCV中,您具有以下功能:在Opencv中仅使用平移、旋转和缩放计算单应性,opencv,matrix,transformation,ransac,Opencv,Matrix,Transformation,Ransac,我有两组点,我想找到它们之间的最佳转换。 在OpenCV中,您具有以下功能: Mat H = Calib3d.findHomography(src_points, dest_points); 使用RANSAC返回一个3x3单应矩阵。我现在的问题是,我只需要平移和旋转(可能是缩放),不需要仿射和透视 问题是,我的点只是二维的 (1) 是否有一个函数可以计算类似于单应但自由度较小的东西 (2) 如果没有,是否可以从3x3单应矩阵中提取仅进行平移和旋转的3x3矩阵 提前感谢您的帮助 Isa单应用于二
Mat H = Calib3d.findHomography(src_points, dest_points);
使用RANSAC返回一个3x3单应矩阵。我现在的问题是,我只需要平移和旋转(可能是缩放),不需要仿射和透视
问题是,我的点只是二维的
(1) 是否有一个函数可以计算类似于单应但自由度较小的东西
(2) 如果没有,是否可以从3x3单应矩阵中提取仅进行平移和旋转的3x3矩阵
提前感谢您的帮助
Isa单应用于二维点,第三维仅用于在3维齐次坐标中投射点并执行透视效果。您始终可以将点数向后投射: 齐次[x,y,w] 笛卡尔[x/w,y/w] 然而,由于您计算的是6自由度而不是4自由度(相似性),因此您的结果与您对4自由度的预期非常不同。更灵活的转换将适应RANSAC中更多的点,而代价是您关心的转换中的扭曲。底线-不要试图分解H,而是拟合相似性或等距(也称为刚性或欧几里得)。库中缺少它们的原因是,即使在点坐标中使用正确的最小二乘度量,它们也以闭合形式表示,因此不需要非线性优化。换句话说,它们非常简单 如果你只有旋转和平移,我写了一个快速的函数来查找它们(虽然没有RANSAC)。它可能类似于刚性转换,但更容易理解(希望如此)
对于缩放,仍然有一个封闭形式的解决方案,但用于平移和缩放的公式略有不同。请参见OpenCV函数正是您所需要的:它返回平移、旋转和缩放(对fullAffine标志使用假值)。而且它确实使用了RANSAC(请参阅源代码以确保其正确性)。尝试
EstimaterialGidTransform
:如果EstimaterialGidTransform
不适合您,因为它不使用RANSAC,那么您可能必须对自己的RANSAC进行编程,这并不难。不幸的是,据我所知,openCV只为8自由度同音字提供了忽略异常值的变换优化。嘿,米卡,我尝试了一个新的变换,但它返回了一个大小为0x0的矩阵。参数是两个点集(类型为MatOfPoint2f)和false,因为我只需要平移、旋转和均匀缩放,我自己从未使用过EstimaterialGidTransform
,所以我无法帮助您如何使用它。可能它返回一个空矩阵,因为src/dst点矩阵的格式不正确,或者有太多的异常值阻止了刚性变换的计算(因为该函数不使用RANSAC或其他异常值控制)。但这只是一个猜测。原则上,刚性变换正是您所要求的。下面是一个如何组织点采样以将其用于该函数的示例:源代码在这里-