OpenCV 轮廓检测笔记
630 字
3 分钟
OpenCV 轮廓检测笔记
OpenCV 轮廓检测笔记
轮廓检测常用于从二值图里找目标边界。它依赖前一步的分割质量,所以不要跳过 mask 检查直接找轮廓。
如果二值图噪声很多,轮廓数量会暴涨,后续过滤就会很混乱。
输入必须是二值图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)_, mask = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)contours, hierarchy = cv2.findContours( mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)print(len(contours))RETR_EXTERNAL 只取外层轮廓,适合多数目标检测前处理;如果需要内部孔洞,再考虑其他模式。
按面积过滤
boxes = []for cnt in contours: area = cv2.contourArea(cnt) if area < 100: continue x, y, w, h = cv2.boundingRect(cnt) boxes.append((x, y, w, h, area))面积阈值要根据图片分辨率调整,不能从一张图直接套到所有数据。
画出结果检查
vis = img.copy()for x, y, w, h, area in boxes: cv2.rectangle(vis, (x, y), (x + w, y + h), (0, 255, 0), 2)cv2.imwrite("contours_check.jpg", vis)常见问题
-
mask 黑白反了,导致背景成为最大轮廓。
-
噪声没有过滤,小碎点太多。
-
轮廓模式选错,内部边界也被算进来。
-
坐标和宽高后续转换成检测框时写反。
实战复盘
复用《OpenCV 轮廓检测笔记》时,我会先用三到五张图片跑通流程,再扩大到完整数据集。小样本阶段要故意覆盖正常图、边界图和可能失败的图,而不是只选最干净的样本。
OpenCV 和 YOLO 相关步骤都要特别关注坐标和尺寸。图片数组常用高宽顺序,检测框常用 x/y 顺序,YOLO 又使用归一化中心点坐标,混用后不会总是报错,但结果一定会偏。
后续如果要写成更完整教程,可以补充输入目录结构、输出目录结构和一张可视化样例,让读者能直接对照自己的项目。
最小验收样例
验收《OpenCV 轮廓检测笔记》时,我会固定三张图片:一张正常样例、一张边界样例、一张容易失败的样例。每次改代码都用这三张图跑一遍,并保存输出结果。
视觉流程的验收必须能用眼睛确认。只打印数组 shape 或命令成功不够,至少要保存一张中间结果图或最终可视化图,确认处理效果和预期一致。
小结
轮廓检测要从二值图质量开始检查。mask 清楚、面积阈值合理,轮廓结果才有使用价值。
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!













