opencv基础(轮廓检测、绘制与特征)

一、轮廓检测

轮廓定义:图像中具有相同颜色 / 灰度的连续像素点连接形成的闭合曲线,代表前景与背景的边界,与边缘(单像素灰度突变)不同,轮廓更强调整体外形与连通性。

cv2.findContours是 OpenCV 用于从二值图像中提取轮廓的函数,其核心作用是扫描二值图像的像素,追踪连续的边界点并组织成轮廓集合,同时可返回轮廓间的层级关系(如嵌套、并列)

cv2.findContours(image, mode, method)

参数:

image:必须是单通道二值图(前景白色 255,背景黑色 0),若输入彩色 / 灰度图需先二值化

mode:轮廓检索模式

1.cv2.RETR_EXTERNAL:只提取最外层轮廓(忽略嵌套轮廓),适合只关注主体的场景(如检测单个物体)

2.cv2.RETR_LIST:提取所有轮廓,不建立层级关系(最简洁)

3.cv2.RETR_CCOMP:提取所有轮廓,建立两层层级(外层 + 内层)

4.cv2.RETR_TREE:提取所有轮廓,建立完整层级树(最常用,可区分嵌套 / 并列轮廓)

method:轮廓逼近方法

1.cv2.CHAIN_APPROX_NONE:保留所有轮廓点(每个点都存储,数据量大)

2.cv2.CHAIN_APPROX_SIMPLE:压缩水平 / 垂直 / 对角线方向的冗余点(如矩形只存 4 个顶点,最常用)

代码:

phone=cv2.imread('phone.png')#读取原图 phone_gray=cv2.cvtColor(phone,cv2.COLOR_BGR2GRAY)#灰度图的处理 cv2.imshow('phone_b',phone_gray) cv2.waitKey(0) #phone_gray=cv2.imread('phone.png',b)#读取灰度图 ret,phone_binary =cv2.threshold(phone_gray,120,255,cv2.THRESH_BINARY)#阀值处理为二值 cv2.imshow('phone_binary',phone_binary) cv2.waitKey(0) # _,contours,hierarchy =cv2.findContours(phone_binary,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE) contours = cv2.findContours(phone_binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)[-2] # 通用 # print(hierarchy) print(len(contours))

1.通过cv2.cvtColor(phone,cv2.COLOR_BGR2GRAY)将图像变成灰度图

2.通过cv2.threshold将灰度值大于 120 的像素设为 255(白色,前景),小于等于 120 的像素设为 0(黑色,背景),最终得到一张黑白二值图。

3.最后用cv2.findContours对二值图像phone_binary提取所有轮廓(含层级)、保留所有轮廓点,最终只取返回结果中的[轮廓列表]

二、轮廓绘制

函数cv2.drawContours(image, contours,contourIdx,color, thickness=None,
LineType=None,hierarchy=None,maxLevel=None,offset=None)
参数含义如下:
image:要在其上绘制轮廊的输入图像。
contours:轮廊列表,通常由cv2.findContours(函数返回。
contourIdx:要绘制的轮序的索引。如果为负数,则绘制所有轮廓。-1
color:轮廓的颜色,以BGR格式表示。例如,(0,255,0)表示绿色。
thickness:轮廓线的粗细。默认值为1。
lineType:轮廊线的类型。默认值为cv2.LINE_8。
hierarchy:轮廓层次结构。通常由cv2.findContours(函数返回。
maxLevel:绘制的最大轮廊层级。默认值为None,表示绘制所有层级。
offset:轮廓点的偏移量。默认值为None。

代码:

image_copy = phone.copy() cv2.drawContours(image=image_copy,contours=contours,contourIdx=6,color=(255,255,0),thickness=3) cv2.imshow('Contours_show',image_copy) cv2.waitKey(0)

通过drawContours方法在图像的复制本上绘制轮廓用上面轮廓检测得到的contours轮廓列表

得到的图像:

三、轮廓特征

1.轮廓面积

cv2.contourArea()用于计算单个轮廓所包围的像素面积,面积值反映了轮廓对应的物体大小,是筛选有效轮廓、分析形状的基础。

area = cv2.contourArea(contour, oriented=False)

contour:顶点构成的二维向量组(如轮廓列表contours中的一个轮廓)

oriented:默认为False:返回绝对值面积

2.轮廓周长

cv2.arcLength()用于计算轮廓的弧长 / 周长,对于闭合轮廓返回周长,对于非闭合轮廓返回弧长,是判断轮廓形状、计算圆形度等特征的关键参数。

length = cv2.arcLength(contour, closed)

contour:单个轮廓(来自cv2.findContours返回的contours列表元素)

closed:True:认为轮廓是闭合的(首尾相连),计算完整周长;False:认为轮廓是开放的(首尾不连),计算从起点到终点的弧长

3.轮廓外接圆

cv2.minEnclosingCircle()用于计算单个轮廓的最小外接圆(能完全包围轮廓的最小圆形),返回圆心坐标和半径。

(x_center, y_center), radius = cv2.minEnclosingCircle(contour)

contour:单个轮廓(来自cv2.findContours返回的contours列表元素)

(x_center, y_center):最小外接圆的圆心坐标

radius:最小外接圆的半径

4.轮廓外接矩形

x,y,w,h=cv2.boundingRect(cnt)计算轮廓的最小外接矩形

x,y:是轮廓的最小外接矩形的左上角

w,h:是矩形的宽和高

四、轮廓近似

approx = cv2.approxPolyDP(curve,epsilon,closed)
参数说明:
curve:输入轮廓。
epsilon:近似精度,即两个轮廓之间最大的欧式距离。该参数越小,得到的近似结果越接近实际轮廓:反之,得到的近似结果会更加粗略。
closed:布尔类型的参数,表示是否封闭轮廓。如果是True,表示输入轮廓是封闭的,近似结果也会是封闭的:否则表示输入轮廓不是封闭的,
返回值:approx:近似结果,是一个ndarray数组,为1个近似后的轮廓,包含了被近似出来的轮廓上的点的坐标

代码:

phone = cv2.imread('phone.png') phone_gray=cv2.cvtColor(phone,cv2.COLOR_BGR2GRAY)#转换为灰度图 ret,phone_thresh=cv2.threshold(phone_gray,120,255,cv2.THRESH_BINARY) #二值化 #image,contours,hierarchy=cv2.findContours(phone_thresh,cv2.RETR_TREE,cv2.CHAIN_APPRox_NoNE)#获取轮廓 contours=cv2.findContours(phone_thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)[-2] epsilon= 0.01 * cv2.arcLength(contours[0],True) #设置近似精度.[h要<e;ε越小,点越多,越精确】 approx=cv2.approxPolyDP(contours[0],epsilon,True)#对轮廓进行近似 print(contours[1].shape) print(approx.shape) phone_new = phone.copy() image_contours=cv2.drawContours(phone_new,[approx],contourIdx=-1,color=(0,255,0),thickness=3)#绘制轮廓 cv2.imshow('phone',phone) cv2.waitKey(0) cv2.imshow('image_contours',image_contours) cv2.waitKey(0)

得到的图像:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1191342.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode—3314. 构造最小位运算数组 I【简单】

2025每日刷题&#xff08;240&#xff09; Leetcode—3314. 构造最小位运算数组 I实现代码 func minBitwiseArray(nums []int) []int {ans : make([]int, 0)for _, x : range nums {if x 2 {ans append(ans, -1)} else {for i : 1; i < 32; i {if x >> i & 1 0…

集成运放加法器电路原理验证的实战案例(含Multisim仿真)

以下是对您提供的博文内容进行 深度润色与结构重构后的技术博客正文 。本次优化严格遵循您的全部要求&#xff1a; ✅ 彻底去除AI痕迹&#xff0c;语言自然、专业、有“人味”&#xff1b; ✅ 打破模板化标题体系&#xff0c;以逻辑流驱动章节演进&#xff1b; ✅ 将原理、…

词根词缀拆解|dict- = 说/断言!用兜兜英语快速记牢高频词

喽英语学习者们&#x1f44b;&#xff01;今天用「兜兜英语词根词缀拆解工具」带大家吃透一个超实用前缀——dict-&#xff0c;它的核心含义是「说、断言」&#xff0c;衍生出的单词遍布阅读、写作、口语场景&#xff0c;掌握它能批量解锁高频词&#xff0c;记忆效率直接翻倍✨…

基于多目标粒子群优化算法的冷热电联供型综合能源系统运行优化(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1…

计算机毕业设计springboot少儿编程教培机构教务管理系统 基于SpringBoot的青少年编程培训中心教务运营平台 少儿编程教育机构教学事务一体化管理系统

计算机毕业设计springboot少儿编程教培机构教务管理系统g0q16b8i &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。当“双减”把学科类培训推向边缘&#xff0c;编程却凭借信息学奥…

‌如何测试AI的“推理深度”?我设计了“五层追问”测试

五层追问不是提问技巧&#xff0c;而是一套可度量、可复用的AI推理测试框架‌ 在AI辅助测试用例生成、缺陷根因分析、自动化决策等场景中&#xff0c;AI的“推理深度”直接决定测试质量的下限。传统评估仅关注输出结果是否正确&#xff0c;而‌“五层追问”测试法‌通过结构化…

GC-IP201 驱动

数据手册官网上面 https://amac-chemnitz.com/index.php/en/products/interpolationsschaltkreise/93-gc-ip201b-en STM32F103C8T6翻译后的是通信协议&#xff1a;每个数据传输都通过主机处理器发送一个SPI字来启动。一个SPI字由4位操作码、4位硬件地址和最多8位数据组成。 只有…

‌大模型测试的“监控体系”:实时检测幻觉、偏见、泄露

一、监控体系是大模型测试的“生命线”‌ 在传统软件测试中&#xff0c;我们验证的是‌确定性逻辑‌&#xff1a;输入 → 执行 → 输出 → 断言。 而在大语言模型&#xff08;LLM&#xff09;时代&#xff0c;测试对象变为‌概率性生成系统‌&#xff1a;输入 → 概率分布 → …

智能窗户防撬报警系统仿真:proteus蜂鸣器实战

智能窗户防撬报警系统仿真&#xff1a;从干簧管到蜂鸣器的实战设计你有没有想过&#xff0c;家里的窗户其实是最容易被入侵的地方&#xff1f;防盗窗虽然结实&#xff0c;但影响美观、阻碍逃生。那有没有一种方式&#xff0c;既不破坏装修风格&#xff0c;又能实时感知“有人撬…

每10年一次的“开发者淘汰战”,自1969年就已开局!

每十年&#xff0c;总有人信心满满地宣称&#xff1a;“这次&#xff0c;我们终于可以让软件开发变得简单&#xff0c;不再需要那么多开发者了。”但现实是&#xff0c;我们真的不再需要开发者了吗&#xff1f;近日&#xff0c;资深开发者 Stephan Schwab 在《Why We’ve Tried…

055.多层图最短路(扩点)

扩点最短路,也叫分层图最短路建图的节点不是真实的位置,而是真实位置+在此处的状态一般还要用到状态压缩技巧核心在于如何扩点,如何到达,如何算距离习题 获取所有钥匙的最短路 leetcode 864节点表示状态 : 真实位…

Vivado License节点锁定设置:项目环境配置说明

Vivado 节点锁定许可配置实战指南&#xff1a;让 FPGA 开发环境稳如磐石你有没有遇到过这样的场景&#xff1f;早上刚打开电脑准备调试关键模块&#xff0c;Vivado 启动失败&#xff0c;弹出一串红色警告&#xff1a;“License checkout failed”。一查日志才发现&#xff0c;许…

‌AI模拟用户情绪波动:软件测试从业者的新测试范式

在当今以用户体验为核心的产品开发逻辑中&#xff0c;软件测试早已超越“功能正确性”的单一维度&#xff0c;逐步向‌情感可用性‌&#xff08;Emotional Usability&#xff09;和‌心理韧性测试‌&#xff08;Psychological Resilience Testing&#xff09;延伸。‌一、为什么…

记一次经典的反序列化漏洞(CVE-2017-10271)

关于WebLogic ​ WebLogic 是由 Oracle 公司开发的一款企业级 Java EE(现 Jakarta EE)应用服务器,广泛用于构建、部署和管理大型分布式企业应用。它提供高可用性、可扩展性和安全性,支持诸如 EJB、JMS、JTA、JDBC、…

Authentication is required but no CredentialsProvider has been registered 报错已解决

文章目录 Authentication is required but no CredentialsProvider has been registered 报错已解决项目场景问题描述原因分析1️⃣ Git 仓库是私有仓库2️⃣ Git 仓库地址&#xff08;uri&#xff09;配置错误3️⃣ 未配置 CredentialsProvider 解决方案方案一&#xff1a;配置…

Multisim14使用教程:快速理解直流电路搭建步骤

Multisim14实战入门&#xff1a;手把手教你搭出第一个直流电路你有没有过这样的经历&#xff1f;在模电实验课上&#xff0c;接了一堆导线&#xff0c;万用表一测——电压不对&#xff1b;反复检查&#xff0c;发现是电源正负极接反了。更糟的是&#xff0c;某个电阻还因为电流…

解决vscode中文输入法输入没有候选框问题

去掉勾选即可 参考https://blog.csdn.net/m0_47346543/article/details/154704448黄粱一梦,终是一空本文来自博客园,作者:hicode002,转载请注明原文链接:https://www.cnblogs.com/hicode002/p/19509148

大模型测试的“冷启动评估”:新模型上线前怎么测?

冷启动评估的紧迫性与定义 在人工智能时代&#xff0c;大模型&#xff08;如LLM&#xff09;的部署已成为企业核心能力&#xff0c;但新模型上线前的冷启动问题常被忽视。冷启动指模型首次响应请求时因初始化延迟导致的性能瓶颈&#xff0c;包括资源分配、依赖加载和计算图优化…

Error creating bean with name ‘xxxxxxxController‘: Injection of resource dependencies failed报错已解决

Error creating bean with name ‘XXXController’: Injection of resource dependencies failed 问题已解决&#xff1a;4 种高频原因全面排查指南 一、项目场景 在一次 Spring Boot MyBatis 的后台项目开发过程中&#xff0c;项目结构、依赖、配置看似全部完成&#xff0c;但…

2026中国智慧养老行业:老龄化浪潮下的刚性需求爆发

截至 2024 年末&#xff0c;中国 60 岁以上人口达3.1 亿&#xff0c;照护依赖人口五年内将增至4000 万 &#xff0c;护理员缺口超500 万&#xff0c;刚性需求全面爆发。2026 年市场规模预计突破8.3 万亿元&#xff0c;2030 年将达15.1 万亿元&#xff1b;八部门新政以科技赋能为…