OpenCV开发教程之查找轮廓并计算轮廓的面积和周长

16人浏览 / 0人评论 / 添加收藏

OpenCV中查找图形的轮廓主要是用findContours方法,绘制轮廓则是drawContours方法。今天小编就用示例代码来介绍一下。

图像轮廓是具有相同颜色或灰度的连续点的曲线.轮廓在形状分析和物体的检测和识别中很有用。
 轮廓的作用:
 ·用于图形分析
 ·物体的识别和检测
注意点:
 ·为了检测的准确性,需要先对图像进行二值化或Canny操作。
 画轮廓时会修改输入的图像,如果之后想继续使用原始图像,应该将原始图像储存到其他变量中。
查找轮廓
 findContours(image, mode, methodl, contoursl, hierarchyl, offset]ll)
 omode查找轮廓的模式
 RETR EXTERNAL=0,表示只检测外围轮廓
 RETRLIST=1,检测的轮廓不建立等级关系,即检测所有轮廓,较为常用
 RETR_CCOMP=2,每层最多两级,从小到大,从里到外.
 RETRTREE=3,按照树型存储轮廓,从大到小,从右到左
 method 轮廓近似方法也ApproximationMode
 ·CHAIN APPROX NONE保存所有轮廓上的点
 ·CHAIN APPROXSIMPLE,只保存角点,比如四边形,只保留四边形的4个角,存储信息少,比较常用
 返回contours和hierachy 即轮廓和层级
 method 轮廓近似方法也叫ApproximationMode
 ·CHAIN_APPROXNONE保存所有轮廓上的点
 CHAIN APPROX SIMPLE,只保存角点,比如四边形,只保留四边形的4个角,存储信息少,比较常用
 返回contours和hierachy 即轮廓和层级

代码示例:
import cv2
import numpy as np
from opencv_jupyter_ui import cv2_imshow

#该图像显示效果是黑白的,但是实际上却是3个通道的彩色图像
img = cv2.imread('./images/hand.png')
img_copy = img.copy()
#变成单通道的黑白图片
gray = cv2.cvtColor (img, cv2.COLOR_BGR2GRAY)
#二值化,注意有2个返回值,阈值和结果
ret, binary = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY)
# cv2_imshow('img',img)
#轮廓查找,新版本返回两个结果,轮廓和层级,老版本返回3个参数,图像,轮廓和层级
contours, _ = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

cv2.drawContours(img, contours, -1, (0, 0, 255), 2)
#打印轮廓
# print('contours:', contours)


# 遍历并计算每个轮廓的面积和周长
for i, contour in enumerate(contours):
   area = cv2.contourArea(contour)
   print(f"轮廓 {i} 面积是: {area}")
   #计算轮廓周长
   perimeter = cv2.arcLength(contour, True)
   print(f'轮廓 {i} 周长: {perimeter}')

cv2_imshow('img', np.hstack((img, img_copy)))

展示最终效果图如下:

轮廓 0 面积是: 46574.0
轮廓 0 周长: 1993.0823810100555

全部评论