我有一个由6个2d坐标组成的形状和6个在未校准的2d图像中找到的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调用的结果是否仅导致内点。如果是这种情况,我将使用当前排列来相互分配点。
到目前为止,这并不是一种优雅,也是一种非常缓慢的方式,所以我很想听到这个问题的优雅解决方案。
答案 0 :(得分:0)
cv2.findHomography
的RANSAC算法采用4个点对的随机子集来计算透视变换并采用最佳拟合(参见doc)
这可以直接以更有效的方式完成:生成4个源点的所有子集和4个不同目标点的所有元组,并使用标准算法计算单应矩阵。选择最匹配的那个。 (如果cv2.findHomography
的RANSAC版本足够聪明,只能检查每个子集一次,这可能会加速因子2,否则可能更多。)
如果您的分数足够精确,您可以将搜索限制为前4个源点(仅生成1个子集),并尝试将它们与4个不同目标点的所有元组进行匹配。这将使另一个加速因子15。
通过使用内部与外部轮廓的透视不变量以及外部轮廓上的点的顺序来限制搜索,可以获得进一步的加速。可以使用6个源点和目标点的凸包。如果是所有源点都在凸包上(然后所有6个目标点也应该在它们的凸包上)然后只需要检查六个对应关系(第一个对应关系通过沿相同方向的外部轮廓确定其他对应关系)。然而,由于不同的情况(外轮廓上的3,4,5或6个点)并且如果例如“精确”问题,这种方法难以实现。一个源点靠近外轮廓但不是凸包的一部分,相应的目标点位于凸包上。