当前位置: 首页 > article >正文

opencv-第四章:图像轮廓检测

OpenCV-计算机视觉技术林伟鹏版第四章图像轮廓检测文章目录OpenCV-计算机视觉技术林伟鹏版前言一、图像轮廓检测概念1.概念二、图像轮廓检测1.图像二值化转换2.图像轮廓匹配3.二值图轮换轮廓检测4.图像轮廓检测凸包5.多边形轮廓检测前言本博客将教会大家如何使用opencv做一些基础内容一、图像轮廓检测概念1.概念二、图像轮廓检测1.图像二值化转换代码如下环境需要opencv,在jupyter中运行参考之前文章概念了解#二值图转换 import cv2 imgcv2.imread(1.png)imgraycv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#将图像由BGR彩色转化为灰度图像 _,threshcv2.threshold(imgray,127,225,cv2.THRESH_TOZERO)cv2.imshow(threshold,thresh)cv2.waitKey()其中threshold有多种不同方式进行阈值二值化处理如下图所示2.图像轮廓匹配代码如下环境需要opencv,在jupyter中运行参考之前文章概念了解计算方式#轮廓匹配 能使用颜色标注出我们给定的轮廓importcv2 notation_imagecv2.imread(4.png,cv2.IMREAD_COLOR)notation_map_imagecv2.imread(5.png,cv2.IMREAD_COLOR)#下面将图像进行灰度处理notation_graycv2.cvtColor(notation_image,cv2.COLOR_BGR2GRAY)notation_map_graycv2.cvtColor(notation_map_image,cv2.COLOR_BGR2GRAY)#将灰度处理的图像进行二值化处理_,notation_thresholdcv2.threshold(notation_gray,130,255,cv2.THRESH_BINARY)_,notation_map_thresholdcv2.threshold(notation_map_gray,130,255,cv2.THRESH_BINARY)notation_contours,_cv2.findContours(notation_threshold,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)notation_map_contours,_cv2.findContours(notation_map_threshold,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)#设置轮廓匹配阈值thres2.0foriinrange(len(notation_map_contours)):retvalcv2.matchShapes(notation_contours[0],notation_map_contours[i],cv2.CONTOURS_MATCH_I3,0.0)#notation_contours[0]表示对比的目标轮廓点集1也就是我们要匹配的轮廓我们要找张这样的轮廓#notation_map_contours[i] 表示对比的目标轮廓点集2也是我们要在这里面找和我们匹配的轮廓#第三个参数表示轮廓的比较方式方式分为三种分别为cv2.CONTOURS_MATCH_I1cv2.CONTOURS_MATCH_I2# cv2.CONTOURS_MATCH_I3。这三种方式都是对轮廓的Hu矩进行差异运算# Hu矩可以理解为轮廓的基本属性其具有平移、旋转和尺度不变性的图像特征#匹配轮廓ifretvalthres:#判断匹配后的阈值是否与我们设置的初始阈值大小关系#匹配成功将匹配上图像进(255,255,0)颜色标注print(index:%d retval: %f if is matched%(i,retval))cv2.drawContours(notation_map_image,notation_map_contours,i,(255,255,0),2)else:#匹配失败将匹配失败图像使用(0,0,255) 红色进行标注print(index:%d retval: %f if is not matched%(i,retval))cv2.drawContours(notation_map_image,notation_map_contours,i,(0,0,255),2)cv2.imshow(matched,notation_map_image)cv2.waitKey()3.二值图轮换轮廓检测代码如下环境需要opencv,在jupyter中运行参考之前文章概念了解计算方式#二值图转换轮廓检测importcv2importnumpyasnpimportrandom#本例中无须使用回调函数故回调函数为空defonChange(x):pass#使用imread 读取图片默认加载彩色的imgcv2.imread(1.jpg,cv2.IMREAD_COLOR)#将彩色图像使用cvtColor函数转化为 gray灰度图像graycv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#我们使用高斯滤波进行处理一下 使用的 3,3 标准核大小blurcv2.GaussianBlur(gray,(3,3),0)# 创建一个名字为findContours的窗口cv2.namedWindow(findContours)#创建一个 滑动条 滑动条的值域范围 是 20,255滑动条的名称为threshold#滑动条在什么地方呢滑动条在我们这个findContours窗口上cv2.createTrackbar(threshold,findContourschuangk,20,s255,onChange)#整体while循环这个循环作用# 让我们大家可以直观的感受到我们调整了滑动条设置域值变化对图像影响while(True):#创建一个 全一矩阵black255*np.ones(dtypenp.uint8,shapeimg.shape)#获取我们滑动条的 上面显示的数值将这个数值传给我们的thresthrescv2.getTrackbarPos(threshold,findContours)#进行我们的二值图转换#gray 是输入灰度图像要处理的图像#thres 我们滑动条控制的域值#255 表示我们的最大值 就是 二值图 的像素如果超过了thres就变成255#THRESH_BINARY二值话类型的 方法 表示超过阈值设为最大值否则为0。_,edgescv2.threshold(gray,thres,255,cv2.THRESH_BINARY)#轮廓检测#edges 表示我们输入的 二值化处理后的图像#cv2.RETR_TREE 表示我们检测轮廓的模式 检测所有轮廓建立完整的层级关系# 表示我们计算轮廓的近似方法使用的是这个方法contours,_cv2.findContours(edges,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)#绘制轮廓图#drawContours 中的 black表示 我们要绘制的图像foriinrange(len(contours)):color(random.randint(0,255),random.randint(0,255),random.randint(0,255))cv2.drawContours(black,contours,i,color,2)#轮廓绘制cv2.imshow(findContours,img)cv2.imshow(Contours,black)ifcv2.waitKey(100)27:break颜色随机展示4.图像轮廓检测凸包代码如下环境需要opencv,在jupyter中运行参考之前文章概念了解#多边形轮廓检测importcv2importnumpyasnpimportrandom#回调函数本例中无须使用故为空defonChange(x):passimgcv2.imread(4.jfif,cv2.IMREAD_COLOR)graycv2.cvtColor(img,cv2.COLOR_BGR2GRAY)blurcv2.GaussianBlur(gray,(15,15),0)cv2.namedWindow(polygonContours)cv2.createTrackbar(epsilon,polygonContours,10,200,onChange)cv2.createTrackbar(threshold,polygonContours,120,255,onChange)while(True):epsiloncv2.getTrackbarPos(epsilon,polygonContours)threscv2.getTrackbarPos(threshold,polygonContours)_,threshcv2.threshold(blur,thres,255,cv2.THRESH_BINARY)contours,hiercv2.findContours(thresh,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)frameimg.copy()forcincontours:#对轮廓进行多边形逼近approxcv2.approxPolyDP(c,epsilon,True)cv2.drawContours(frame,[approx],-1,(255,0,255),2)#检测图形边界框并绘制x,y,w,hcv2.boundingRect(approx)cv2.rectangle(frame,(x,y),(xw,yh),(0,255,0),3)#检测最小封闭区间(矩形并绘制rectcv2.minAreaRect(approx)boxcv2.boxPoints(rect)boxnp.intp(box)cv2.drawContours(frame,[box],0,(0,0,255),3)#检测最小封闭区间圆形并绘制(x,y),radiuscv2.minEnclosingCircle(approx)center(int(x),int(y))radiusint(radius)cv2.circle(frame,center,radius,(255,0,0),2)#轮廓绘制cv2.imshow(polygonContours,frame)ifcv2.waitKey(100)27:break5.多边形轮廓检测#多边形轮廓检测importcv2importnumpyasnpimportrandom#回调函数本例中无须使用故为空defonChange(x):pass#imread读取图像 cv2.IMREAD_COLOR读取彩色图像imgcv2.imread(4.jfif,cv2.IMREAD_COLOR)#将彩色图像转化为灰度图像graycv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#进行高斯滤波处理blurcv2.GaussianBlur(gray,(15,15),0)#创建一个窗口名字为polygonContourscv2.namedWindow(polygonContours)#创建两个滑动条 一个叫 epsilon 一个叫threshold 两个都在上述这个窗口中cv2.createTrackbar(epsilon,polygonContours,10,200,onChange)cv2.createTrackbar(threshold,polygonContours,120,255,onChange)while(True):#epsilon和这个thres是分别获取两个滑动条的值epsiloncv2.getTrackbarPos(epsilon,polygonContours)threscv2.getTrackbarPos(threshold,polygonContours)#这里就根据我们要二值处理的 rhres这个参数传入进行二值处理作为判断的阈值_,threshcv2.threshold(blur,thres,255,cv2.THRESH_BINARY)#寻找轮廓处理contours,hiercv2.findContours(thresh,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)frameimg.copy()forcincontours:#对轮廓进行多边形逼近#approxPolyDP#第一个表示我们输出轮廓的 点集#第二个参数表示 逼近精度 值越小 表面逼近精度越精确值越大表面轮廓越简化#true 表示多边形是闭合的approxcv2.approxPolyDP(c,epsilon,True)#表示绘制我们多边形逼近结果cv2.drawContours(frame,[approx],-1,(255,0,255),2)#检测图形边界框并绘制#boundingRect 绘制我们的矩形外框 绿色x,y,w,hcv2.boundingRect(approx)cv2.rectangle(frame,(x,y),(xw,yh),(0,255,0),3)#检测最小封闭区间(矩形并绘制#minAreaRect 绘制最小外接矩阵红色rectcv2.minAreaRect(approx)boxcv2.boxPoints(rect)boxnp.intp(box)cv2.drawContours(frame,[box],0,(0,0,255),3)#检测最小封闭区间圆形并绘制#minEnclosingCircle 绘制最小外接圆蓝色(x,y),radiuscv2.minEnclosingCircle(approx)center(int(x),int(y))radiusint(radius)cv2.circle(frame,center,radius,(255,0,0),2)#轮廓绘制cv2.imshow(polygonContours,frame)ifcv2.waitKey(100)27:break在这里插入图片描述

相关文章:

opencv-第四章:图像轮廓检测

OpenCV-计算机视觉技术(林伟鹏版) 第四章:图像轮廓检测 文章目录OpenCV-计算机视觉技术(林伟鹏版)前言一、图像轮廓检测概念1.概念二、图像轮廓检测1.图像二值化转换2.图像轮廓匹配3.二值图轮换轮廓检测4.图像轮廓检测…...

多模型聚合平台在应对单一服务波动时的体验差异

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 多模型聚合平台在应对单一服务波动时的体验差异 在构建依赖大模型能力的应用时,开发者常常面临一个现实挑战&#xff1…...

FreeRTOS日志任务设计----LogTask 日志任务

🎬 渡水无言:个人主页渡水无言 ❄专栏传送门: 《linux专栏》《嵌入式linux驱动开发》《linux系统移植专栏》 ❄专栏传送门: 《freertos专栏》 《STM32 HAL库专栏》《linux裸机开发专栏》 ❄专栏传送门:《产品测评专栏》…...

将串口打印的日志,同时备份到sd卡里

将串口打印的日志&#xff0c;同时备份到sd卡里#include <stdio.h> #include <unistd.h> #include <pthread.h> #include <string.h> #include <stdlib.h> #include <errno.h>static int pipe_fd[2] {-1, -1};static int stdout_backup …...

如何做变量操作化:从抽象概念到测量指标

一、理解变量&#xff1a;科研的基石在深入操作化之前&#xff0c;我们首先要明确“变量”在定量研究中的定义。变量&#xff08;Variable&#xff09;指的是个体或组织的特征或属性&#xff0c;这些特征可以被研究者测量或观察&#xff0c;并且在不同个体或组织之间存在差异。…...

争分夺秒与步步为营:Infoseek舆情系统如何重构危机响应的时间哲学

“黄金4小时”甚至“黄金1小时”&#xff0c;是公关行业奉行的铁律。然而&#xff0c;为了追求速度而仓促发出的声明&#xff0c;常常因为事实核查不清、逻辑存在漏洞或情感表达不当&#xff0c;引发更猛烈的“二次翻车”。这种“翻车”对企业公信力的伤害&#xff0c;往往比原…...

别让直觉带路:Infoseek视角下的噪音过滤与火情预警实战

在舆情的世界里&#xff0c;最可怕的不是对手太强大&#xff0c;而是自己吓自己。很多时候&#xff0c;企业之所以“翻车”&#xff0c;并非因为危机本身不可控&#xff0c;而是因为公关团队在面对网友吐槽时过度敏感&#xff0c;发布了不必要的声明或做出了过激反应&#xff0…...

C语言(8) 函数

第五章 函数一段功能代码&#xff0c;被称为函数1. 为了避免代码的重复。 复用性。 开发不用从头开始(库函数)。 2. 模块化的思想 。 大问题&#xff0c;分解成小问题&#xff0c;逐个解决。 设计函数 &#xff0c;高内聚&#xff0c;低耦合。 功能越单一越好 &#xff0c;对外…...

半导体制造中OPC技术与蚀刻偏差的挑战与创新

1. 半导体制造中的OPC技术演进与蚀刻偏差挑战在28nm及更先进制程节点中&#xff0c;光学邻近效应校正(OPC)技术面临着前所未有的精度挑战。我曾在某次技术攻关中亲眼见证&#xff1a;当特征尺寸缩小到40nm以下时&#xff0c;单纯的光学模型校正误差会突然呈现非线性增长。这种现…...

手把手教你用PyTorch复现EfficientNetV2(附完整代码):从网络搭建到渐进式训练全流程

从零实现EfficientNetV2&#xff1a;代码级解析与渐进式训练实战 当你第一次翻开EfficientNetV2论文时&#xff0c;那些复杂的复合缩放系数和渐进式训练策略可能让人望而生畏。但别担心——本文将带你用PyTorch从最基础的卷积模块开始&#xff0c;逐层构建这个高效的视觉模型。…...

(B站TinyML教程学习笔记)C8 edge impulse 快速入门+C9 数据提取+C10 运动数据的特征提取

0:06 - 1:00 为什么使用 Edge Impulse 常见机器学习开发方式 传统机器学习通常会使用&#xff1a; TensorFlowScikit-learn 这些框架功能强大&#xff0c;但&#xff1a; 学习成本高需要写大量代码对嵌入式开发者不太友好 Edge Impulse 的作用 Edge Impulse 核心特点&am…...

2002-2024年 人工智能发展能壮大耐心资本吗

本文基于2002-2024年上市公司数据&#xff0c;借鉴《人工智能发展能壮大耐心资本吗&#xff1f; ——来自国家新一代人工智能创新发展试验区的经验证据》一文中的变量构建与基准回归部分&#xff0c;探讨人工智能发展能否培育壮大耐心资本&#xff0c;含原始数据、处理代码、实…...

1986-2025年上市公司高校专利知识溢出

高校专利知识溢出&#xff0c;是衡量企业所处省份外部知识环境与高校创新资源外溢程度的重要指标。对于企业尤其是技术密集型企业而言&#xff0c;其创新活动不仅依赖内部研发投入&#xff0c;也深受所在地区知识基础、科研资源和学术创新氛围的影响。高校作为基础研究和前沿技…...

一次讲清本地大模型语音识别三件套:Vulkan 为什么是加速主线,而说话人识别为何成为唯一短板

把 whisper.cpp、sherpa-onnx、llama.cpp 三套引擎整合到一起&#xff0c;再用 Electron 包成桌面应用&#xff0c;这个技术思路本身并不复杂。真正考验工程功力的&#xff0c;是面向完全不懂技术的最终端用户&#xff0c;怎样让这些引擎尽可能“一键加速”&#xff0c;同时还不…...

西门子“工业软件驱动的数字孪生”模式

西门子&#xff08;Siemens&#xff09;的“工业软件驱动的数字孪生”模式是全球离散制造业&#xff08;如汽车、航空航天、电子&#xff09;公认的技术制高点。其核心逻辑不是简单的 3D 建模&#xff0c;而是“数物融合”&#xff0c;即利用完整的软件工具链在物理实体投产前&…...

2026深度教程:如何用好 Gemini 3.1 Pro 联网搜索?实时信息获取与验证技巧全解析

目前&#xff0c;国内用户想稳定使用顶尖AI模型的联网搜索功能&#xff0c;像聚合了Gemini、ChatGPT、Grok等主流大模型的 KULAAI &#xff08;m.877ai.cn) 这类镜像站提供了直接可用的方案。本文将深入剖析Gemini 3.1 Pro的联网能力&#xff0c;从原理机制到实操技巧&#xff…...

基于TEA加密的QQ号码逆向查询技术实现

基于TEA加密的QQ号码逆向查询技术实现 【免费下载链接】phone2qq 项目地址: https://gitcode.com/gh_mirrors/ph/phone2qq 在数字身份管理领域&#xff0c;用户经常面临忘记QQ号码但记得绑定手机号的情况。传统找回方式依赖官方验证流程&#xff0c;耗时较长且操作复杂…...

Taotoken模型广场在项目技术选型阶段提供的便利性体验

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Taotoken模型广场在项目技术选型阶段提供的便利性体验 启动一个新的AI项目时&#xff0c;技术决策者面临的首要挑战往往是模型选型…...

客户受电工程图纸审核|全网独家复现,多模态+知识图谱创新改进篇 引入MM-KG融合架构,多模态感知+知识关联助力图纸全检、隐患精准定位、审核效率翻倍

目录 一、行业痛点:人工抽检模式的致命瓶颈(附真实场景痛点) 1.1 审核效率极低,无法适配规模化需求 1.2 漏判误判率高,审核质量依赖个人经验 1.3 审核标准不统一,追溯难度大 1.4 人力成本高昂,专业人才缺口大 二、创新突破:多模态+知识图谱融合架构(核心改进解析…...

DownKyi哔哩下载姬:5步快速掌握B站视频下载完整教程

DownKyi哔哩下载姬&#xff1a;5步快速掌握B站视频下载完整教程 【免费下载链接】downkyi 哔哩下载姬downkyi&#xff0c;哔哩哔哩网站视频下载工具&#xff0c;支持批量下载&#xff0c;支持8K、HDR、杜比视界&#xff0c;提供工具箱&#xff08;音视频提取、去水印等&#xf…...

【Mem0】 源码剖析(一):Agent 的记忆危机与 Mem0 的三阶段管道——为什么 RAG 不够用?

【Mem0】 源码剖析&#xff08;一&#xff09;&#xff1a;Agent 的记忆危机与 Mem0 的三阶段管道——为什么 RAG 不够用&#xff1f; 写在前面&#xff1a;54K Star&#xff0c;论文被 arXiv 收录&#xff0c;LOCOMO 基准 SOTA——Mem0 是当前 Agent 记忆层的事实标准。它的核…...

【Flutter for open harmony 】Flutter三方库Dio网络请求+熬夜记录列表的鸿蒙化适配与实战指南

【Flutter for open harmony 】Flutter三方库Dio网络请求熬夜记录列表的鸿蒙化适配与实战指南 欢迎加入开源鸿蒙跨平台社区&#xff1a;https://openharmonycrossplatform.csdn.net 大家好&#xff0c;我是ShineQiu&#xff0c;上海某高校计算机科学与技术专业大二在读学生。这…...

5分钟快速上手:res-downloader 全网资源下载神器终极指南

5分钟快速上手&#xff1a;res-downloader 全网资源下载神器终极指南 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 你是否经…...

分类记单词:哺乳动物

分类记单词&#xff1a;哺乳动物快来记单词&#xff0c;这里有好多哺乳动物哦一、宠物、家畜 pet 宠物cat 猫tom 公猫&#xff1b;汤姆dog 狗pup 小狗bitch 母狗&#xff1b;泼妇pig 猪sow 母猪&#xff1b;播种boar 未阉的公猪&#xff1b;野猪piglet 小猪livestock 牲口cattl…...

蓝牙6.0 Channel Sounding 基于接入地址的定时估计原理

基于接入地址的定时估计 先看下core spec的描述&#xff1a;蓝牙Core Spec Vol 6 Part H中 3.2节「基于接入地址的定时估计」&#xff0c;它定义了两种用于CS_SYNC包到达时间&#xff08;ToA&#xff09;估计的方法&#xff0c;是RTT测距的基础定时方案。下面我逐段拆解&#x…...

凡亿AD22--器件导线连接及导线属性设置

一、课前基础授课前已完成&#xff1a;将所需元器件&#xff08;如DC头、二极管、电容等&#xff09;按布局要求&#xff0c;放置在原理图页面中&#xff0c;无需提前连接&#xff0c;本节课重点完成「电气连接」及导线属性优化。二、核心重点&#xff1a;导线连接&#xff08;…...

职慧AI陪练产品全景解析:六大训练模式如何覆盖销售培养全场景

摘要&#xff1a;市面上的AI陪练产品大多只能做"话术对练"&#xff0c;真正能覆盖销售能力培养全链路的产品长什么样&#xff1f;本文深度拆解职行力职慧AI陪练的六大训练模式——话术陪练、情景对话、智能考试、微课学习、AI专家问答、训练官带教&#xff0c;以及背…...

凡亿AD22--原理图元件复制、剪切、旋转、镜像

核心作用&#xff1a;这4种操作是原理图布局的基础&#xff0c;熟练掌握可大幅提升绘制效率&#xff0c;让元器件布局更规范、信号流向更清晰&#xff0c;提升原理图可读性。一、核心操作详解所有操作均基于「选中元件」为前提&#xff08;单个元件点击选中&#xff0c;多个元件…...

凡亿AD22-原理图页大小设置及注意事项(实操笔记)

核心前提&#xff1a;原理图页大小需在绘制元器件、导线前设置&#xff08;前期准备工作&#xff09;&#xff0c;避免绘制完成后调整尺寸&#xff0c;导致元器件、导线布局混乱&#xff0c;节省后期调整时间。一、为什么要设置原理图页大小&#xff1f;软件默认的原理图页尺寸…...

Gemini3.1Pro透明化指南:模型卡与数据卡入口解析

在 2026 年&#xff0c;越来越多的团队开始把“模型怎么用”升级为“模型用得是否可控、可追溯”。尤其是涉及合规审计、数据治理与风险评估时&#xff0c;工程侧最需要的往往是&#xff1a;能快速找到模型信息与数据来源的透明化页面入口&#xff0c;确保链路清晰、记录完整、…...