对于find contour,只提取封闭的contour出来,python代码
时间: 2024-04-29 14:27:14 浏览: 200
可以这样实现:
```
import cv2
# 加载图像
img = cv2.imread('image.jpg')
# 转灰度图像并进行二值化处理
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# 寻找轮廓并筛选出封闭的轮廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
closed_contours = []
for cnt in contours:
if cv2.contourArea(cnt) > 0 and cv2.isContourConvex(cnt):
closed = True
for i in range(len(cnt)):
# 检测轮廓是否封闭
if i == len(cnt)-1:
if abs(cnt[i][0][0]-cnt[0][0][0]) > 1 or abs(cnt[i][0][1]-cnt[0][0][1]) > 1:
closed = False
else:
if abs(cnt[i][0][0]-cnt[i+1][0][0]) > 1 or abs(cnt[i][0][1]-cnt[i+1][0][1]) > 1:
closed = False
# 如果轮廓封闭则加入列表
if closed:
closed_contours.append(cnt)
# 绘制封闭的轮廓
cv2.drawContours(img, closed_contours, -1, (0, 0, 255), 2)
cv2.imshow('Image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
代码中使用 `cv2.findContours` 寻找轮廓,判断轮廓是否封闭的方法是检测轮廓中相邻两个点是否在一定范围内接近,如果轮廓中所有相邻的点都接近,则认为轮廓是封闭的,加入列表。最后使用 `cv2.drawContours` 绘制封闭的轮廓。
阅读全文