目录
一、什么是轮廓?
轮廓是图像中的连续曲线,标识了对象的边缘。它们通常是二进制图像中的白色区域(前景)与黑色区域(背景)之间的边界。轮廓可以用于提取对象的形状信息,进行对象识别和分析。
在OpenCV中,可以使用cv2.findContours()
函数来查找图像中的轮廓。这个函数接受二进制图像作为输入,并返回一个包含轮廓信息的列表。
二、常见的轮廓特征及对应函数
-
面积:
cv2.contourArea(contour)
:- 参数
contour
:要计算面积的轮廓。 - 返回值:轮廓的面积。
- 参数
-
周长:
cv2.arcLength(contour, closed)
:- 参数
contour
:要计算周长的轮廓。 - 参数
closed
:一个布尔值,表示轮廓是否封闭(True 或 False)。 - 返回值:轮廓的周长。
这个函数用于计算轮廓的周长,
closed
参数表示轮廓是否封闭。如果轮廓是封闭的,将会计算封闭轮廓的周长,否则,将计算开放轮廓的周长。 - 参数
-
质心:
cv2.moments(contour)
:- 参数
contour
:要计算质心的轮廓。 - 返回值:包含轮廓矩的字典对象。
这个函数用于计算轮廓的矩,包括一阶和二阶矩。通过这些矩,可以计算轮廓的质心,即中心位置。
- 参数
-
边界框:
cv2.boundingRect(contour)
:- 参数
contour
:要计算边界框的轮廓。 - 返回值:矩形的坐标和尺寸,即
(x, y, width, height)
。
这个函数用于计算包围轮廓的最小矩形的位置和尺寸。
- 参数
-
最小矩形区域:
cv2.minAreaRect(contour)
:- 参数
contour
:要计算最小矩形区域的轮廓。 - 返回值:包含最小矩形区域信息的矩形。
这个函数用于计算包围轮廓的最小旋转矩形,返回的矩形包括位置、尺寸和旋转角度信息。
- 参数
-
最小外接圆:
cv2.minEnclosingCircle(contour)
:- 参数
contour
:要计算最小外接圆的轮廓。 - 返回值:包含最小外接圆的圆心坐标和半径的元组
(center, radius)
。
- 参数
-
凸包:
cv2.convexHull(contour)
:- 参数
contour
:要计算凸包的轮廓。 - 返回值:凸包的轮廓。
- 参数
-
轮廓近似:
cv2.approxPolyDP(contour, epsilon, closed)
:- 参数
contour
:要近似的轮廓。 - 参数
epsilon
:近似精度,用于控制近似程度。 - 参数
closed
:一个布尔值,表示轮廓是否封闭(True 或 False)。 - 返回值:近似后的轮廓。
- 参数
三、代码示例
import cv2
phone = cv2.imread('phone.png')#读取原图
phone_gray = cv2.cvtColor(phone,cv2.COLOR_BGR2GRAY)#灰度图的处理
ret, phone_binary = cv2.threshold(phone_gray, 120, 255, cv2.THRESH_BINARY)#阈值处理为二值化
# 使用cv2.findContours函数查找图像中的轮廓
# contours是找到的轮廓列表,hierarchy是轮廓的层级信息
image, contours, hierarchy = cv2.findContours(phone_binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
# 从轮廓列表中选择第一个轮廓进行绘制
# contours[0]表示第一个轮廓,(0, 255, 0)是轮廓的颜色,2是线宽
kuang=cv2.drawContours(phone,contours[0],-1,(0,255,0),2)
# 显示包含绘制轮廓的图像
cv2.imshow('kuang',kuang)
cv2.waitKey(0)
area = cv2.contourArea(contours[0])
print('面积:',area)
length = cv2.arcLength(contours[0],closed=True)
print('周长:',length)
moments=cv2.moments(contours[0])
print('质心:',moments)
boundingRect=cv2.boundingRect(contours[0])
print('边界框:',boundingRect)
minAreaRect=cv2.minAreaRect(contours[0])
print('最小矩形区域:',minAreaRect)
minEnclosingCircle=cv2.minEnclosingCircle(contours[0])
print('最小外接圆:',minEnclosingCircle)
convexHull=cv2.convexHull(contours[0])
print('凸包:',convexHull)
四、运行结果
以下都是图中绿色边框的信息: