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

全部评论