有的人可能会问,轮廓跟边缘有什么区别,不都是把物体的边缘画出来吗。实际上是不一样的,边缘一般是不连续的,而轮廓则是把边缘连接成了一个整体。
cv2.findContours()
这个函数是用来查找图像的轮廓,并且返回几个值。其构造函数如下:
image,contours,hierarchy=cv2.findContours(img,mode,method)
参数解释:
- image:修改后的原图像
- contours:是一个列表,储存图像中的所有轮廓,包含对象边界点坐标(x,y)
- hierarchy:图像的轮廓层次
- img:待处理图像,必须是二值化图片,并且要注意,对象必须是白色,背景是黑色。
- mode:轮廓检索模式:
- cv2.RETR_EXTERNAL:表示只检测外轮廓
- cv2.RETR_LIST:检测的轮廓不建立等级关系
- cv2.RETR_CCOMP:建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如国内筒内还有一个连通物体,这个物体的边界也在顶层
- cv2.RETR_TREE:建立一个等级树结构的轮廓
- method:轮廓的近似方法:
- cv2.CHAIN_APPROX_NONE:存储所有的轮廓点,相邻两个点的像素位置差不超过1
- cv2. cv2.CHAIN_APPROX_SIMPLE:简化保存,比如矩形轮廓就只保存四个顶点的轮廓点。
- cv2.CHAIN_APPROX_TC89_L1:使用teh-Chinl chain近似算法
- cv2.CHAIN_APPROX_——TC89_KCOS:使用teh-Chinl chain近似算法
cv2.drawContours()
这个函数是用来把找到的轮廓画在原图上的,其构造函数如下:
image=cv2.drawContours(img,contours,contourldx,color,thickness)
参数解释:
- img:原图
- contours:findContou函数的第二个返回值
- contourldx:需要绘制的边缘索引,如果是-1就全部绘制。
- color:绘制的颜色,BGR格式的Scalar
- thickness:绘制轮廓时的画笔粗细
例子
import numpy as np
import cv2
img=cv2.imread('D://zopencv//contours.png')
imgcopy=img.copy()
imgray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,img_thre=cv2.threshold(imgray,127,255,cv2.THRESH_BINARY)
image,contours,hierarchy=cv2.findContours(img_thre,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
mask1=cv2.drawContours(imgcopy,contours,-1,(0,0,255),2)
cv2.imshow('mask1',mask1)
cv2.waitKey(0)
cv2.destroyAllWindows()