如何用Python+OpenCV从轮廓中检测绳索围成的闭合区域
解决方法
当前代码仅能识别红色绳索的线条轮廓,无法得到绳索围成的闭合区域,核心原因是mask仅提取了绳索线条,未填补线条间的空隙。可以通过以下调整实现目标:
关键修改步骤
- 对mask执行闭运算:先膨胀再腐蚀,填补绳索缝隙,让内部区域形成完整闭合块
- 调整轮廓检索模式为
cv2.RETR_EXTERNAL,只检测最外层轮廓 - 填充轮廓时将厚度设为
-1,实现区域掩蔽
修改后的完整代码
import numpy as np import cv2 # 假设已获取hsv格式图像和cropFrame lower_red = np.array([l_h, l_s, l_v]) upper_red = np.array([u_h, u_s, u_v]) mask = cv2.inRange(hsv, lower_red, upper_red) kernel = np.ones((5, 5), np.uint8) # 先腐蚀去除小噪点,再用闭运算填补绳索缝隙 mask = cv2.erode(mask, kernel) mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel) # 只提取最外层轮廓 contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 填充闭合区域完成掩蔽 for cnt in contours: # 可选:过滤过小的干扰轮廓,阈值根据实际场景调整 if cv2.contourArea(cnt) > 100: cv2.drawContours(cropFrame, cnt, -1, (0, 0, 0), -1)
修改说明
- 闭运算:
cv2.MORPH_CLOSE会先膨胀mask填补绳索间隙,再腐蚀恢复轮廓粗细,让内部区域成为完整的闭合块 - 轮廓检索模式:
cv2.RETR_EXTERNAL仅提取最外层轮廓,避免检测到绳索内部的无效小轮廓 - 填充轮廓:将
drawContours的最后一个参数设为-1,会填充整个轮廓内部,而非仅绘制轮廓线
原问题配图:

内容的提问来源于stack exchange,提问作者zrshzrsh
相关产品推荐
相关产品推荐

