Python OpenCV 轮廓分析(Contour Analysis)详解与实战
1. 什么是轮廓(Contour)
轮廓(Contour)是图像中目标的边界点集合。通常先经过灰度化、二值化,再利用findContours()提取。
典型流程:
原图 → 灰度 → 二值化 → findContours → 轮廓分析工业视觉中常用于:
- 元件定位
- Connector 外形检测
- OCR 字符区域提取
- 缺件检测
- 尺寸测量
2. findContours() 详解
函数原型
contours,hierarchy=cv2.findContours(image,mode,method)参数说明
image
必须是二值图。
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)_,binary=cv2.threshold(gray,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)mode(检索模式)
RETR_EXTERNAL:仅外轮廓(工业视觉最常用)RETR_LIST:所有轮廓,不保存层级RETR_CCOMP:两层层级RETR_TREE:完整树结构
method(近似方式)
CHAIN_APPROX_NONE:保存所有点CHAIN_APPROX_SIMPLE:仅保存关键点(推荐)
完整示例
importcv2 img=cv2.imread("test.png")gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)_,binary=cv2.threshold(gray,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)contours,hierarchy=cv2.findContours(binary,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)draw=img.copy()cv2.drawContours(draw,contours,-1,(0,255,0),2)cv2.imshow("Contours",draw)cv2.waitKey(0)3. 轮廓几何特征分析
面积
area=cv2.contourArea(cnt)作用:
- 过滤噪声
- 判断目标大小
周长
length=cv2.arcLength(cnt,True)作用:
- 多边形逼近
- 圆度计算
外接矩形
x,y,w,h=cv2.boundingRect(cnt)作用:
- ROI 提取
- OCR 定位
最小外接矩形
rect=cv2.minAreaRect(cnt)box=cv2.boxPoints(rect)适用于旋转目标。
重心
M=cv2.moments(cnt)cx=int(M["m10"]/M["m00"])cy=int(M["m01"]/M["m00"])用于目标定位和运动控制。
4. Moments 与 Hu 不变矩
图像矩用于描述目标形状。
M=cv2.moments(cnt)hu=cv2.HuMoments(M)print(hu)Hu 不变矩特点:
- 平移不变
- 缩放不变
- 基本旋转不变
适用于:形状识别、Logo 检测。
5. approxPolyDP 多边形逼近
epsilon=0.02*cv2.arcLength(cnt,True)approx=cv2.approxPolyDP(cnt,epsilon,True)应用:
- 三角形检测
- 矩形检测
- 元件识别
6. Convex Hull 与 Convexity Defects
凸包
hull=cv2.convexHull(cnt)作用:
- 获取最小凸包
- 外形分析
凸缺陷
idx=cv2.convexHull(cnt,returnPoints=False)defects=cv2.convexityDefects(cnt,idx)作用:
- Connector 防呆槽检测
- 缺口检测
- 手势识别
7. matchShapes()
score=cv2.matchShapes(cnt1,cnt2,cv2.CONTOURS_MATCH_I1,0)返回值越小越相似。
应用:
- Connector 插反检测
- 极性检测
- Logo 比对
8. 综合案例
forcntincontours:area=cv2.contourArea(cnt)ifarea<300:continuex,y,w,h=cv2.boundingRect(cnt)cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)cv2.putText(img,f"Area:{area:.1f}",(x,y-5),cv2.FONT_HERSHEY_SIMPLEX,0.6,(0,0,255),2)总结
| API | 用途 |
|---|---|
findContours | 提取轮廓 |
contourArea | 面积 |
arcLength | 周长 |
moments | 几何矩 |
HuMoments | 形状描述 |
approxPolyDP | 多边形逼近 |
convexHull | 凸包 |
convexityDefects | 凸缺陷 |
matchShapes | 轮廓匹配 |
