在 OpenCV 中测量点到掩码的距离 python

Measuring the distance of a point to a mask in OpenCV python

假设我有一个对象和一个点的蒙版。我想找到物体遮罩离点最近的点。

比如我画的,有一个物体,图中蓝色的形状(假设里面也是物体遮罩的部分)。而红色的点就是我想找到离对象掩码最近距离的点。

所以,我想找到粗绿线,因为它是到面具的最短距离,而不是其他(粉色、橙色等)。我可以使用以下其中一种方式执行此操作:

但是none这些方法都是优雅的。我想知道确定这一点的更优雅、最有效的方法是什么?

你可以做一种二进制搜索:

  • 让我们把 P 称为你的观点,并考虑以 P
  • 为中心的圆圈
  • 在mask上任意点M,通过M的圆与mask相交
  • 现在重复直到收敛,如果圆与掩码相交,则减小半径,否则增加半径(通过二进制搜索类型数量)

如果你的面具没有很好地连接,这将不起作用,但如果不是这样,我怀疑你能比蛮力做得更好...

二进制搜索的 circle-mask 路口检查时间日志的总成本应该是线性的。

您可以使用pointPolygonTest找到蓝色遮罩区域与任意点之间的最近距离

  1. 找到蓝色区域的轮廓,这就是我们的多边形

  2. 如果将距离标志设置为true,则可以找到点与多边形之间的最近距离

    closestDist = cv2.pointPolygonTest(轮廓[0], redPoint, True)

  3. 我们可以从这个函数中得到的更多信息是,如果距离为负,则点在多边形之外,如果点在多边形边缘,则距离为0,如果点在多边形内则为正