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
2524168987312

3)轮廓线的颜色查询网站。十六进制颜色码 < - > 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颜色值 <---->  十六进制颜色码

OpenCV 学习笔记03 findContours函数的更多相关文章

  1. OpenCV 学习笔记03 drawContours函数

    opencv-python   4.0.1 轮廓的绘制或填充. cv2.drawContours(image, contours, contourIdx, color[, thickness[, li ...

  2. OpenCV 学习笔记03 threshold函数

    opencv-python   4.0.1 简介:该函数是对数组中的每一个元素(each array element)应用固定级别阈值(Applies a fixed-level threshold) ...

  3. OpenCV 学习笔记03 边界框、最小矩形区域和最小闭圆的轮廓

    本节代码使用的opencv-python 4.0.1,numpy 1.15.4 + mkl 使用图片为 Mjolnir_Round_Car_Magnet_300x300.jpg 代码如下: impor ...

  4. OpenCV 学习笔记03 boundingRect、minAreaRect、minEnclosingCircle、boxPoints、int0、circle、rectangle函数的用法

    函数中的代码是部分代码,详细代码在最后 1 cv2.boundingRect 作用:矩形边框(boundingRect),用于计算图像一系列点的外部矩形边界. cv2.boundingRect(arr ...

  5. OpenCV 学习笔记03 凸包convexHull、道格拉斯-普克算法Douglas-Peucker algorithm、approxPloyDP 函数

    凸形状内部的任意两点的连线都应该在形状里面. 1 道格拉斯-普克算法 Douglas-Peucker algorithm 这个算法在其他文章中讲述的非常详细,此处就详细撰述. 下图是引用维基百科的.ε ...

  6. opencv学习笔记之cvSobel 函数解析

    首先,我们来开一下计算机是如何检测边缘的.以灰度图像为例,它的理论基础是这样的,如果出现一个边缘,那么图像的灰度就会有一定的变化,为了方便假设由黑渐变为白代表一个边界,那么对其灰度分析,在边缘的灰度函 ...

  7. OpenCV 学习笔记03 直线和圆检测

    检测边缘和轮廓不仅重要,还经常用到,它们也是构成其他复杂操作的基础. 直线和形状检测与边缘和轮廓检测有密切的关系. 霍夫hough 变换是直线和形状检测背后的理论基础.霍夫变化是基于极坐标和向量开展的 ...

  8. 【opencv学习笔记】SetImageROI函数设置ROI区域的作用及用法

    虽然先前知道ROI区域是感兴趣区域,但是真正看到调用了OpenCV的cvSetImageROI函数时,并不知道它的作用,所以还是单独写了一段代码对这个函数进行探究.   OpenCVchm文档中对cv ...

  9. OpenCV学习笔记:resize函数改变图像的大小

    OpenCV提供了resize函数来改变图像的大小,函数原型如下: , , int interpolation=INTER_LINEAR ); 参数解释: src:输入,原图像,即待改变大小的图像: ...

随机推荐

  1. python绘制很美丽的图表

    或许你会觉得python不适合做图形界面的开发,的确如此.可是python却有一个非常美丽的图标模块:pycha,废话少说,先上图,各位看一下. 是不是效果还不错呢,当然这仅仅是一小部分图表,还有其它 ...

  2. Android 自定义 ListView 显示网络上 JSON 格式歌曲列表

    本文内容 环境 项目结构 演示自定义 ListView 显示网络上 JSON 歌曲列表 参考资料 本文最开始看的是一个国人翻译的文章,没有源代码可下载,根据文中提供的代码片段,自己新建的项目(比较可恶 ...

  3. 【转】Java设计模式之《享元模式》及应用场景

    享元模式:“享”就是分享之意,指一物被众人共享,而这也正是该模式的终旨所在. 享元模式有点类似于单例模式,都是只生成一个对象来被共享使用.这里有个问题,那就是对共享对象的修改,为了避免出现这种情况,我 ...

  4. ZH奶酪:利用CSS将checkbox选项放大

    在Hybrid App开发过程中,html中默认的checkbox选项在手机屏幕上显得比较小,app不能像web page那样放大缩小,所以要通过CSS将checkbox选项放大: 例如HTML代码: ...

  5. linux下时间有关的函数和结构体

    1.时间类型.Linux下常用的时间类型有6个:time_t,struct timeb, struct timeval,struct timespec,clock_t, struct tm. (1) ...

  6. 【Zookeeper】源码分析之请求处理链(三)之SyncRequestProcessor

    一.前言 在分析了PrepRequestProcessor处理器后,接着来分析SyncRequestProcessor,该处理器将请求存入磁盘,其将请求批量的存入磁盘以提高效率,请求在写入磁盘之前是不 ...

  7. SpringMVC学习笔记二:常用注解

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6831976.html  参考:http://www.cnblogs.com/leskang/p/5445698 ...

  8. CENTOS7更换YUM源为163源

    访问地址为:http://mirrors.163.com/.help/centos.html 首先备份源: mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum. ...

  9. Xcode7安装CocoaPods

    一.CocoaPods介绍以及优点 CocoaPods 是开发 OS X 和 iOS 应用程序的一个第三方库的依赖管理工具.该项目源代码在Github上管理. 通过 CocoaPods,能够非常方便的 ...

  10. 一张图弄明确开源协议-GPL、BSD、MIT、Mozilla、Apache和LGPL 之间的差别

    导读 在开源软件中常常看到各种协议说明.GPL.BSD.MIT.Mozilla.Apache和LGPL. - 这些协议之间的有什么差别 - 怎样选择合适的开源协议 请看下文,特作记录一篇,以供兴许查看 ...