OpenCV使用solvePnPRansac找到具有非对应点的对象的位置

时间:2014-02-17 20:00:02

标签: python c++ opencv

我试图通过跟踪物体上已知的2D LED图案来找到物体相对于实际坐标中相机位置的位置。

我做了相机校准。我能够成功检测到图案中的LED,并在图像框中找到它们的精确坐标。然而,这些点与图案中的已知坐标不完全对应,它们是随机顺序。这些函数在solvePnPRansacfindHomography等函数中很重要,这将是我的第一选择。

如何找到这些点集之间的对应关系,或者我应该使用其他函数来计算转换,就像solvePnPRansac一样?

1 个答案:

答案 0 :(得分:1)

由于您没有询问估算物体与相机之间相对姿势的方法,我将把这个主题放在一边,重点介绍找出每个LED与2D投影之间的对应关系的方法。

为了获得唯一的1对1对应设置,您使用的LED模式应该在旋转方面明确无误。例如,您可以使用常规NxN网格,左上角的单元格包含一个额外的LED,或者位于圆圈上的LED,一个额外的LED位于单个的下面,等等。然后,找到对应关系的方法取决于模式你选择了。

如果是圆形图案,您可以执行以下操作:

  1. 估算点的重心
  2. 找到消除歧义的点,这是唯一一个不在圆上的点,并将其他点中最接近的点定义为第一个观察点
  3. 通过增加相对于重心的角度(即顺时针顺序)来对剩余点进行排序
  4. 对于常规网格图案,您可以尝试以下操作:

    1. 找到网格的四个角(具有最小/最大坐标的那些角落)
    2. 估计将这四个角转换为常规NxN方角(具有正交角)的单应性
    3. 使用此单应性转换其他点
    4. 找出消除歧义的点,这是唯一一个X-floor(X)Y-floor(Y)接近0.5的点,并将四个初始角中最近的一个定义为第一个观察点
    5. 通过相对于网格中心增加角度并减少到网格中心的距离来对剩余点进行排序
    6. 您还可以研究函数findChessboardCorners使用的算法(请参阅calib3D模块中的calibinit.cpp),该算法使用类似的方法对检测到的角进行排序。