目录
OpenCV是一个广泛应用于计算机视觉和图像处理领域的开源库,提供了丰富的功能和工具来处理图像数据。其中,轮廓检测是一项重要的技术,用于识别图像中的对象边界并进行进一步的分析和处理。本文将介绍OpenCV中轮廓检测和绘制的基本原理和方法。
1.轮廓检测的原理和步骤
轮廓检测的原理是通过检测图像中灰度值变化较大的区域,找到目标的轮廓信息。
轮廓检测的步骤一般包括:将图像灰度化和二值化,以便区分目标和背景;使用轮廓提取函数,找到图像中所有的轮廓,返回轮廓的列表和层次结构;使用轮廓近似函数,对轮廓进行简化或平滑,去除不必要的点。轮廓检测的结果可以用于目标的定位、分割、识别等应用。
2. 轮廓检测的参数和方法
在OpenCV中,使用cv2.findContours()函数可以实现图像中的轮廓检测。
image, contours, hierarchy = cv2.findContours(img, mode, method)
参数:
img:需要实现轮廓检测的原图
mode: 轮廓的检索模式,主要有四种方式:
cv2.RETR_EXTERNAL:只检测外轮廓,所有子轮廓被忽略
cv2.RETR_LIST:检测的轮廓不建立等级关系,所有轮廓属于同一等级
cv2.RETR_CCOMP:返回所有的轮廓,只建立两个等级的轮廓。一个对象的外轮廓为第1级组织结构。
cv2.RETR_TREE:返回所有的轮廓,建立一个完整的组织结构的轮廓。
method:轮廓的近似方法,主要有以下两种:
cv2.CHAIN_APPROX_NONE:存储所有的轮廓点。
cv2.CHAIN_APPROX_SIMPLE:压缩模式,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息。
3.轮廓绘制的参数和方法
cv2.drawContours(image, contours, contourIdx, color, thickness=None,lineType=None, hierarchy=None, maxLevel=None, offset=None)
image:要在其上绘制轮廓的输入图像。
contours:轮廓列表,通常由cv2.findContours()函数返回。
contourIdx:要绘制的轮廓的索引。如果为负数,则绘制所有轮廓。
color:轮廓的颜色,以BGR格式表示。例如,(0, 255, 0)表示绿色。
thickness:轮廓线的粗细。默认值为1。
lineType:轮廓线的类型。默认值为cv2.LINE_8。
hierarchy:轮廓层次结构。通常由cv2.findContours()函数返回。
maxLevel:绘制的最大轮廓层级。默认值为None,表示绘制所有层级。
offset:轮廓点的偏移量。默认值为None。
4.代码示例
import cv2
samu = cv2.imread('samu.jpg')#读取原图
cv2.imshow('samu',samu)
cv2.waitKey(100000)
samu_gray = cv2.cvtColor(samu,cv2.COLOR_BGR2GRAY)#灰度化处理
ret, samu_binary = cv2.threshold(samu_gray, 100, 150, cv2.THRESH_BINARY)#二值化处理
cv2.imshow('samu_binary',samu_binary)
cv2.waitKey(100000)
image, contours, hierarchy = cv2.findContours(samu_binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)#轮廓检测
image_copy = samu.copy()#防止破坏原图
image_copy = cv2.drawContours(image=image_copy, contours=contours, contourIdx=-1,color=(0,255,0),thickness=1 )#绘制轮廓
cv2.imshow('Contours_show', image_copy)
cv2.waitKey(0)
原图:
预处理:
轮廓框图: