【opencv学习】【轮廓检测】
今天学习轮廓检测方法
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学习】【轮廓检测】相关推荐
- OpenCV学习——轮廓检测
前言 轮廓检测是传统视觉中非常常用的功能,这里简单记录一下opencv中的轮廓检测算法使用方法,至于理论,后续有机会再去细品. 国际惯例: OpenCV官方的轮廓检测教程python版 OpenCV中 ...
- 使用Opencv进行轮廓检测,字符提取,简单的直方图字符识别!
一.使用Opencv进行轮廓检测! 所需函数: 1. cvFindContours 函数功能:从二值图像中检索轮廓,并返回检测到的轮廓的个数 函数原型: int) cvFindContours( C ...
- 用实际例子详细探究OpenCV的轮廓检测函数findContours(),彻底搞清每个参数、每种模式的真正作用与含义
关于OpenCV的轮廓检测函数findContours()各参数的大概意义,已在博文 https://blog.csdn.net/wenhao_ir/article/details/51798533中 ...
- OpenCV 图像轮廓检测
本文是OpenCV图像视觉入门之路的第15篇文章,本文详细的介绍了图像轮廓检测的各种操作,例如:轮廓检索模式.轮廓逼近算子等操作. 图像轮廓是具有相同颜色或灰度的连续点的曲线,轮廓在形状分析和物体的检 ...
- opencv 基础(6):基于OpenCV的轮廓检测
利用轮廓检测,我们可以检测出目标的边界,并容易地定位.它通常是许多有趣应用,如图像前景提取,简单图像分割,检测和识别. 轮廓线在计算机视觉中的应用 一些非常酷的应用程序已经建立,使用轮廓进行运动检测或 ...
- OPENCV图像轮廓检测
前面在图像转换的时候学到canny算子,可以检测出图像的轮廓信息,但是,该算子检测到的轮廓信息还需要我们手动的用眼睛去识别,而实际工程应用中,我们需要得到轮廓的具体数学信息,这就涉及到今天的主题,图像 ...
- OpenCV之轮廓检测(检测银行卡上的黑色磁条)
最近有需要做银行卡上黑色磁条的提取的工作.因为这是比较典型的轮廓检测问题.用DL的方法需要大量的标注数据集,所以想到用openCV来做.下面梳理一下流程: 前言 这篇博文的目的是应用计算机视觉和图像处 ...
- 【OpenCV】轮廓检测
轮廓检测的作用: 1.可以检测图图像或者视频中物体的轮廓 2.计算多边形边界,形状逼近和计算感兴趣区域 先看一个较为简单的轮廓检测: import cv2 import numpy as np # 创 ...
- 基于OpenCV的轮廓检测(1)
1.目标 理解什么叫做轮廓 学习如何寻找轮廓以及可视化轮廓 找出轮廓的不同特征,如面积.周长.质心.边框等 将看到许多与轮廓相关的函数. 2.什么叫做轮廓 轮廓可以简单地解释为连接所有连续点(沿着边界 ...
- opencv学习——轮廓分析寻找近似圆
这是一张经过处理后的红灯的图像,我们需要找到其中的红灯,可以看到是两个圆,用霍夫圆之后发现其中调参非常麻烦,于是写了一个根据轮廓来分析圆的算法. 算法思想:findContours()找到图像的轮廓, ...
最新文章
- 【Android FFMPEG 开发】FFMPEG AVFrame 图像格式转换 YUV - RGBA ( 获取 SwsContext | 初始化图像数据存储内存 | 图像格式转换 )
- WINCE6.0在控制面板添加控制面板应用程序
- Linux系统查看位数和内存
- [Java基础]为什么会出现字符流?与编码表介绍
- python的标准类型内建函数_Python随手笔记之标准类型内建函数
- [沈航软工教学] 团队项目地址汇总
- matlab的输入输出常见语句
- CAPL学习之路-CAN有关的CAPL函数
- JavaScript实现累加和累乘
- IT架构师_隽语集(Design Thinking _0101)
- linux 符号执行,[原创]符号执行Symcc与模糊测试AFL结合实践
- 淘宝,天猫获取sku详细信息 API
- 控制器分析-绘制伯德图
- 汉语拼音工具包相关实用方法
- 苹果手机用的linux系统,苹果最差的手机竟是它,你有用过吗?
- 浅谈共享充电器电路板构造及充电原理
- 新相亲时代:2亿人及其背后家庭组成的“擂台”
- EM算法的原理推导及解释
- 水溶性丙烯酸树脂增稠剂,还是有点小疑惑?
- 数据库实验三--OpenGauss(查询和更新数据)
热门文章
- koa-router 源码浅析
- 万法归宗之Hadoop编程无界限
- 微软“.Net社区虚拟大会”dotnetConf2015:关键词:.NET 创新、开源、跨平台
- [java理论篇]--java的面向对象
- Oracle系列:Oracle RAC集群体系结构
- 一切都是骗局 Windows 8并不是很牛X
- SDKMAN - 一个用于轻松管理多个软件开发工具包的CLI工具
- Caddy,一个用Go实现的Web Server | 比Apache速度快,比Nginx有个性
- Spring MVC 安全示例
- BGP ——路由过滤+路由聚合(讲解+配置)