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_Computer Vision - Fatal编程技术网

Opencv 如何提高单应性的准确性?

Opencv 如何提高单应性的准确性?,opencv,computer-vision,Opencv,Computer Vision,我使用OpenCV的cv::findHomographyAPI来计算两个平面图像的单应矩阵。 通过SIFT提取匹配的关键点,并通过BFMatcher进行匹配。据我所知,cv:findHomography使用RANSAC迭代找出最佳的四个对应点,从而得到单应矩阵。 因此,我使用对象边缘的同调矩阵,用计算出的轮廓绘制选定的四对点。 结果如下: 如我们所见,RANSAC选择的匹配点是正确的,但轮廓显示单应性不准确 但这些测试表明,所选匹配点和单应性都是正确的: 我的猜测是,如果选择的匹配点太接近,

我使用OpenCV的
cv::findHomography
API来计算两个平面图像的单应矩阵。 通过SIFT提取匹配的关键点,并通过BFMatcher进行匹配。据我所知,
cv:findHomography
使用RANSAC迭代找出最佳的四个对应点,从而得到单应矩阵。 因此,我使用对象边缘的同调矩阵,用计算出的轮廓绘制选定的四对点。 结果如下:

如我们所见,RANSAC选择的匹配点是正确的,但轮廓显示单应性不准确

但这些测试表明,所选匹配点和单应性都是正确的:

我的猜测是,如果选择的匹配点太接近,像素位置的小误差将导致单应矩阵的显著误差。如果四个点位于图像的角点,则匹配点的偏移4-6个像素仍然得到良好的单应矩阵。 (根据同质坐标,我认为是合理的,因为近平面的小误差会在远平面放大)

我的问题是:

我猜对了吗?
2.由于四个匹配点由RANSAC迭代生成,因此所有关键点的总体误差最小。但如何得到稳定的单应,至少使轮廓的映射是正确的?理论证明,如果找到平面上的四个对应点,则应计算单应矩阵,但工程工作中是否存在任何技巧?

我认为你是对的,并且这四个点的接近度对结果的准确性没有帮助。您观察到的可能是由数值问题引起的:对于这4个点,结果可能是局部正确的,但进一步分析会变得更糟

然而,RANSAC不会在这里帮助你。原因很简单:RANSAC是一种稳健的估计过程,旨在从许多对应(包括一些错误的对应)中找到最佳点对。然后,在RANSAC的内环中,执行标准单应估计

您可以将RANSAC看作是一种拒绝错误点通信的方法,这种方法会导致不良结果

回到你的问题:

你真正需要的是获得更多的分数。在您的示例中,仅使用4点对应,这刚好足以估计单应性。 通过在目标图像上提供更多匹配项,您将提高结果。然后问题变得过于确定,但OpenCV仍然可以找到最小二乘解。此外,由于在点对应过程或某些点定位中存在一些错误,RANSAC将能够选择最好的,并且仍然为您提供可靠的结果

如果RANSAC导致在大约4个点上过度拟合(在您的示例中似乎是这样),请尝试通过增加
ransacreprojectthreshold
参数来放松约束。 或者,您可以:

  • 使用不同的估计器(如果匹配错误很少,则稳健中值
    CV_LMEDS
    是一个不错的选择)
  • 或者在第一步中使用RANSAC(获得粗略估计),以检测虚假匹配,然后在正确的匹配上使用LMED

我同意@sansuiso的回答:

如果您向RANSAC提供了大约100封信函,那么您可能从
cvFindHomography
中获得了超过4个内联。检查
状态
输出参数。 要获得良好的单应性,您应该有4个以上的对应关系(注意,4个对应关系始终为您提供单应性),这些对应关系在图像周围均匀分布,并且不是线性的。实际上,您可以使用最少数量的内联线来决定获得的单应性是否足够好

请注意,RANSAC找到了一组一致的点,但它必须指出该点是最佳点(重投影错误)的方式有点有限。有一种类似RANSAC的方法,叫做MSAC,它使用了一种稍微不同的误差测量方法,请检查一下

根据我的经验,坏消息是在大多数情况下不太可能获得100%精度的单应性。如果有几个相似的帧,则可能会看到它们之间的单应性略有变化


有一些技巧可以改进这一点。例如,在使用RANSAC获得单应性后,您可以使用它将模型投影到图像中,并查找新的对应关系,这样您就可以找到另一个更精确的单应性。

您的目标具有许多对称和类似的元素。正如其他人提到的(稍后您会澄清),点间距和点编号可能是一个问题。另一个问题是,SIFT的设计并不是为了处理案例中存在的重大视角扭曲。尝试通过较小的旋转来跟踪对象,如前所述,使用最新的单应性重新投影对象,使其看起来尽可能接近原始对象。这也将允许您跳过重筛选处理,并使用轻量级和快速的图像块相互关联进行匹配

你也可能最终会明白,仅仅使用点是不够的。你必须使用所有你得到的,这意味着直线或二次曲线。如果单应变换点Pb=H*Pa,则很容易在齐次坐标系中验证线Lb=Henv.transposed*La。这直接来自方程式La'.Pa=0=La'*Hinv*H*Pa=La'*Hinv*Pb=Lb'.Pb 可能的最小配置为1线3点或3线1点。两条线和两个点不起作用。您也可以使用四条线或四个点。c的