【计算机视觉入门】OpenCV 基础 —— 图像轮廓检测与模板匹配
文章目录一、轮廓检测概述1.1 什么是轮廓检测1.2 边缘检测 vs 轮廓检测1.3 轮廓检测的基本流程二、核心 API 详解2.1 查找轮廓cv2.findContours()2.2 绘制轮廓cv2.drawContours()2.3 代码示例三、轮廓特征计算3.1 轮廓面积 cv2.contourArea()3.2 轮廓周长 cv2.arcLength()3.3 轮廓筛选与排序四、轮廓的外接几何形状4.1 轴对齐外接矩形4.2 最小外接圆4.3 代码示例五、轮廓近似cv2.approxPolyDP()5.1 什么是轮廓近似5.2 API 使用5.3 使用技巧5.4 代码示例六、模板匹配Template Matching6.1 什么是模板匹配6.2 核心函数 cv2.matchTemplate()6.3 匹配方法对比6.4 获取最佳匹配位置6.5 代码示例七、总结一、轮廓检测概述1.1 什么是轮廓检测在计算机视觉领域我们经常需要从图像中找到物体的位置、形状以及边界信息——例如找出图片中的硬币区域、检测工业零件是否完整。这些任务都离不开一个重要的技术轮廓检测Contour Detection。轮廓本质上是一系列点的集合这些点构成了图像中物体的边界。OpenCV 提供了一整套轮廓分析方法可以帮助我们提取图像中目标对象的边界并进一步进行形状分析。1.2 边缘检测 vs 轮廓检测这两个概念容易混淆但实际应用目标不同检测类型侧重点输出典型算法边缘检测检测图像中明暗变化剧烈梯度变化较大的像素点零散的边缘点集合Sobel、Laplacian、Canny轮廓检测检测图像中对象的完整边界有序的轮廓点序列findContours边缘检测主要关注图像中像素变化剧烈的位置轮廓检测关注图像中对象的边界。1.3 轮廓检测的基本流程轮廓检测通常是图像处理流程中的前置环节一般流程如下读取图片灰度化—— 将彩色图像转换为灰度图二值化—— 将图像转换为二值图像像素值仅为0和255findContours 查找轮廓—— 提取所有轮廓drawContours 绘制轮廓—— 在图像上可视化轮廓轮廓特征分析—— 计算面积、周长、外接矩形等二、核心 API 详解2.1 查找轮廓cv2.findContours()cv2.findContours()是轮廓检测最核心的函数用于从二值图像中提取所有轮廓。函数原型contours,hierarchycv2.findContours(image,mode,method)⚠️ 版本差异提醒OpenCV 3.x返回 image, contours, hierarchy 三个值OpenCV 4.x返回 contours, hierarchy 两个值兼容写法contours cv2.findContours(...)[-2]两个版本均适用参数详解参数说明image输入的二值图像像素值仅为 0 和 255不能是彩色图像mode轮廓检索模式method轮廓近似方法轮廓检索模式mode模式说明cv2.RETR_EXTERNAL只检测最外层轮廓所有内部子轮廓被忽略cv2.RETR_LIST检测所有轮廓但不建立等级关系所有轮廓处于同一层级cv2.RETR_CCOMP返回所有轮廓仅建立两级层次结构。对象外轮廓为第一级内部空洞轮廓为第二级cv2.RETR_TREE返回所有轮廓建立完整的树形层次结构最常用轮廓近似方法method方法说明cv2.CHAIN_APPROX_NONE存储轮廓上的所有像素点数据量大cv2.CHAIN_APPROX_SIMPLE压缩模式仅保留轮廓的拐点坐标。例如矩形轮廓只需 4 个顶点即可表示大幅减少数据量推荐使用返回值说明contours包含所有轮廓的列表每个轮廓是一个 numpy 数组存储轮廓上所有点的 (x, y) 坐标hierarchy轮廓的层次结构信息每个轮廓对应一个包含 4 个值的数组[Next, Previous, First_Child, Parent]Next同层级的下一个轮廓索引Previous同层级的上一个轮廓索引First_Child当前轮廓的第一个子轮廓索引Parent当前轮廓的父轮廓索引若无对应关系值为-12.2 绘制轮廓cv2.drawContours()cv2.drawContours()用于在图像上绘制查找到的轮廓。函数原型cv2.drawContours(image,contours,contourIdx,color,thicknessNone,lineTypeNone,hierarchyNone,maxLevelNone,offsetNone)关键参数image要绘制轮廓的目标图像会直接修改该图像建议先 copycontours轮廓列表由findContours返回contourIdx要绘制的轮廓索引-1表示绘制所有轮廓color轮廓颜色BGR 格式如(0, 255, 0)表示绿色thickness轮廓线粗细默认 1设为-1表示填充轮廓内部2.3 代码示例importcv2# 1. 读取图像并预处理imgcv2.imread(phone.png)img_graycv2.cvtColor(img,cv2.COLOR_BGR2GRAY)# 2. 二值化处理轮廓检测前必须二值化ret,binarycv2.threshold(img_gray,120,255,cv2.THRESH_BINARY)# 3. 查找轮廓兼容写法contourscv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)[-2]print(f检测到{len(contours)}个轮廓)# 4. 绘制所有轮廓img_copyimg.copy()cv2.drawContours(img_copy,contours,-1,(0,255,0),2)# 5. 显示全部轮廓cv2.imshow(All Contours,img_copy)cv2.waitKey(0)cv2.destroyAllWindows()效果展示三、轮廓特征计算获取轮廓后我们通常不会直接使用而是计算其几何特征用于筛选和识别。3.1 轮廓面积 cv2.contourArea()areacv2.contourArea(contour[,oriented])contour单个轮廓点集oriented定向区域标志默认False返回面积绝对值True时根据轮廓方向返回带符号数值轮廓面积的单位是像素的平方。3.2 轮廓周长 cv2.arcLength()lengthcv2.arcLength(curve,closed)curve输入的轮廓点集closed布尔值表示轮廓是否封闭轮廓周长又称弧长表示轮廓的闭合边界的总长度。3.3 轮廓筛选与排序实际应用中检测到的轮廓往往很多需要根据面积等特征进行筛选# 按面积筛选去除噪声保留主要目标filtered_contours[cntforcntincontoursifcv2.contourArea(cnt)1000]# 按面积从大到小排序sorted_contourssorted(contours,keycv2.contourArea,reverseTrue)largest_contoursorted_contours[0]# 取面积最大的轮廓四、轮廓的外接几何形状4.1 轴对齐外接矩形x,y,w,hcv2.boundingRect(contour)# 绘制矩形cv2.rectangle(img,(x,y),(xw,yh),(0,255,0),2)返回外接矩形的左上角坐标 (x, y) 以及宽高 (w, h)。4.2 最小外接圆(x,y),rcv2.minEnclosingCircle(contour)# 绘制圆形center(int(x),int(y))rint(r)cv2.circle(img,center,r,(0,255,0),2)表示能够完全包围轮廓的最小圆。4.3 代码示例importcv2 imgcv2.imread(phone.png)graycv2.cvtColor(img,cv2.COLOR_BGR2GRAY)ret,binarycv2.threshold(gray,120,255,cv2.THRESH_BINARY)contourscv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)[-2]# 取面积最大轮廓cntmax(contours,keycv2.contourArea)# 轮廓面积周长areacv2.contourArea(cnt)perimetercv2.arcLength(cnt,True)print(f面积:{area:.2f}, 周长:{perimeter:.2f})# ---------- 外接形状部分 ----------# 最小外接矩形x,y,w,hcv2.boundingRect(cnt)cv2.rectangle(img,(x,y),(xw,yh),(0,255,0),2)# 最小外接圆center,radiuscv2.minEnclosingCircle(cnt)cv2.circle(img,(int(center[0]),int(center[1])),int(radius),(255,0,0),2)cv2.imshow(外接形状矩形圆,img)cv2.waitKey(0)cv2.destroyAllWindows()效果展示五、轮廓近似cv2.approxPolyDP()5.1 什么是轮廓近似真实物体的边界可能包含大量点例如一个圆形可能有数百个边界点但我们可能只需要几个关键点来表示它。轮廓近似是指对轮廓进行多边形拟合用更少的点来近似表示轮廓形状。5.2 API 使用approxcv2.approxPolyDP(curve,epsilon,closed)参数说明curve输入的原始轮廓epsilon近似精度表示原始轮廓与近似轮廓之间的最大欧氏距离closed布尔值表示轮廓是否封闭核心规律epsilon越小 → 点越多 → 越接近实际轮廓越精确epsilon越大 → 点越少 → 越粗略5.3 使用技巧epsilon通常按轮廓周长的比例设置epsilon0.05*cv2.arcLength(contour,True)# 精度为周长的5%approxcv2.approxPolyDP(contour,epsilon,True)5.4 代码示例importcv2 phonecv2.imread(phone.png)phone_graycv2.cvtColor(phone,cv2.COLOR_BGR2GRAY)# 转换为灰度图ret,phone_threshcv2.threshold(phone_gray,120,255,cv2.THRESH_BINARY)# 二值化# 获取轮廓[-2]兼容新旧OpenCV版本contourscv2.findContours(phone_thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)[-2]# 按面积取最大目标轮廓cntmax(contours,keycv2.contourArea)# 设置近似精度epsilon越大顶点越少轮廓越粗糙epsilon0.005*cv2.arcLength(cnt,True)approxcv2.approxPolyDP(cnt,epsilon,True)phone_newphone.copy()# 绘制近似后的轮廓contourIdx-1代表绘制传入列表里全部轮廓cv2.drawContours(phone_new,[approx],-1,color(0,255,0),thickness2)cv2.imshow(approx contour,phone_new)cv2.waitKey(0)cv2.destroyAllWindows()效果展示六、模板匹配Template Matching6.1 什么是模板匹配模板匹配是一种经典的图像搜索方法其目标是在一幅大图中寻找与模板图像最相似的区域。基本原理将模板图像在输入图像上滑动类似于二维卷积在每个位置计算模板与下方图像块的相似程度。6.2 核心函数 cv2.matchTemplate()resultcv2.matchTemplate(image,templ,method)参数说明image待搜索的大图templ模板图像必须小于等于大图method匹配方法6.3 匹配方法对比方法说明匹配越好cv2.TM_SQDIFF平方差匹配值越小cv2.TM_SQDIFF_NORMED归一化平方差匹配值越小cv2.TM_CCORR相关匹配值越大cv2.TM_CCORR_NORMED归一化相关匹配值越大cv2.TM_CCOEFF相关系数匹配值越大cv2.TM_CCOEFF_NORMED归一化相关系数匹配值越大推荐使用推荐使用归一化方法对光照变化鲁棒性更好。6.4 获取最佳匹配位置min_val,max_val,min_loc,max_loccv2.minMaxLoc(result)根据匹配方法选择最佳位置平方差类TM_SQDIFF 等取 min_loc最小值位置相关 / 相关系数类TM_CCORR、TM_CCOEFF 等取 max_loc最大值位置# 以 TM_CCOEFF_NORMED 为例top_leftmax_loc# 左上角坐标就是最大值坐标bottom_right(top_left[0]w,top_left[1]h)cv2.rectangle(img,top_left,bottom_right,(0,255,0),2)6.5 代码示例importcv2# 读取原图和模板imgcv2.imread(img_01.png)templatecv2.imread(img_02.png)h,wtemplate.shape[:2]# 模板匹配resultcv2.matchTemplate(img,template,cv2.TM_CCOEFF_NORMED)# 获取最佳匹配位置# 最小值 最大值 最小值坐标 最大值坐标min_val,max_val,min_loc,max_loccv2.minMaxLoc(result)top_leftmax_loc bottom_right(top_left[0]w,top_left[1]h)# 在副本上绘制匹配框避免修改原图img_resultimg.copy()cv2.rectangle(img_result,top_left,bottom_right,(0,255,0),2)cv2.imshow(Template,template)cv2.imshow(Match Result,img_result)cv2.waitKey(0)cv2.destroyAllWindows()效果展示七、总结OpenCV 轮廓检测是计算机视觉中非常基础且重要的技术掌握它可以帮助我们解决从目标定位到形状识别的一系列实际问题。核心函数功能函数寻找轮廓cv2.findContours绘制轮廓cv2.drawContours计算面积cv2.contourArea计算周长cv2.arcLength轴对齐外接矩形cv2.boundingRect最小外接圆cv2.minEnclosingCircle轮廓近似cv2.approxPolyDP模板匹配cv2.matchTemplate获取极值位置cv2.minMaxLoc

相关新闻

5步掌握WebSite-Downloader:Python网站离线备份终极指南

5步掌握WebSite-Downloader:Python网站离线备份终极指南

5步掌握WebSite-Downloader:Python网站离线备份终极指南 【免费下载链接】WebSite-Downloader A website downloader written with Python 项目地址: https://gitcode.com/gh_mirrors/web/WebSite-Downloader 你是否曾遇到过重要网站突然关闭,急需…

2026/8/7 23:24:43 阅读更多 →
告别“消息已撤回“!RevokeMsgPatcher防撤回工具完全指南

告别“消息已撤回“!RevokeMsgPatcher防撤回工具完全指南

告别"消息已撤回"!RevokeMsgPatcher防撤回工具完全指南 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁(我已经看到了,撤回也没用了) 项目地址: https:/…

2026/8/7 23:24:42 阅读更多 →
终极指南:如何用H5GG实现iOS游戏零代码内存编辑的完整教程

终极指南:如何用H5GG实现iOS游戏零代码内存编辑的完整教程

终极指南:如何用H5GG实现iOS游戏零代码内存编辑的完整教程 【免费下载链接】H5GG an iOS Mod Engine with JavaScript APIs & Html5 UI 项目地址: https://gitcode.com/gh_mirrors/h5/H5GG 你是否曾经看着游戏高手轻松修改游戏数值,却因为复杂…

2026/8/7 23:23:42 阅读更多 →

最新新闻

什么是信创即时通讯?企业选型需要关注哪些方面?

什么是信创即时通讯?企业选型需要关注哪些方面?

随着信息技术应用创新持续推进,越来越多企业开始对办公软件和基础系统进行升级。作为员工每天频繁使用的工作入口,即时通讯系统也是信创建设中的重要组成部分。信创即时通讯不仅要满足企业沟通需求,还需要适应相应的软硬件环境,并…

2026/8/8 0:24:30 阅读更多 →
信创即时通讯软件怎么选?为什么BeeWorks值得企业考察?

信创即时通讯软件怎么选?为什么BeeWorks值得企业考察?

即时通讯连接着企业员工、组织和业务,是数字化办公中使用频率较高的系统之一。在信创建设背景下,企业不仅要求软件具备即时沟通能力,还要关注国产化环境适配、私有化部署、数据安全和系统自主性。那么,信创即时通讯软件应该如何选…

2026/8/8 0:24:30 阅读更多 →
企业为什么需要私有化视频会议?BeeWorks Meet兼顾安全与长期成本

企业为什么需要私有化视频会议?BeeWorks Meet兼顾安全与长期成本

远程办公、跨区域项目协作和线上客户沟通日益普遍,视频会议已经成为许多企业的高频办公工具。对规模较小、使用频率不高的团队来说,公共云视频会议开通方便、初期投入较低。但随着企业人数增加、会议频率上升,以及安全和管理要求不断提高&…

2026/8/8 0:24:29 阅读更多 →
科研写作效率升级:毕夏 AI 官网全链路毕业论文创作功能科普详解

科研写作效率升级:毕夏 AI 官网全链路毕业论文创作功能科普详解

对于应届毕业生与在读研究生而言,毕业论文是学业收官的核心关卡,从前期选题敲定、文献资料搜集梳理、论文框架搭建,到正文内容撰写、实证图表制作、参考文献格式规整,整套流程工序繁杂,大量学生耗费数月时间埋头创作&a…

2026/8/8 0:23:29 阅读更多 →
毕夏 AI 官网|拆解开题报告高分逻辑,AI 一站式攻克论文开篇第一道难关

毕夏 AI 官网|拆解开题报告高分逻辑,AI 一站式攻克论文开篇第一道难关

深耕论文科普多年,我接触到无数学生卡在论文的初始阶段,也就是开题报告环节。很多人觉得开题报告只是走流程交一份表格,随便拼凑研究方向、研究意义就能应付指导老师,可实际情况是,开题直接决定整篇论文的写作走向&…

2026/8/8 0:23:29 阅读更多 →
跑数据跑到自闭?对比SPSS后,我发现毕夏AI把数据分析变成了“说人话”

跑数据跑到自闭?对比SPSS后,我发现毕夏AI把数据分析变成了“说人话”

大家好,我是你们的教育测评博主。 今天聊一个让文科生沉默、理科生流泪的话题——数据分析。 后台经常收到粉丝的崩溃投稿:“问卷收回来300份,激动地打开SPSS,然后对着屏幕发呆了一下午,不知道点什么。好不容易点出一…

2026/8/8 0:23:29 阅读更多 →

日新闻

AI多智能体时代来临,读懂MCP与A2A架构,抢占企业数字化新风口

AI多智能体时代来临,读懂MCP与A2A架构,抢占企业数字化新风口

当下AI应用飞速普及,无数企业下场搭建智能体系统,可落地阶段难题接踵而至:上下文无限堆积频繁爆栈、AI工具调用准确率低下、Token成本居高不下、企业数据权限混乱暗藏安全隐患……很多团队卡在架构搭建环节,空有前沿技术概念&…

2026/8/8 0:00:07 阅读更多 →
PHP二维码生成终极指南:用chillerlan/php-qrcode打造专业级二维码

PHP二维码生成终极指南:用chillerlan/php-qrcode打造专业级二维码

PHP二维码生成终极指南:用chillerlan/php-qrcode打造专业级二维码 【免费下载链接】php-qrcode A PHP QR Code generator and reader with a user-friendly API. 项目地址: https://gitcode.com/gh_mirrors/ph/php-qrcode 在当今数字时代,二维码已…

2026/8/8 0:00:08 阅读更多 →
UniApp微信小程序隐私保护组件开发:从原理到实战

UniApp微信小程序隐私保护组件开发:从原理到实战

1. 项目缘起:为什么我们需要一个隐私保护通用组件?最近在维护一个基于uniapp开发的微信小程序矩阵时,我遇到了一个非常棘手的问题。随着平台对用户隐私保护的要求越来越严格,几乎每一个新版本发布,或者在某些特定机型&…

2026/8/8 0:00:08 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/6 22:02:27 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/6 22:02:27 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/7 23:24:08 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/7 17:02:37 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/7 23:54:54 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/7 17:02:36 阅读更多 →