目录
cv2.findContours
cv2.drawContours
代码及实验图
最近使用opencv-python检测图像轮廓的时候出现了一些错误,现在对常用的两个算法进行总结。
1、cv2.findContours()
1.1 返回值
该函数在opencv4.0之前有三个返回值,4.0之后就只有两个返回参数了;
第一个返回值contours(轮廓的点集),该返回值是一个列表,可以有多项,每一项都代表一个轮廓,代表储存轮廓的点;
第二个返回值hierachy,代表各层轮廓的索引;
opencv4.0以前的版本,还多加一个参数image,代表处理的图像
1.2 参数
第一个参数是要寻找轮廓的图像,只能传入二值图像,不是灰度图像也不是彩色图像。
第二个参数是轮廓的检索模式:cv2.RETR_EXTERNAL表示只检测外轮廓;v2.RETR_LIST检测的轮廓不建立等级关系;cv2.RETR_CCOMP建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层 ;cv2.RETR_TREE建立一个等级树结构的轮廓。
第三个参数是轮廓的近似方法 cv2.CHAIN_APPROX_NONE存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即max(abs(x1-x2),abs(y2-y1))==1;cv2.CHAIN_APPROX_SIMPLE压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息。
2 cv2.drawContours
第一个参数是指明在那幅图像上绘制轮廓;
第二个参数是要画轮廓本身;
第三个参数指定绘制轮廓List中的那条轮廓,-1代表绘制其中的所有轮廓;
第四个参数指画轮廓的颜色 第五个参数指画轮廓线的宽度,如果为-1则表明填充。
3 代码及实验图
import cv2
path = 'F:\\t\\venv\\1.jpg'
image = cv2.imread(path)
gray_image = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
_,binary_image = cv2.threshold(gray_image,125,255,0)
cv2.imshow('1',binary_image)
cv2.waitKey()
cv2.imwrite('F:\\t\\venv\\2.jpg',binary_image)
cv2.imwrite('F:\\t\\venv\\3.jpg',gray_image)
contours,hierachy = cv2.findContours(binary_image,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
points = contours[0]
length = points.shape[0]
for index,circle in enumerate(contours):
cv2.drawContours(binary_image, [circle], -1, (128, 128, 128), 10)
cv2.imshow(str(index),binary_image)
cv2.waitKey()
cv2.imwrite('F:\\t\\venv\\5.jpg',binary_image)
原图
灰度图
二值图像
轮廓检测在原图显示 (设置成灰边)
轮廓检测结果在二值图像中显示(图中灰色边缘)