python ransac_关于python:OpenCV使用带有不对应点的SolvePnPRansac查找对象的位置

我试图通过跟踪对象上的已知2D LED模式来找到对象在现实坐标中相对于相机位置的位置。

我做了相机校准。 我能够成功检测到图案中的LED,并在图像框中找到它们的确切坐标。 但是,这些点与图案中的已知坐标并不完全一对一对应,而是随机排列。 对应关系在诸如solvePnPRansac或findHomography之类的功能中很重要,这将是我的首选。

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

我认为详细说明您面临的问题是一个好主意。 你能举个例子吗?

我想我说清楚了。 我有一个移动机器人,在其顶部有一堆红外LED,它们以某种模式排列。 我想跟踪机器人相对于相机的位置和方向。 我用用于相机校准的棋盘黑白模式尝试了这种方法,并获得了不错的结果。 我想通过使用红外LED来提高跟踪的准确性和速度。 由于我不能再使用findChessboardCorners来返回已排序的点,因此我需要自己找到对应关系。

LED是否可以以任何方式区分? 通过颜色,照明图案还是整体形状?

并不是的。 如果是这样的话,对我来说就足够简单了。 这些LED在图像中显示为白点。 我使用IR通滤镜过滤所有可见光。

由于您没有询问估算物体和相机之间相对姿势的方法,因此,我将不讲这个话题,而将重点放在寻找每个LED及其2D投影之间的对应关系的方法上。

为了获得唯一的1对1对应集,您使用的LED图案在旋转方面应该是明确的。例如,您可以使用规则的NxN网格,其中左上角的单元格包含一个额外的LED,或者位于一个圆圈内的LED,其中一个在单个LED的下方有一个额外的LED,等等。然后,查找对应关系的方法取决于模式您选择了。

对于圆形图案,可以执行以下操作:

估计点的重心

找到歧义点,这是唯一不在圆上的点,并将其他点中最接近的点定义为第一个观察点

通过相对于重心增加角度来排序其余点(即顺时针方向)

对于常规网格模式,可以尝试以下操作:

找到网格的四个角(那些具有最小/最大坐标的角)

估计将这四个角转换为规则NxN正方形(具有正交角)的角的单应性

使用此单应性变换其他点

找到歧义点,这是唯一的X-floor(X)和Y-floor(Y)接近0.5的点,并将四个初始角中的最接近点定义为第一个观察点

通过增加相对于网格中心的角度并减小到网格中心的距离来排序剩余点

您还可以研究函数findChessboardCorners(请参见calib3D模块中的calibinit.cpp)使用的算法,该算法使用类似的方法对检测到的角点进行排序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值