繁体   English   中英

在二维点列表中查找形状

[英]Finding shape in list of 2d points

我有一个形状,该形状由6个2d坐标和一个未校准的2d图片中找到的6个2d坐标组成。 我需要的是一种找出方法,从图像中发现的点是原始形状中的哪个。

阅读多个线程后的当前方法:

M, mask = cv2.findHomography(fixpts, dstpts, cv2.RANSAC, 2.0)
if all(p == 1 for p in mask):
    return M, pe

我正在尝试查找6个图像点的所有可能排列,并使用openCV函数findHomography,其中fixpts是已知坐标的列表,而dstpts是找到的坐标。 现在,对于每个排列,我都检查一下findHomography调用的结果是否仅导致离群值。 如果是这种情况,我将使用当前排列将点彼此分配。

到目前为止,这不是一种优雅的方法,而且也是一种很慢的方法,因此,我很想听听这个问题的优雅解决方案。

cv2.findHomography的RANSAC算法采用4个点对的随机子集来计算透视变换并采用最佳拟合(请参阅doc

这是可以直接以更有效的方式执行的操作:生成4个源点的所有子集和4个不同目标点的所有元组,并使用标准算法计算单应矩阵。 选择最匹配的一个。 (如果cv2.findHomography的RANSAC版本足够聪明,只需检查每个子集一次,这样就可以加快因子2的速度,否则可能会更快。)

如果您的点足够精确,则可以将搜索限制在前4个源点(仅生成1个子集),然后尝试将它们与4个不同目标点的所有元组匹配。 这将使速度提高15倍。

通过使用内部轮廓与外部轮廓上的视点不变性以及外部轮廓上的点的顺序来限制搜索,可以进一步提高速度。 一个可以使用6个源点和目标点的凸包。 例如,如果所有源点都在凸包上(那么所有6个目标点也都在凸包上),那么一个只需要检查6个对应关系(第一个对应关系通过沿着相同方向沿着外轮廓确定其他对应关系) )。 但是,由于存在不同的情况(外部轮廓上的3、4、5或6个点),并且由于“精确性”问题(例如,一个源点靠近外部轮廓而不是外部轮廓),因此难以实现此方法。凸包和对应的目标点位于凸包上。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM