今天学习轮廓检测方法

import cv2
import numpy as np# 展示图像,封装成函数
def cv_show_image(name, img):cv2.imshow(name, img)cv2.waitKey(0)  # 等待时间,单位是毫秒,0代表任意键终止cv2.destroyAllWindows()# 边缘检测的函数
# cv2.findContours(img, mode, method)
#       img: 输入图像,为了很高的精确度,建议使用二值图像
#       mode: RETR_EXTERNAL(只检测外部轮廓)、
#             RETR_LIST(检测所有轮廓并把结果保留到一个List中)
#             RETR_CCOMP,检测所有轮廓,并把结果包装成两层,第一层是各部分外部轮廓,第二层是空洞内部边界
#             RETR_TREE, 检测所有的轮廓,并重构嵌套轮廓的层次
# RETR_LIST 从解释的角度来看,这中应是最简单的。它只是提取所有的轮廓,而不去创建任何父子关系。
# RETR_EXTERNAL 如果你选择这种模式的话,只会返回最外边的的轮廓,所有的子轮廓都会被忽略掉。
# RETR_CCOMP 在这种模式下会返回所有的轮廓并将轮廓分为两级组织结构。
# RETR_TREE 这种模式下会返回所有轮廓,并且创建一个完整的组织结构列表。它甚至会告诉你谁是爷爷,爸爸,儿子,孙子等。
#       methord: 轮廓检测的方法
#             CHAIN_APPROX_NONE: 以freeman链码的方式输出轮廓,
#             CHAIN_APPROX_SIMPLE: 只保留终点部分,也就是对水平和垂直和倾斜的直线只保存终点。数据更少更精简。img = cv2.imread('images/contour.png')  # 转成灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, threshold = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)  # 转成二值图像
cv_show_image('binary_src_img', threshold)# contours,所有的轮廓信息,是一个list结构
# hierarchy 是一个层级结构,也是保留所有结果的一个结构
contours, hierarchy = cv2.findContours(threshold, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
print(len(contours))
print(type(contours))draw_img = img.copy()  # 拷贝一个图像出来,保留原始图像
# -1 表示全部轮廓都画出来,后面俩参数是轮廓的颜色和粗细,drawContours会在输入的图像上原地修改
res = cv2.drawContours(draw_img, contours, contourIdx=-1, color=(0, 255, 0), thickness=1)
cv_show_image('draw_contours_img', res)# 轮廓的特征
for i in range(len(contours)):cont = contours[i]print('第{}轮廓的面积是{},周长是{}', i, cv2.contourArea(cont), cv2.arcLength(cont, True))  # true封闭的# 轮廓近似
# 存在一个曲线从点A到点B,存在连线AB,曲线上存在一个点C,C到直线AB的距离d最大。如果d <= 某个阈值,那么我们可以使用AB直线直接代替曲线AB
# 如果d > 某个阈值,那么想换个曲线是不能使用AB直线代替的,那么这时候就得把曲线AB继续划分成两段,分别是曲线AC和曲线CB。进一步尝试
# 进一步尝试,看看这个曲线是否能被直线AC和直线CB代替。这个是个分治/递归的求解了。
draw_img = img.copy()
for i in range(len(contours)):cont = contours[i]epsilon = 0.03 * cv2.arcLength(cont, True)approx = cv2.approxPolyDP(cont, epsilon, True)  # 求轮廓的近似,True表示封闭的# 画出近似的轮廓,传入给drawContours的轮廓类型必须是listdraw_img = cv2.drawContours(draw_img, [approx], contourIdx=-1, color=(0, 255, 0), thickness=1)cv_show_image('approx_contours_img', draw_img)# 外界矩形
draw_img = img.copy()
for i in range(len(contours)):cont = contours[i]x,y,w,h = cv2.boundingRect(cont)  # 根据轮廓求出外接最远的矩形坐标。draw_img = cv2.rectangle(draw_img, pt1=(x,y), pt2=(x+w, y+h), color=(0, 255, 0), thickness=2)  # 画出这个矩形,会在原图上画cv_show_image('rectangle_contours_img', draw_img)# 外接圆
draw_img = img.copy()
for i in range(len(contours)):cont = contours[i](x,y), radius = cv2.minEnclosingCircle(cont)  # 根据轮廓求出外接最远的圆形圆心和半径。center = (int(x), int(y))radius = int(radius)draw_img = cv2.circle(draw_img, center=center, radius=radius, color=(0, 255, 0), thickness=2)  # 画出这个矩形,会在原图上画cv_show_image('circle_contours_img', draw_img)

原始图像如下:

画出所有轮廓:
轮廓有内部轮廓和外部轮廓,如果使用mode = RETR_EXTERNAL 可只画出外轮廓

画出所有近似轮廓:

画出所有轮廓的外接最大矩形

画出所有轮廓的外接最大圆形

【opencv学习】【轮廓检测】相关推荐

  1. OpenCV学习——轮廓检测

    前言 轮廓检测是传统视觉中非常常用的功能,这里简单记录一下opencv中的轮廓检测算法使用方法,至于理论,后续有机会再去细品. 国际惯例: OpenCV官方的轮廓检测教程python版 OpenCV中 ...

  2. 使用Opencv进行轮廓检测,字符提取,简单的直方图字符识别!

    一.使用Opencv进行轮廓检测! 所需函数: 1. cvFindContours 函数功能:从二值图像中检索轮廓,并返回检测到的轮廓的个数 函数原型: int)  cvFindContours( C ...

  3. 用实际例子详细探究OpenCV的轮廓检测函数findContours(),彻底搞清每个参数、每种模式的真正作用与含义

    关于OpenCV的轮廓检测函数findContours()各参数的大概意义,已在博文 https://blog.csdn.net/wenhao_ir/article/details/51798533中 ...

  4. OpenCV 图像轮廓检测

    本文是OpenCV图像视觉入门之路的第15篇文章,本文详细的介绍了图像轮廓检测的各种操作,例如:轮廓检索模式.轮廓逼近算子等操作. 图像轮廓是具有相同颜色或灰度的连续点的曲线,轮廓在形状分析和物体的检 ...

  5. opencv 基础(6):基于OpenCV的轮廓检测

    利用轮廓检测,我们可以检测出目标的边界,并容易地定位.它通常是许多有趣应用,如图像前景提取,简单图像分割,检测和识别. 轮廓线在计算机视觉中的应用 一些非常酷的应用程序已经建立,使用轮廓进行运动检测或 ...

  6. OPENCV图像轮廓检测

    前面在图像转换的时候学到canny算子,可以检测出图像的轮廓信息,但是,该算子检测到的轮廓信息还需要我们手动的用眼睛去识别,而实际工程应用中,我们需要得到轮廓的具体数学信息,这就涉及到今天的主题,图像 ...

  7. OpenCV之轮廓检测(检测银行卡上的黑色磁条)

    最近有需要做银行卡上黑色磁条的提取的工作.因为这是比较典型的轮廓检测问题.用DL的方法需要大量的标注数据集,所以想到用openCV来做.下面梳理一下流程: 前言 这篇博文的目的是应用计算机视觉和图像处 ...

  8. 【OpenCV】轮廓检测

    轮廓检测的作用: 1.可以检测图图像或者视频中物体的轮廓 2.计算多边形边界,形状逼近和计算感兴趣区域 先看一个较为简单的轮廓检测: import cv2 import numpy as np # 创 ...

  9. 基于OpenCV的轮廓检测(1)

    1.目标 理解什么叫做轮廓 学习如何寻找轮廓以及可视化轮廓 找出轮廓的不同特征,如面积.周长.质心.边框等 将看到许多与轮廓相关的函数. 2.什么叫做轮廓 轮廓可以简单地解释为连接所有连续点(沿着边界 ...

  10. opencv学习——轮廓分析寻找近似圆

    这是一张经过处理后的红灯的图像,我们需要找到其中的红灯,可以看到是两个圆,用霍夫圆之后发现其中调参非常麻烦,于是写了一个根据轮廓来分析圆的算法. 算法思想:findContours()找到图像的轮廓, ...

最新文章

  1. 【Android FFMPEG 开发】FFMPEG AVFrame 图像格式转换 YUV - RGBA ( 获取 SwsContext | 初始化图像数据存储内存 | 图像格式转换 )
  2. WINCE6.0在控制面板添加控制面板应用程序
  3. Linux系统查看位数和内存
  4. [Java基础]为什么会出现字符流?与编码表介绍
  5. python的标准类型内建函数_Python随手笔记之标准类型内建函数
  6. [沈航软工教学] 团队项目地址汇总
  7. matlab的输入输出常见语句
  8. CAPL学习之路-CAN有关的CAPL函数
  9. JavaScript实现累加和累乘
  10. IT架构师_隽语集(Design Thinking _0101)
  11. linux 符号执行,[原创]符号执行Symcc与模糊测试AFL结合实践
  12. 淘宝,天猫获取sku详细信息 API
  13. 控制器分析-绘制伯德图
  14. 汉语拼音工具包相关实用方法
  15. 苹果手机用的linux系统,苹果最差的手机竟是它,你有用过吗?
  16. 浅谈共享充电器电路板构造及充电原理
  17. 新相亲时代:2亿人及其背后家庭组成的“擂台”
  18. EM算法的原理推导及解释
  19. 水溶性丙烯酸树脂增稠剂,还是有点小疑惑?
  20. 数据库实验三--OpenGauss(查询和更新数据)

热门文章

  1. koa-router 源码浅析
  2. 万法归宗之Hadoop编程无界限
  3. 微软“.Net社区虚拟大会”dotnetConf2015:关键词:.NET 创新、开源、跨平台
  4. [java理论篇]--java的面向对象
  5. Oracle系列:Oracle RAC集群体系结构
  6. 一切都是骗局 Windows 8并不是很牛X
  7. SDKMAN - 一个用于轻松管理多个软件开发工具包的CLI工具
  8. Caddy,一个用Go实现的Web Server | 比Apache速度快,比Nginx有个性
  9. Spring MVC 安全示例
  10. BGP ——路由过滤+路由聚合(讲解+配置)