使用opencv确定点是在形状的内部还是外部

时间:2012-12-09 09:08:35

标签: opencv

我有白色背景和简单形状的图像(每个图像都有一个形状)。我想确定某个点(x,y)是否在形状内部。我怎么能用opencv做到这一点?

3 个答案:

答案 0 :(得分:12)

使用pointPolygonTest功能。 Here's教程。

答案 1 :(得分:1)

要确定某个点是在形状的内部,外部还是边缘,可以使用cv2.pointPolygonTest()检查该点是否在轮廓内。该函数返回import os current_path = os.getcwd() print('Current path: %s' %current_path) filenames = os.listdir(current_path) for filenamen in filnames: os.rename(filename, filename.replace(" ", "_")) os.rename(filename, filename.replace(".", "_")) os.rename(filename, filename.replace(",", "_")) os.rename(filename, filename.replace(";", "_")) os.rename(filename, filename.replace("-", "_")) os.rename(filename, filename.replace("–", "_")) os.rename(filename, filename.replace("—", "_")) os.rename(filename, filename.replace("ß", "ss")) os.rename(filename, filename.replace("ä", "ae")) os.rename(filename, filename.replace("ü", "ue")) os.rename(filename, filename.replace("ö", "o")) os.rename(filename, filename.replace("á", "a")) os.rename(filename, filename.replace("â", "a")) os.rename(filename, filename.replace("à", "a")) … +1-1分别指示一个点是在轮廓的内部,外部还是在轮廓上。假设我们已经有了形状的轮廓,我们可以简单地将轮廓和0点传递给函数。

(x,y)

在函数中,第三个参数为result = cv2.pointPolygonTest(contour, (x,y), False) 。如果为measureDist,则会找到图像中的点与轮廓之间的最短距离。如果为True,它将发现该点是在内部,外部还是在轮廓上。由于我们不想找到距离,因此将False参数设置为measureDist

这是一个找到方形轮廓然后检查点是否在轮廓内的示例


测试图像

找到轮廓并检查点后的图像

结果

  

point1:-1.0

     

point2:1.0

     

point3:0.0

因此,point1在外部,point2在内部,point3在轮廓上

False

答案 2 :(得分:0)

如果要访问凸包内部的所有点,可以进行遮罩

我首先通过在黑色框架上用cv2.fillPoly()将我的凸包白色绘制为白色来解决这个问题

  1. 首先创建跟随框架形状的黑色框架
    black_frame = np.zeros_like(your_frame).astype(np.uint8)
  2. 用白色油漆凸包
    cv2.fillPoly(black_frame , [hull], (255, 255, 255))
  3. 使用numpy布尔索引创建蒙版,它将生成一个内部包含True / False值的蒙版,如果像素值为白色,则为True
    mask = black_frame == 255
  4. 您可以通过获取框架和蒙版之间的乘积来访问像素值,如果为False,则值将为
    targetROI = your_frame * mask
  5. 使用遮罩访问像素。
black_frame = np.zeros_like(your_frame).astype(np.uint8)
cv2.fillPoly(black_frame , [hull], (255, 255, 255))
mask = black_frame == 255
targetROI = your_frame * mask