关注

Opencv(十九) : 图形轮廓特征查找

前言

图像轮廓特征查找是机器视觉中形状分析的核心技术,通过提取目标的外接矩形、最小外接矩形、最小外接圆等几何特征,可实现目标定位、尺寸测量、形状匹配等关键任务。

一、三大核心轮廓特征解析

1. 外接矩形

1.1 定义与特点

外接矩形是不考虑目标旋转、能完整包含轮廓的最小轴对齐矩形(即矩形的边与图像坐标轴平行),视觉上表现为“紧贴目标最左、最右、最上、最下顶点”的矩形(如文档中绿色矩形)。

1.2 计算逻辑

无需复杂算法,直接通过轮廓顶点坐标推导:

  1. 遍历轮廓所有顶点,提取横坐标最小值(最左)、最大值(最右),纵坐标最小值(最上)、最大值(最下);
  2. 以“最左x+最上y”为左上角顶点,“最右x-最左x”为宽度,“最下y-最上y”为高度,构建矩形。
1.3 核心优势与局限
  • 优势:计算速度快,无需依赖凸包,适用于快速定位目标(如工业零件粗定位);
  • 局限:若目标存在旋转,矩形会包含大量空白区域,无法贴合目标实际形态。

2. 最小外接矩形

2.1 定义与特点

最小外接矩形是面积最小、能完整包含轮廓的矩形,可随目标旋转(非轴对齐),视觉上最贴合目标形态(如文档中蓝色矩形),是形状分析的核心特征。

2.2 旋转卡壳法

算法以“凸包”为基础(仅需处理凸包顶点,减少计算量),核心逻辑如下:

  1. 算法前提:任意多边形的最小外接矩形,必有一条边与多边形的某条边共线;
  2. 步骤拆解
    • 第一步:对轮廓求凸包,得到凸包顶点集(凸包是包含轮廓的最小凸多边形,减少冗余顶点);
    • 第二步:遍历凸包的每条边,以当前边为“矩形起始边”,计算该边对应的外接矩形;
      • 求矩形高度:计算所有凸包顶点到当前边的垂直距离,最大值即为矩形高度;
      • 求矩形宽度:将所有凸包顶点投影到当前边的方向向量上,投影的最大跨度即为矩形宽度;
    • 第三步:计算所有“起始边对应的矩形面积”,取面积最小的矩形作为最终结果。
2.3 cv2.minAreaRect()
  • 输入:轮廓点集(通常为凸包点,若输入普通轮廓,函数会自动处理);
  • 输出:包含4个关键参数的元组 (center, (width, height), angle)
    • center:矩形中心点坐标 (x, y)
    • (width, height):矩形的宽和高(需注意:width不一定大于height,与旋转角度相关);
    • angle:矩形旋转角度(范围为[-90, 0),表示矩形相对于x轴逆时针旋转的角度)。
2.4 核心优势
  • 完全贴合目标形态,面积最小,适用于精确尺寸测量(如工业零件的实际长宽计算);
  • 可通过旋转角度反推目标的姿态(如判断工件是否倾斜)。

3. 最小外接圆

3.1 定义与特点

最小外接圆是半径最小、能完整包含轮廓所有点的圆,可快速反映目标的“紧凑程度”(如圆形目标的圆度评估)。

3.2 Welzl算法

算法基于“随机增量思想”,通过递归快速定位最小圆,核心逻辑如下:

  1. 核心定理:平面上n个点的最小外接圆,若新增第n+1个点在圆外,则该点必在n+1个点的最小外接圆上;
  2. 步骤拆解
    • 基础情况:1个点→圆以该点为圆心,半径0;2个点→圆以两点连线为直径;3个点→圆为三点的外接圆(共线则取两点直径);
    • 递归扩展:遍历所有点,若当前点在已计算的圆外,则以该点为“必在圆上的点”,递归计算包含该点和之前部分点的最小圆;
    • 终止条件:所有点均在圆内或圆上,返回当前圆。
3.3 cv2.minEnclosingCircle()
  • 输入:轮廓点集(普通轮廓或凸包点均可);
  • 输出:元组 (center, radius)
    • center:圆心坐标 (x, y)
    • radius:圆的半径。
3.4 核心应用
  • 圆形目标的圆度评估(如检测零件是否为标准圆形,通过“轮廓面积/外接圆面积”计算圆度);
  • 目标尺寸的快速衡量(如通过半径判断目标大小等级)。

二、完整实战流程

1. 流程总览

图像轮廓特征查找的通用流程为:图像预处理→轮廓提取→特征计算→结果绘制,各步骤环环相扣,预处理质量直接影响最终精度。

2. 详细代码实现

import cv2

#1.读取图片
image_np = cv2.imread('./picture.png')

image_contour = image_np.copy()
#2.灰度化
image_gray = cv2.cvtColor(image_np,cv2.COLOR_BGR2GRAY)
#3.二值化
ret,image_binary = cv2.threshold(image_gray,127,255,cv2.THRESH_OTSU + cv2.THRESH_BINARY_INV)

#4.寻找轮廓
contours,hierarchy = cv2.findContours(image_binary,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)

#5.绘制轮廓
cv2.drawContours(image_contour,contours,-1,(0,0,255),2)

#6.根据轮廓点的坐标寻找外接矩形
# 注意:cv2.boundingRect 这个函数返回的是,外接矩形的左上角的点的坐标及外接矩形的宽度和高度,并不会绘制矩形
# 且这个函数一次只能获取一个轮廓的外接矩形
# rectangle 去画矩形
for cnt in contours:
    #通过cv2.boundingRect 获取当前轮廓点所构成的外接矩形左上角的点的坐标及外接矩形的宽度和高度
    x,y,w,h = cv2.boundingRect(cnt)
    #此时的(x,y)就i是左上角的点的坐标   w是矩形的宽度  h是矩形的高度
    bottom_right = (x+w,y+h)
    top_left = (x,y)
    #通过rectangle去绘制矩形
    cv2.rectangle(image_contour,top_left,bottom_right,(255,0,0),2)

cv2.imshow('image_np',image_np)
cv2.imshow('image_contour',image_contour)
cv2.waitKey(0)

输出结果为
在这里插入图片描述
在这里插入图片描述

3. 关键参数说明

步骤核心函数关键参数意义
二值化cv2.thresholdTHRESH_BINARY_INV:确保目标为白色(轮廓检测需前景非零)
轮廓提取cv2.findContoursRETR_EXTERNAL:仅取外层轮廓;CHAIN_APPROX_SIMPLE:压缩冗余点,减少计算量
最小外接矩形cv2.boxPoints将minAreaRect返回的矩形参数转为顶点坐标(需astype(np.int32),否则无法绘制)
最小外接圆cv2.circle圆心和半径需转为整数(OpenCV绘制需整数坐标)

三、核心应用场景与注意事项

1. 典型应用场景

特征类型核心应用示例场景
外接矩形目标快速定位、粗分类监控中行人位置定位、工业零件初步筛选
最小外接矩形精确尺寸测量、姿态判断工件长宽测量、倾斜角度计算(如印刷品对齐)
最小外接圆圆度评估、目标紧凑度分析圆形零件缺陷检测(如是否为椭圆)、细胞大小分类

2. 实战注意事项

  • 预处理是关键
    • 若图像噪声多,需增加高斯模糊核尺寸(如(7,7));
    • 若目标与背景对比度低,建议用自适应阈值(cv2.adaptiveThreshold)替代固定阈值;
  • 轮廓筛选
    • 提取轮廓后,通过cv2.contourArea(cnt)设置面积阈值,过滤微小噪声轮廓(如if cv2.contourArea(cnt) < 100: 跳过);
  • 最小外接矩形角度处理
    • cv2.minAreaRect()返回的角度范围为[-90, 0),若需转为[0, 90),可通过if min_angle < -45: 交换宽高并调整角度(如角度-60°→宽高交换,角度30°);
  • 多轮廓处理
    • 若图像含多个目标,需遍历contours列表,对每个轮廓单独计算特征(如零件计数+逐个尺寸测量)。

四、总结

图像轮廓特征查找的核心是“根据需求选择合适的特征”:

  • 需快速定位→选外接矩形;
  • 需精确尺寸/姿态→选最小外接矩形;
  • 需评估圆度/紧凑度→选最小外接圆。

转载自CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/Mrliu__/article/details/155786573

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--