目标
- 了解轮廓是什么。
- 学会寻找轮廓,绘制轮廓等。
- 您将看到以下功能:cv2.findContos(), cv2.drawContours()
轮廓是什么?
轮廓可以简单地解释为连接所有连续点(沿边界)的曲线,具有相同的颜色或强度。轮廓是形状分析和目标检测与识别的有效工具。
- 为了获得更高的精度,请使用二进制图像。因此,在寻找轮廓之前,应用阈值或精明的边缘检测。
- findContos函数修改源图像。因此,如果您想要源图像,即使在找到轮廓之后,已经将其存储到其他变量中。
- 在OpenCV中,寻找轮廓就像从黑色背景中寻找白色物体一样。所以请记住,要找到的物体应该是白色的,背景应该是黑色的。
让我们看看如何找到二值图像的轮廓:
import numpy as np
import cv2
im = cv2.imread('test.jpg')
imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(imgray,127,255,0)
contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
看,cv2.findContos()函数有三个参数,第一是源图像,第二是轮廓检索模式,第三是轮廓近似方法。并输出等高线和层次结构。等高线是图像中所有轮廓的Python列表。每个单独的轮廓都是对象边界点(x,y)坐标的Numpy数组。
如何绘制轮廓?
为了画轮廓,使用cv2.drawContours函数。它也可以用来绘制任何形状,只要你有它的边界点。第一个参数是源图像,第二个参数是应该作为Python列表传递的轮廓,第三个参数是等高线索引(在绘制单个轮廓时有用)。绘制所有轮廓,传递-1)和剩余的参数是颜色,厚度等。
若要绘制图像中的所有轮廓,请执行以下操作:
cv2.drawContours(img, contours, -1, (0,255,0), 3)
要绘制一个单独的等高线,比如第四个等高线:
cv2.drawContours(img, contours, 3, (0,255,0), 3)
但大多数情况下,下面的方法将是有用的:
cnt = contours[4]
cv2.drawContours(img, [cnt], 0, (0,255,0), 3)
等高线逼近法
上面,我们告诉我们,等高线是一个形状的边界,具有相同的强度。它存储形状边界的(x,y)坐标。但是它能存储所有的坐标吗?这是由此等高线近似方法指定的。
如果你通过cv2.CHAIN_APPROX_NONE,所有的边界点都被存储起来。但我们真的需要所有的点吗?例如,你找到了一条直线的轮廓线。你需要这条线上的所有点来表示这条线吗?不,我们只需要那条线的两个终点。这就是cv2.CHAIN_APPROX_SIMPLE的确如此。它删除所有冗余点并压缩轮廓,从而节省内存。
下面的矩形图像演示了这一技术。只需在等高线数组中的所有坐标上画一个圆圈(用蓝色绘制)。第一张照片显示了我得到的点cv2.CHAIN_APPROX_NONE(734个点)第二张图片显示cv2.CHAIN_APPROX_SIMPLE(仅4个点)。看,这节省了多少内存!