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轮廓匹配