Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Opencv中仅使用平移、旋转和缩放计算单应性_Opencv_Matrix_Transformation_Ransac - Fatal编程技术网

在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单应用于二

我有两组点,我想找到它们之间的最佳转换。 在OpenCV中,您具有以下功能:

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或其他异常值控制)。但这只是一个猜测。原则上,刚性变换正是您所要求的。下面是一个如何组织点采样以将其用于该函数的示例:源代码在这里-