OpenCV 学习笔记03 findContours函数 |
您所在的位置:网站首页 › find和finds › OpenCV 学习笔记03 findContours函数 |
opencv-python 4.0.1 1 函数释义词义:发现轮廓! 从二进制图像中查找轮廓(Finds contours in a binary image);轮廓是形状分析和物体检测和识别的有用工具。 findContours(image, mode, method[, contours[, hierarchy[, offset]]]) -> contours, hierarchy参数 image - 一个8位单通道二值图像(非0即1)。非零像素视为1、零像素依然为0, 因此图像被视为二进制。也可使用compare()、inRange()、threshold()、adaptiveThreshold()、Canny()等函数从灰度图或彩色图中创建二进制图像。若 mode 等于 #RETR_CCOMP 或 #RETR_FLOODFILL,则输入也可以是标签的32位整数图像(CV_32SC1)。 mode - 轮廓检索模式 CV.RETR_EXTERNAL - 仅检索外轮廓。并为所有轮廓设置层级结构,如 sets hierarchy[i][2]=hierarchy[i][3]=-1 CV.RETR_LIST - 检索轮廓但不建立任何层次关系。 CV.RETR_CCOMP - 检索所有轮廓并将它们组织成两级层次结构。上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层。 CV.RETR_TREE - 检索所有轮廓并建立等级树结构的轮廓,具体演示参考contours.c这个demo
method - 轮廓近似方法 CV.CHAIN_APPROX_NONE - 存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即max(abs(x1-x2),abs(y2-y1))==1 CV.CHAIN_APPROX_SIMPLE - 压缩水平、垂直、对角线方向的元素,仅留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息 CV.CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS - 使用teh-Chinl 链式近似算法
offset - 每个轮廓点的偏移量。若从image ROI中提取轮廓,则应基于整个图像进行分析 返回值 contours - 检测到的轮廓,列表list形式,list 中每个元素都是图像中的一个轮廓,这里的每一个元素仍为(点)向量。 hierarchy - 它和轮廓 contours 个数相同(可选结果),这是一个 ndarray,其中元素个数和轮廓个数相同。每个轮廓 contours[i] 对应 4 个 hierarchy 元素 hierarchy[i][0] ~ hierarchy[i][3],分别表示后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号,如果没有对应项,则该值为负数。(各个轮廓的继承关系。hierarchy也是一个向量,长度和contours相等,每个元素和contours的元素对应。hierarchy的每个元素是一个包含四个整型数的向量) 注意: Source image is modified by this function. 该函数会修改输入的图像,故建议使用原始图像的副本,所以在代码中常用 img.copy() 来作为输入图像。 2 示例 2.1 简单代码帮助理解函数 findcontours 和 drawcontours import cv2 import numpy as np # 绘制图像(在黑中绘制出一个白色方块) img = np.zeros((200,200),dtype = np.uint8) img[50:150, 50:150] = 255 # 对img进行阈值/二值化操作 re_thresh,re_img = cv2.threshold(img,127,255,0) # 轮廓检测 contours, hierarchy = cv2.findContours(re_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) # 将灰度图转为BGR图 color = cv2.cvtColor(re_img, cv2.COLOR_GRAY2BGR) # 绘制轮廓线 cv2.drawContours(color, contours, -1, (0,255,0), 2) cv2.imshow('img',color) cv2.waitKey() cv2.destroyAllWindows()备注: 1)这里必须将灰度图转为彩色图(例如该例中的BGR),若无,则无法绘制轮廓线。 2)下面代码语句是等效的,因函数 drawContours() 会修改原 image 值(等于返回值), cv2.drawContours(color1, contours, -1, (0,255,0), 2) color2 = cv2.drawContours(color, contours, -1, (0,255,0), 2) print(id(color1)) print(id(color2))运行 2524168987312 25241689873123)轮廓线的颜色查询网站。十六进制颜色码 < - > RGB颜色值 4)该代码来源于《OpenCV 3 计算机视觉 - python语言实现(原书第二版)》第45页 3.8 轮廓检测 内容,该段代码可能是OpenCV 版本的差异,运行时已经报错,问题在于我用的opencv-python 为4.0.1版本,返回值有两个,而书中的返回值是 3 个。 ValueError: not enough values to unpack (expected 3, got 2) 2.2 简单图像检测绘制一张图表
编制一段代码对其进行轮廓检测。 两种导入的思路,一种将图片以灰度图形式导入,另一种是正常导入,然后cvtColor()灰度处理。当然,这不是本节内容重点,仅作为小插曲。 import cv2 # 以灰度图形式读取图片数据 img = cv2.imread('picture_white.png',0) img = img.copy() # 图像二进制阈值化处理 ret, binary_img = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY) # 轮廓检测 contours, hierarchy = cv2.findContours(binary_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) # 转为BGR彩色图 bgr_img = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR) # 绘制轮廓图 cv2.drawContours(bgr_img, contours, -1, (0,0,255), 3) cv2.imshow('img', bgr_img) cv2.waitKey(0) cv2.destroyAllWindows()另一种 import cv2 # 直接读取图像数据 im = cv2.imread('picture_white.png') im = im.copy() # 图像灰度处理 gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY) # 将灰度图进行二进制阈值化 ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) # 轮廓检测 contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) # 绘制轮廓线 cv2.drawContours(im, contours, -1, (0,0,255), 3) cv2.imshow('img', im) cv2.waitKey(0) cv2.destroyAllWindows()运行结果
同样的代码检测下图的对比 参考: OpenCV 学习笔记03 findContours函数 轮廓检测 opencv图像轮廓 Opencv笔记——findContours函数 RGB颜色值 十六进制颜色码
|
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |