轮廓是一系列相连的点组成的曲线,表明了物体的基本外形。数组
轮廓与边缘很类似,但轮廓是连续的,边缘并不全都连续,其实边缘主要是做为图像的特征使用,好比用边缘特征能够区分脸和手,而轮廓主要用来分析物体的形态,好比物体的周长和面积等,能够说边缘包括轮廓。函数
寻找轮廓的操做通常用于二值化图,因此一般会使用阈值分割或Canny边缘检测先获得二值图。spa
import cv2
img = cv2.imread('handwriting.jpg') img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ret, thresh = cv2.threshold(img_gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU) # 寻找二值化图中的轮廓 image, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) print(len(contours)) # 结果是2
函数有3个返回值,image仍是原来的二值化图片,hierarchy是轮廓间的层级关系,contours表示轮廓,以数组形式存储,记录了每条轮廓的全部像素点的坐标(x,y)code
ContourPicture = cv2.drawContours(img, contours, -1, (0, 0, 255), 2) cv2.imshow("ContourPicture", ContourPicture) cv2.waitKey(0)
参数2就是获得contours,参数3表示要绘制那一条轮廓,-1表示绘制全部轮廓,参数4是颜色(B/G/R通道,因此(0,0,255)表示红色),参数5表示线宽。blog
使用cv2.findContours()寻找轮廓,cv2.drawContours()绘制轮廓图片