OpenCv中轮廓的特征详解

目录

一、什么是轮廓?

二、常见的轮廓特征及对应函数

三、代码示例

四、运行结果


一、什么是轮廓?

轮廓是图像中的连续曲线,标识了对象的边缘。它们通常是二进制图像中的白色区域(前景)与黑色区域(背景)之间的边界。轮廓可以用于提取对象的形状信息,进行对象识别和分析。

在OpenCV中,可以使用cv2.findContours()函数来查找图像中的轮廓。这个函数接受二进制图像作为输入,并返回一个包含轮廓信息的列表。

二、常见的轮廓特征及对应函数

  1. 面积:cv2.contourArea(contour):

    • 参数 contour:要计算面积的轮廓。
    • 返回值:轮廓的面积。
  2. 周长:cv2.arcLength(contour, closed):

    • 参数 contour:要计算周长的轮廓。
    • 参数 closed:一个布尔值,表示轮廓是否封闭(True 或 False)。
    • 返回值:轮廓的周长。

    这个函数用于计算轮廓的周长,closed 参数表示轮廓是否封闭。如果轮廓是封闭的,将会计算封闭轮廓的周长,否则,将计算开放轮廓的周长。

  3. 质心:cv2.moments(contour):

    • 参数 contour:要计算质心的轮廓。
    • 返回值:包含轮廓矩的字典对象。

    这个函数用于计算轮廓的矩,包括一阶和二阶矩。通过这些矩,可以计算轮廓的质心,即中心位置。

  4. 边界框:cv2.boundingRect(contour):

    • 参数 contour:要计算边界框的轮廓。
    • 返回值:矩形的坐标和尺寸,即 (x, y, width, height)

    这个函数用于计算包围轮廓的最小矩形的位置和尺寸。

  5. 最小矩形区域:cv2.minAreaRect(contour):

    • 参数 contour:要计算最小矩形区域的轮廓。
    • 返回值:包含最小矩形区域信息的矩形。

    这个函数用于计算包围轮廓的最小旋转矩形,返回的矩形包括位置、尺寸和旋转角度信息。

  6. 最小外接圆:cv2.minEnclosingCircle(contour):

    • 参数 contour:要计算最小外接圆的轮廓。
    • 返回值:包含最小外接圆的圆心坐标和半径的元组 (center, radius)
  7. 凸包:cv2.convexHull(contour):

    • 参数 contour:要计算凸包的轮廓。
    • 返回值:凸包的轮廓。
  8. 轮廓近似: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)

四、运行结果

以下都是图中绿色边框的信息:

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值