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

OpenCV中的轮廓检测方法详解

文章目录

  • 引言
  • 一、什么是轮廓?
  • 二、OpenCV中的轮廓检测基础
    • 1. 基本步骤
    • 2. findContours函数详解
  • 三、轮廓检索模式
  • 四、轮廓近似方法
  • 五、轮廓特征分析
    • 1. 轮廓面积
    • 2. 轮廓周长/弧长
    • 3. 轮廓近似(多边形拟合)
    • 4. 凸包
    • 5. 边界矩形
    • 6. 最小闭合圆
    • 7. 拟合椭圆
  • 六、性能优化技巧
  • 七、常见问题与解决方案
  • 八、结论

引言

轮廓检测是计算机视觉和图像处理中的一项基础而重要的技术,广泛应用于对象识别、形状分析、医学图像处理等领域。OpenCV作为一个强大的计算机视觉库,提供了丰富的轮廓检测和处理功能。本文将详细介绍OpenCV中的轮廓检测方法及其应用。

一、什么是轮廓?

在图像处理中,轮廓可以被定义为连接所有连续点(沿边界)的曲线,这些点具有相同的颜色或强度。轮廓对于形状分析和对象检测识别非常有用。

二、OpenCV中的轮廓检测基础

1. 基本步骤

在OpenCV中进行轮廓检测通常遵循以下步骤:

import cv2
import numpy as np# 1. 读取图像
image = cv2.imread('image.jpg')# 2. 转换为灰度图
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 3. 应用阈值或边缘检测
ret, thresh = cv2.threshold(gray, 120, 255, cv2.THRESH_BINARY)# 4. 查找轮廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)# 5. 绘制轮廓
cv2.drawContours(image, contours, -1, (0,255,0), 3)# 显示结果
cv2.imshow('Contours', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

2. findContours函数详解

cv2.findContours()是OpenCV中用于轮廓检测的核心函数,其原型为:

image,contours, hierarchy = cv2.findContours(image, mode, method)

参数说明:

  • image:输入的二值图像(通常经过阈值处理或边缘检测)
  • mode:轮廓检索模式
  • method:轮廓近似方法

返回值:

  • img:需要实现轮廓检测的原图
  • contours:检测到的轮廓列表,每个轮廓是一个点集
  • hierarchy:轮廓的层次结构信息

三、轮廓检索模式

OpenCV提供了几种不同的轮廓检索模式:

  1. RETR_EXTERNAL:只检测最外层轮廓
  2. RETR_LIST:检测所有轮廓,但不建立层次关系
  3. RETR_CCOMP:检测所有轮廓,并将其组织为两级层次结构
  4. RETR_TREE:检测所有轮廓,并重建完整的层次结构
# 不同检索模式示例
contours_ext, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contours_list, _ = cv2.findContours(thresh, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
contours_ccomp, hierarchy_ccomp = cv2.findContours(thresh, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE)
contours_tree, hierarchy_tree = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

四、轮廓近似方法

轮廓近似方法决定了如何存储轮廓点:

  1. CHAIN_APPROX_NONE:存储所有轮廓点
  2. CHAIN_APPROX_SIMPLE:压缩水平、垂直和对角线段,只存储端点
# 不同近似方法比较
contours_none, _ = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
contours_simple, _ = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

五、轮廓特征分析

检测到轮廓后,OpenCV提供了多种函数来分析轮廓特征:

1. 轮廓面积

area = cv2.contourArea(contour)

2. 轮廓周长/弧长

perimeter = cv2.arcLength(contour, closed)

3. 轮廓近似(多边形拟合)

epsilon = 0.01 * cv2.arcLength(contour, True)
approx = cv2.approxPolyDP(contour, epsilon, True)

4. 凸包

hull = cv2.convexHull(contour)

5. 边界矩形

x,y,w,h = cv2.boundingRect(contour)  # 直角矩形
rect = cv2.minAreaRect(contour)      # 旋转矩形
box = cv2.boxPoints(rect)
box = np.int0(box)

6. 最小闭合圆

(x,y), radius = cv2.minEnclosingCircle(contour)

7. 拟合椭圆

ellipse = cv2.fitEllipse(contour)

六、性能优化技巧

  1. 预处理很重要:适当的模糊和阈值处理可以显著提高轮廓检测质量
  2. 使用RETR_EXTERNAL:如果只需要最外层轮廓,使用RETR_EXTERNAL模式更快
  3. 轮廓过滤:根据面积或其他特征过滤掉不需要的小轮廓
  4. 使用CHAIN_APPROX_SIMPLE:减少存储的点数,提高处理速度
  5. 考虑图像金字塔:对于大图像,可以先缩小检测再放大结果

七、常见问题与解决方案

问题1:findContours找不到任何轮廓

  • 检查输入图像是否为8位单通道二值图像
  • 调整阈值或边缘检测参数
  • 尝试反转图像(黑色背景白色对象)

问题2:轮廓不连续或有缺口

  • 应用形态学操作(如闭运算)连接断开的边缘
  • 调整边缘检测或阈值参数

问题3:检测到太多小轮廓(噪声)

  • 应用模糊预处理
  • 设置最小面积阈值过滤小轮廓
  • 使用RETR_EXTERNAL模式只检测外部轮廓

八、结论

OpenCV的轮廓检测功能强大而灵活,为各种计算机视觉应用提供了坚实的基础。通过合理选择检索模式和近似方法,结合各种轮廓特征分析技术,可以实现从简单的对象计数到复杂的形状识别等多种功能。掌握这些技术将大大提升你在计算机视觉项目中的能力。

希望本文能帮助你更好地理解和应用OpenCV中的轮廓检测方法。实践是学习的关键,不妨现在就动手尝试这些代码示例,探索更多可能性!

相关文章:

OpenCV中的轮廓检测方法详解

文章目录 引言一、什么是轮廓?二、OpenCV中的轮廓检测基础1. 基本步骤2. findContours函数详解 三、轮廓检索模式四、轮廓近似方法五、轮廓特征分析1. 轮廓面积2. 轮廓周长/弧长3. 轮廓近似(多边形拟合)4. 凸包5. 边界矩形6. 最小闭合圆7. 拟…...

AIP-231 批量方法:Get

编号231原文链接AIP-231: Batch methods: Get状态批准创建日期2019-06-18更新日期2019-06-18 一些API允许用户获取一组特定资源在一个时间点(例如使用读事务)的状态。批量获取方法提供了这个功能。 指南 API 可以 按照以下模式支持批量获取&#xff1…...

人工智能基础-matplotlib基础

绘制图形 import numpy as np x np.linspace(0, 10, 100) y np.sin(x) import matplotlib as mpl import matplotlib.pyplot as plt plt.plot(x, y) plt.show()绘制多条曲线 siny y.copy() cosy np.cos(x) plt.plot(x, siny) plt.plot(x, cosy) plt.show()设置线条颜色 …...

qt运行时报段错误

标题: qt运行时报段错误,查看stack,显示: 原因 报错的cpp文件新包含一个头文件,这个头文件里的pack指令有问题,如下: 解决办法 修改为正确的pack指令。...

【Qt】Qt Creator开发基础:项目创建、界面解析与核心概念入门

🍑个人主页:Jupiter. 🚀 所属专栏:QT 欢迎大家点赞收藏评论😊 目录 Qt Creator 新建项⽬认识 Qt Creator 界⾯项⽬⽂件解析Qt 编程注意事项认识对象模型(对象树)Qt 窗⼝坐标体系 Qt Creator 新…...

CAP应用

1.工作原理 CAP(Consistent,Available,Partition - tolerant)框架在.NET 中的工作原理。CAP 是一个用于.NET 的分布式事务解决方案,主要用于实现微服务架构中的数据一致性(实现分布式事务的最终一致性&…...

典型操作系统内核架构

在典型操作系统架构(如下图所示)中,内核负责以安全、公平的方式为多个应用程序管理和共享硬件资源。 内核通过一组 API(即系统调用)向应用程序提供服务。这些 API 不同于常规库函数,因其是用户模式到内核模…...

AWS Redshift的使用场景及一些常见问题

Redshift 不是关系型数据库, 提供了Amazon Redshift Serverless 和 Amazon Redshift 都是构建于 Redshift 数仓引擎之上的,但它们适用的场景不同。Redshift和Dynamodb都可以存储数据, 分别怎么选择? 这里记录一些常见的问题和场景。 1. 如何选择用Amazon Redshift…...

**searchProperties 是什么,python中**是什么:解包字典的操作符

searchProperties 是什么,python中是什么:解包字典的操作符 在 Python 中,** 是用于解包字典的操作符,**searchProperties 是一个可变关键字参数。它允许函数接受任意数量的关键字参数,这些参数会被收集到一个字典中,字典的键是参数名,值是参数对应的值。 在 ButtonCon…...

.NET MCP 文档

MCP 概述 MCP(Model Context Protocol)是由 Anthropic 推出的一种开放协议,类似 AI 的 USB-C 扩展坞,用于在大模型和数据源之间建立安全的通信(授权),让 AI 应用能够安全地访问和操作本地或远程…...

07软件测试需求分析案例-修改用户信息

修改用户信息是后台管理菜单的一个功能模块,只有admin才有修改权限。包括查询用户名进行显示用户相关信息,并且修改用户相关信息的功能。 1.1 通读文档 通读需求规格说明书是提取信息,提出问题,输出具有逻辑、规则、流程的业务…...

第九届“创客中国”中小企业创新创业大赛总决赛企业组三等奖项目—基于AI智能代码疫苗技术的数字供应链安全解决方案

项目名称:基于AI智能代码疫苗技术的数字供应链安全解决方案 企业名称:北京安普诺信息技术有限公司(悬镜安全) 项目简介: ‍‍‍‍‍ 基于AI智能代码疫苗技术的数字供应链安全解决方案,悬镜安全在全球范围内首创…...

企业级RAG行业应用落地方案——阿里云百炼

行业痛点分析 这张图主要围绕“行业痛点锚定”展开,通过雷达图和表格结合的方式,分析电商选品在不同维度下的情况: 分析对象:聚焦电商选品。维度展示:从可结构化程度、重复性、数据可得性、人机互动性、AI带来的价值这…...

Mac切换node版本

Mac切换node版本 1.首先安装n模块: sudo npm install -g n 2.升级node.js到最新稳定版 sudo n stable 3.升级到最新版 sudo n latest 4.n后面也可以跟随版本号,升级到任意版本 sudo n v0.10.26或sudo n 0.10.26 5.切换使用版本 sudo n 7.10.0 6.删除制定版本…...

从零开始学A2A一:A2A 协议概述与核心概念

A2A 协议概述与核心概念 学习目标 基础理解 掌握A2A协议的基本概念和背景理解协议的设计原则和核心思想了解协议在AI领域的重要性 技术掌握 熟悉A2A协议的核心功能组件掌握能力发现和任务管理机制理解多模态交互和安全通信原则 实践应用 能够设计基于A2A的智能体系统掌握协议…...

科普:如何通过ROC曲线,确定二分类的“理论阈值”

在二分类问题中,已知预测概率(如逻辑回归、神经网络输出的概率值)时,阈值的选择直接影响分类结果(正/负样本判定)。 一、实践中的阈值选择方法 1. 基于业务目标的调整 最大化准确率:适用于样…...

Cherry Studio + MCP,从0到1保姆教程,3个场景体验

📺 详细操作以视频方式呈现,视频地址周五会更新出来 💯 鉴于很多观众网络环境受限,文末提供所需安装文件网盘分享 💬 什么是 MCP ? MCP(Model Context Protocol,MCP)模型…...

Docker学习笔记-docker安装、删除

一、在centOS 7中docker的默认安装目录 # Docker 主配置文件目录 ls /etc/docker# Docker 数据目录(镜像、容器、卷等) ls /var/lib/docker# Docker 可执行文件路径 which docker # 输出类似 /usr/bin/docker 二、docker文件目录说明 目录/文件用途/…...

visual studio 常用的快捷键(已经熟悉的就不记录了)

以下是 Visual Studio 中最常用的快捷键分类整理,涵盖代码编辑、调试、导航等核心场景: 一、生成与编译 ​生成解决方案 Ctrl Shift B 一键编译整个解决方案,检查编译错误(最核心的生成操作)​编译当前文件 Ctrl F…...

使用人工智能大模型腾讯元宝,如何做课题研究?

今天我们学习使用人工智能大模型腾讯元宝,如何做课题研究? 手把手学习视频地址:https://edu.csdn.net/learn/40402/666424 在腾讯元宝对话框中输入如何协助老师做课题(申报书、开题报告、中期报告、结题报告)&#x…...

开源模型应用落地-模型上下文协议(MCP)-第三方MCP Server实战指南(五)

一、前言 在AI技术高速发展的2025年,如何让大语言模型(LLM)更灵活地调用外部工具与数据,成为开发者关注的焦点。​模型上下文协议(MCP)​作为AI与外部资源的“万能接口”,通过标准化交互框架解决了传统集成中的碎片化问题。而第三方MCP Server的引入,进一步降低了开发门…...

python每日一练

题目一 输入10个整数,输出其中不同的数,即如果一个数出现了多次,只输出一次(要求按照每一个不同的数第一次出现的顺序输出)。 解题 错误题解 a list(map(int,input().split())) b [] b.append(a[i]) for i in range(2,11):if a[i] not in b:b.append(a[i]) print(b)但是会…...

跨境贸易之常见的贸易术语

外贸出口中经常会听到FOB、CIF、DDP各种术语,这些都是什么意思呢? 今天我们来介绍一下他们的确切含义。一般来说你听到的这些话语都是表示交货的方式。 如果普通的贸易过程大家一听就明白的,就是货到付款,款到发货,支…...

KingbaseES之KDts迁移SQLServer

项目适配迁移SQLServer至金仓,今天写写KDts-WEB版迁移工具迁移SQLServer至KingbaseES的步骤,以及迁移注意事项. SQLServer版本:SQLServer2012 KingbaseES版本:V009R004C011(SQLServer兼容版) --1.进入数据库客户端工具KDTS工具目录,启动KDts服务: [king…...

Rust编程学习(一): 变量与数据类型

我们先从Rust基本的变量声明定义与数据类型开始学习,了解这门语言基本特性。 1 变量与可变性 变量声明 变量声明以let关键字开头,x为变量名,变量名后紧跟冒号和数据类型,但是rust编译器有自动推导变量类型的功能,可以省略显式的声…...

Java 在人工智能领域的突围:从企业级架构到边缘计算的技术革新

一、Java AI 的底层逻辑:从语言特性到生态重构 在 Python 占据 AI 开发主导地位的当下,Java 正通过技术重构实现突围。作为拥有 30 年企业级开发经验的编程语言,Java 的核心优势在于强类型安全、内存管理能力和分布式系统支持,这…...

[极客大挑战 2019]HardSQL1

打开网页,貌似存在SLQ注入,尝试闭合单引号 才生报错信息,但是尝试联合注入 不出意外应该是被过滤了,没法使用,可以考虑一下报错注入 这里可以使用字典爆破一下,利用页面返回情况,看看哪些关键词…...

深入剖析C++中 String 类的模拟实现

目录 引言 一、基础框架搭建 成员变量与基本构造函数 析构函数 二、拷贝与赋值操作 深拷贝的拷贝构造函数 赋值运算符重载 三、字符串操作功能实现 获取字符串长度 字符串拼接 字符串比较 字符访问 四、迭代器相关实现(简单模拟) 迭代器类型…...

KWDB创作者计划— KWDB技术范式革命:从数据存储到认知进化的架构跃迁

引言:数据库的认知觉醒 在AIoT设备数量突破万亿、边缘计算节点算力总和超越云端的2025年,传统数据库的"存储-计算"二元结构正面临认知维度缺失的困境。当工业数字孪生需要实时推演百万设备状态,城市大脑需处理多模态时空数据时&…...

【后端开发】Spring配置文件

文章目录 配置文件properties配置文件基本语法读取配置文件 yml配置文件基本语法读取配置文件配置空字符串及null单双引号配置对象配置集合配置Map 优缺点优点缺点 配置文件 硬编码是将数据直接嵌入到程序或其他可执行对象的源代码中,也就是常说的"代码写死&q…...

探讨HMI(人机界面)设计原则,如何通过优秀的设计提升操作效率和用户体验

在物联网与人工智能深度渗透的今天,人机界面(Human-Machine Interface, HMI)已成为连接数字世界与物理世界的神经末梢。优秀的HMI设计不仅关乎视觉美感,更是认知工程、信息架构与交互范式的协同创新。本文从神经认知科学原理出发&…...

网络7 配置网卡 路由表

我配置了两张网卡,一个是仅主机模式,一个是NAT模式。刚才NAT模式动态配置下,ping百度ping的通,路由表中只显示NAT的网关。我把NAT模式修改为静态IP,路由表中显示仅主机模式的网关和NAT模式的网关,ping百度ping不通了 …...

InnoDB的MVCC实现原理?MVCC如何实现不同事务隔离级别?MVCC优缺点?

概念 InnoDB的MVCC(Multi-Version Concurrency Control)即多版本并发控制,是一种用于处理并发事务的机制。它通过保存数据在不同时间点的多个版本,让不同事务在同一时刻可以看到不同版本的数据,以此来减少锁竞争&…...

同构应用开发

以下是关于 同构应用(Isomorphic/Universal Application)开发 的系统知识梳理,涵盖核心概念、技术实现、性能优化及工程实践,帮助我们全面掌握这一现代Web开发范式: 一、同构应用核心概念 1. 定义与价值 定义:同一套代码在服务端(Node.js)和客户端(浏览器)运行,实现…...

如何制定有效的风险应对计划

制定有效的风险应对计划的核心在于: 识别潜在风险、评估风险的影响与概率、选择合适的应对策略、建立动态监控和反馈机制。 其中,识别潜在风险是最为关键的第一步。只有准确识别出可能的风险,才能在后续的评估、应对、监控等环节中做到有的放…...

使用wpa_cli和wpa_supplicant配置Liunx开发板的wlan0无线网

目录 1 简单介绍下wpa_cli和wpa_supplicant 1.1 wpa_supplicant 简介 1.2 wpa_cli 简介 1.3 它们之间的关系 2 启动wpa_supplicant 3 使用rz工具把wpa_cli命令上传到开发板 4 用wpa_cli配置网络 参考文献: 1 简单介绍下wpa_cli和wpa_supplicant 1.1 wpa_su…...

深度学习模型的概述与应用

📌 友情提示: 本文内容由银河易创AI(https://ai.eaigx.com)创作平台的gpt-4-turbo模型生成,旨在提供技术参考与灵感启发。文中观点或代码示例需结合实际情况验证,建议读者通过官方文档或实践进一步确认其准…...

基于Ubuntu系统搭建51单片机开发环境的详细教程

一、环境搭建 1. 安装SDCC编译器 SDCC(Small Device C Compiler)是Linux下常用的开源51单片机编译器,支持多种芯片架构。 安装命令: sudo apt update sudo apt install sdcc 验证安装:输入 sdcc -v,若显…...

通义灵码助力Neo4J开发:快速上手与智能编码技巧

在 Web 应用开发中,Neo4J 作为一种图数据库,用于存储节点及节点间的关系。当图结构复杂化时,关系型数据库的查找效率会显著降低,甚至无法有效查找,这时 Neo4J 的优势便凸显出来。然而,由于其独特的应用场景…...

项目班——0408

qt的多线程开发 一、并发、并行的概念: 1. 并发:多个任务在同一时间段内交替执行(可能共享同一资源),但不一定同时发生。 核心思想:通过快速切换任务(例如时间片轮转)模拟“同时进…...

【Linux】42.网络基础(2.4)

文章目录 2.3 TCP协议2.3.10 拥塞控制2.3.11 延迟应答2.3.12 捎带应答2.3.13 面向字节流2.3.14 粘包问题2.3.15 TCP异常情况2.3.16 TCP小结2.3.17 基于TCP应用层协议 2.3 TCP协议 2.3.10 拥塞控制 虽然TCP有了滑动窗口这个大杀器, 能够高效可靠的发送大量的数据. 但是如果在刚…...

大模型在直肠癌诊疗全流程预测及应用研究报告

目录 一、引言 1.1 研究背景与目的 1.2 国内外研究现状 1.3 研究方法与创新点 二、大模型预测直肠癌的原理与技术基础 2.1 大模型技术概述 2.2 用于直肠癌预测的数据来源 2.3 模型构建与训练过程 三、术前预测 3.1 肿瘤分期预测 3.1.1 基于影像组学的 T 分期预测模型…...

Ceph块存储

#### 一、Ceph块存储 ##### 镜像快照管理 > 实现数据备份、恢复和测试等操作,而不影响原始数据,提高系统的可靠性和可用性。 shell # 创建镜像 rbd create img1 --size 10G # 映射镜像到本地并格式化挂载 rbd map img1 mkfs -t xfs /dev/rbd0 moun…...

【转载翻译】Open3D和PCL的一些比较

转自个人博客:【转载翻译】Open3D和PCL的一些比较 本人在逛Github时,发现一个解答Open3D和PCL对比的小文章,还挺有参考价值的 原文:https://github.com/LaplaceKorea/investigate_open3d_vs_pcl/blob/main/README.rst#whats-the-s…...

ebpf: CO-RE, BTF, and Libbpf(二)

本文内容主要来源于Learning eBPF,可阅读原文了解更全面的内容。 本文涉及源码也来自于书中对应的github:https://github.com/lizrice/learning-ebpf/ 概述 上篇文章主要讲了CO-RE最关键的一环:BTF,了解其如何记录内核中的数据结…...

RHCE第五章:NFS服务器

一、NFS(network file system) 网络文件系统:在互联网中共享服务器中的文件资源(用于Linux主机共享文件的协议)。 使用nfs服务需要安装:nfs-utils 以及 rpcbind nfs-utils : 提供nfs服务的程序 rpcbind :…...

qt(vs2010) 手动配置moc生成规则

在 Visual Studio 2010 中写QT项目时,有时需要 手动配置 MOC 生成规则 操作步骤: 右键 .h 文件 → Properties。在 Configuration Properties > Custom Build Tool 中: Command Line:"$(QTDIR)\bin\moc.exe" "%(FullPath)…...

mongodb 安装配置

1.下载 官网下载地址:MongoDB Community Download | MongoDB 2.使用解压包 解压包安装:https://pan.baidu.com/s/1Er56twK9UfxoExuCPlJjhg 提取码: 26aj 3.配置环境: (1)mongodb安装包位置: &#xf…...

Java多态课堂练习题

Java多态课堂练习题 题目:动物乐园的多态展示 背景设定: 设计一个动物乐园程序,展示不同类型动物的行为特点,要求使用多态特性实现。 1. 基础类设计(已给出部分代码) // 基类:动物 abstract…...

Android Studio 实现自定义全局悬浮按钮

文章目录 一、基础实现方案1. 使用 WindowManager 实现全局悬浮窗2. 布局文件 (res/layout/floating_button.xml)3. 圆形背景 (res/drawable/circle_background.xml)4. 启动服务 二、权限处理1. AndroidManifest.xml 中添加权限2. 检查并请求权限 三、高级功能扩展1. 添加动画效…...