Opencv轮廓检测

2023-11-14

轮廓和边缘的区别

检测边缘的经典算子:sobel算子、Scharr算子、laplacian算子
在这里插入图片描述
边缘检测的一套组合操作:Canny边缘检测

  1. 使用高斯滤波器,以平滑图像,滤除噪声。

  2. 计算图像中每个像素点的梯度强度和方向。

  3. 应用非极大值(Non-Maximum Suppression)抑制,以消除边缘检测带来的杂散响应。

  4. 应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘。
    在这里插入图片描述 (双阈值的解释)

  5. 通过抑制孤立的弱边缘最终完成边缘检测。
    在这里插入图片描述
    图像轮廓是:一个整体

cv2.findContours(img,mode,method)

mode:轮廓检索模式

  • RETR_EXTERNAL :只检索最外面的轮廓;
  • RETR_LIST:检索所有的轮廓,并将其保存到一条链表当中;
  • RETR_CCOMP:检索所有的轮廓,并将他们组织为两层:顶层是各部分的外部边界,第二层是空洞的边界;
  • RETR_TREE:检索所有的轮廓,并重构嵌套轮廓的整个层次;

method:轮廓逼近方法

  • CHAIN_APPROX_NONE:以Freeman链码的方式输出轮廓,所有其他方法输出多边形(顶点的序列)。
  • CHAIN_APPROX_SIMPLE:压缩水平的、垂直的和斜的部分,也就是,函数只保留他们的终点部分。

(左边是CHAIN_APPROX_NONE,右边是CHAIN_APPROX_SIMPLE)
在这里插入图片描述

轮廓检测步骤

  1. 读入图片,并转换图片为灰度图
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  2. 使用图像阈值进行二值化(为了更好的边缘检测)
    ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
  3. 调用cv2.findContours(轮廓信息都在contours里面)
    binary, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
  4. 绘制轮廓drawContours(传入绘制图像,轮廓,轮廓索引,颜色模式,线条厚度)
    res = cv2.drawContours(draw_img, contours, -1, (0, 0, 255), 2)(-1表示所有轮廓)

轮廓特征

求轮廓面积:cv2.contourArea(cnt)
求轮廓周长:cv2.arcLength(cnt,True)
其中cnt是我取的第一条轮廓。。

轮廓近似

画出第一条轮廓

img = cv2.imread('contours2.png')

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
binary, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
cnt = contours[0]

draw_img = img.copy()
res = cv2.drawContours(draw_img, [cnt], -1, (0, 0, 255), 2)
cv_show(res,'res')

在这里插入图片描述
再进行轮廓近似操作(近似和0.15这个位置的数字取值有关)

epsilon = 0.15*cv2.arcLength(cnt,True) 
approx = cv2.approxPolyDP(cnt,epsilon,True)

draw_img = img.copy()
res = cv2.drawContours(draw_img, [approx], -1, (0, 0, 255), 2)
cv_show(res,'res')

在这里插入图片描述

原理

AB的曲线用直线近似
在这里插入图片描述

  1. 在曲线AB上做直线的垂线,取垂直距离最大的点为C
  2. 如果垂直距离小于阈值,就可以进行轮廓近似
  3. 如果垂线大于阈值,再进行二分法的拆分,再循环2操作。

在这里插入图片描述
在这里插入图片描述

之前代码里的那个数字(0.15)就是阈值(这下就透彻了。。。)

轮廓的外接矩形

cv2.boundingRect(cnt)

cv2.rectangle 这个函数的作用是在图像上绘制一个简单的矩形

img = cv2.imread('contours.png')
cv_show(img,'img')

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
binary, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
cnt = contours[0]

x,y,w,h = cv2.boundingRect(cnt)
img = cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
cv_show(img,'img')

在这里插入图片描述 在这里插入图片描述

轮廓的外接圆

(x,y),radius = cv2.minEnclosingCircle(cnt) 
center = (int(x),int(y)) 
radius = int(radius) 
img = cv2.circle(img2,center,radius,(0,255,0),2)
cv_show(img,'img')

在这里插入图片描述 在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Opencv轮廓检测 的相关文章

随机推荐

  • python使用t-sne算法降维,方便可视化

    常用的降维算法有LDA PCA 但通常为了方便可视化 我们使用t sne降维算法 PCA的算法可以参考 异常检测2 PCA异常检测 t san的算法可以参考 t SNE算法 示例代码 import pandas as pd import m
  • 超详细的html+css基础知识树状图~HTML标签

    前言 学习任何新知识 最重要的永远都是搭建属于自己的知识框架 随后学习的细碎知识点往框架里面填入 最后形成一棵属于自己的知识大树 本系列的博客专注更新总结好的思维导图 希望可以帮助大家快速理清知识结构 具体知识树状图 一 HTML标签 1
  • java jinfo_JDK工具-Jinfo命令

    Jinfo是JDK自带Java配置信息工具 位于java的bin目录下 jinfo的作用是实时地查看和调整虚拟机的各项参数 虽然使用Jps命令的 v参数可以查看虚拟机启动时显示指定的参数列表 但是如果想要知道没有被明确指出的系统默认值 就需
  • linux编译安装含义,linux源码包编译安装详解

    linux下安装软件包有两种方法 源文件编译安装 source 和 rpm 安装 1 源文件包安装的通用方法 一般安装源代码的程序你得要看它的README 一般在它的目录下都有的 01 配置 构建应用的第一步就是执行configure脚本
  • OpenCV-Python实战(2)——图像与视频文件的处理

    OpenCV Python实战 2 图像与视频文件的处理 0 前言 1 图像与视频文件处理基础 2 图像的读取与写入 2 1 在 OpenCV 中读取图像 2 2 使用 OpenCV 写入图像 2 3 计算机视觉项目处理流程示例 3 读取相
  • jQuery最佳实践:如何用好jQuery

    一 用对选择器 在jQuery中 你可以用多种选择器 选择同一个网页元素 每种选择器的性能是不一样的 你应该了解它们的性能差异 1 最快的选择器 id选择器和元素标签选择器 举例来说 下面的语句性能最佳 id form 遇到这些选择器的时候
  • 2.11 PID控制算法(三)----PID结果与实际值的关联

    文章目录 1 讲解 2 举例1 3 举例2 4 举例3 5 调试PID参数 1 讲解 1 AD采样 经过PID计算的值 怎么和PWM对应起来 2 电机编码采样 经过PID计算的值 怎么与速度对应起来 这个简单 PID控制原理就是输出一个控制
  • STL详解 - 容器(03) — vector容器

    目录 第3章 vector容器 3 1 vector容器简介 3 2 vector容器函数成员 3 3 vector构造函数 3 4 vector常用赋值操作 3 5 vector大小操作 3 6 vector数据存取操作 3 7 vect
  • 解决java.lang.NoClassDefFoundError: sun/misc/BASE64Decoder错误

    问题背景 最近在项目里需要对jdbc properties文件中的明文信息进行加密 所以接触到加密解密相关的操作 在进行编码转换的过程中 遇到了BASE64Decoder错误 解决思路 使用 import org apache common
  • springboot实战---记账本项目

    项目放在了服务器上 点我访问项目 root权限账号密码 root root 普通用户账号密码 user 123456 登陆界面预览 主页面预览 只做了一个页面的增删改查 使用springboot mybatis shiro layui 我使
  • 【使用autoware中的标定工具包进行相机和激光雷达联合标定】

    使用autoware中的标定工具包进行相机和激光雷达联合标定 一 工具安装 1 catkin make Could not find the required component jsk recognition msgs 2 catkin
  • 结构方程模型-中介效应检验(Amos)

    一 中介效应含义 考虑自变量X对因变量Y的影响 如果X通过影响变量M N等其它变量而对Y产生影响 则称M N等为中介变量 下图展示了X通过M最终到Y的过程 a表示X到M的系数 b表示M到Y的系数 c表示X到Y的总效果 c 表示X到Y的直接效
  • 关于android studio 新建项目 是否勾选 use legacy android.support libraries

    android studio 新建项目 是否勾选 use legacy android support libraries 不要勾选 这个勾选后的作用是使用以前老版本的功能库 勾选后你再使用新版本的功能库就会报错 所以说不要勾选
  • vs code代码格式化配置

    安装 Prettier Code formatter 点击左下角 设置 gt 设置 gt 右上角 打开设置 按钮 gt 打开 settings json 左侧目录不折叠 explorer compactFolders false 选择格式化
  • 经常用到的linux中的命令

    1 硬盘容量 首先fdisk l看下有几个分区 然后df lh看下每个分区的剩余空间 2
  • 自动操作软件 获取软件按钮内容 UIAutomation 软件自动化测试(我的一点补充)

    近期玩了下 UIAutomation C 中有 UI Automation 库 C 可以看msdn的 Accessibility 这两个东西网上能找到的东西太少了 只能自己看微软的官方文档 我把我的一些代码段贴到下面 希望能帮助需要的人 P
  • 开发卡牌gamefi游戏需要多少钱?

    卡牌游戏作为一种受欢迎的游戏形式 吸引了众多开发者的关注 然而 开发一款成功的卡牌游戏需要全面考虑多个方面的因素 其中之一就是资金投入 本文将从专业性和投入回报的角度 探讨开发一款卡牌游戏所需的资金投入 一 专业性的重要性 1 游戏策划和设
  • Mybatis通用Mapper和自动代码生成

    一 通用Mapper配置 1 依赖jar包 tk mybatismapper3 2 0 2 Mapper需要继承 Mapper例如 import tk mybatis mapper common Mapper public interfac
  • 一夜爆红的BeReal,到底是年轻人的叛逆还是社交的新潮向?

    一款名为BeReal的社交产品 正在海外以火箭般的速度蹿红 2022年第一季度 其月活用户数暴增315 一度在美国 法国 英国 西班牙等多个地区的AppStore里排名前十 目前的累计下载量已经超过1000万 其中80 的用户年龄在16到2
  • Opencv轮廓检测

    轮廓检测 轮廓和边缘的区别 cv2 findContours img mode method 轮廓检测步骤 轮廓特征 轮廓近似 原理 轮廓的外接矩形 轮廓的外接圆 轮廓和边缘的区别 检测边缘的经典算子 sobel算子 Scharr算子 la