如何使用 Python OpenCV 确定内部轮廓和外部轮廓?

How to determine between inner and outer contour with Python OpenCV?

我想要一个感兴趣的多边形区域,并想在此区域内执行对象检测算法。

例如,用户给出了一些点,我想在我的代码中用它们创建一个多边形(如红色区域),我想在红色区域内执行我的对象检测代码。

问题是如何在该区域内搜索对象以及如何实现定义 IN 和 OUT 区域的 if 条件?

在Python中有什么有效的方法来实现这个吗?

据我了解,您试图区分外部轮廓和内部轮廓。要确定哪些轮廓是 IN 和 OUT,您可以简单地使用轮廓层次来区分两者。具体来说,当使用 cv2.findContours you can use cv2.RETR_TREE to extract outer or inner contours. See 进行完整解释时。从给定的完整拓扑图中,我们可以过滤掉轮廓,其想法是,如果 parent 轮廓具有内部轮廓,则意味着它是 OUT 轮廓,而 child里面是 IN 轮廓。另一种情况是,如果轮廓没有内部 child 那么我们知道它是一个 IN 轮廓。

这里有一个例子来演示:

输入图片

结果

代码

import cv2

# Load image, grayscale, Otsu's threshold
image = cv2.imread('2.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]

# Filter using contour hierarchy
cnts, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)[-2:]
hierarchy = hierarchy[0]
for component in zip(cnts, hierarchy):
    currentContour = component[0]
    currentHierarchy = component[1]
    x,y,w,h = cv2.boundingRect(currentContour)
    # Has inner contours which means it is IN
    if currentHierarchy[2] < 0:
        cv2.putText(image, 'IN', (x,y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (36,255,12), 2)
    # No child which means it is OUT
    elif currentHierarchy[3] < 0:
        cv2.putText(image, 'OUT', (x,y-5), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (36,255,12), 2)

cv2.imshow('image', image)
cv2.waitKey()