gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 05:42:25 26 4
gpt4 key购买 nike

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

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

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

有什么有效的方法可以在 Python 中实现它吗?

enter image description here

最佳答案

据我了解,您试图区分外部轮廓和内部轮廓。要确定哪些轮廓是 IN 和 OUT,您可以简单地使用轮廓层次来区分两者。具体来说,当使用 cv2.findContours 时您可以使用 cv2.RETR_TREE 提取外部或内部轮廓。参见 understanding contour hierarchies: how to distinguish between contours完整的解释。从给定的完整拓扑图中,我们可以过滤掉轮廓,这个想法是,如果父轮廓有内部轮廓,则意味着它是 OUT 轮廓,里面的子轮廓是 IN 轮廓。另一种情况是,如果一个轮廓没有内部 child ,那么我们就知道它是一个 IN 轮廓。

这里有一个例子来演示:

输入图片

enter image description here

结果

enter image description here

代码

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()

关于python - 如何使用 Python OpenCV 确定内部轮廓和外部轮廓?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72040574/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com