速通机器学习 12|轮廓检测、轮廓特征与轮廓近似
目录前言1 、轮廓检测1.1 轮廓与边缘的区别1.2 核心 APIcv2.findContours () 查找轮廓cv2.drawContours () 绘制轮廓1.3 轮廓检测基础代码2、轮廓特征1.轮廓面积 contourArea2.轮廓周长 arcLength3.外接矩形 boundingRect正外接矩形不旋转4.最小外接旋转矩形 minAreaRect5.轮廓重心矩 Moments3、轮廓近似3.1 原理3.2 API3.3 完整综合代码​编辑4、本章小结前言承接第 8 章边缘检测。边缘检测只能得到零散的边界像素轮廓检测可以把同一物体的边界像素组合成一条完整闭合轮廓常用于物体计数、形状识别、目标分割是传统计算机视觉高频模块。1 、轮廓检测1.1 轮廓与边缘的区别边缘图像灰度发生突变的像素点线条零散不一定闭合。轮廓经过算法分组之后属于同一个物体的闭合边界点集合可以做后续计算。重要前提cv2.findContours()输入优先使用二值图像黑色为背景白色为待检测目标。 标准处理流水线彩色图 → 灰度图 → 二值化threshold→ 查找轮廓。1.2 核心 APIcv2.findContours () 查找轮廓contours, hierarchy cv2.findContours(binary_img, mode, method)contours轮廓列表存储图像中所有检测到的轮廓。整体为元组嵌套列表结构每个子列表对应一条独立轮廓由一组物体边界的(x,y)坐标点组成可单独提取、处理单条轮廓。hierarchy轮廓层级用于处理嵌套轮廓物体内部存在孔洞。检索模式 modecv2.RETR_EXTERNAL只提取最外层轮廓忽略内部孔洞日常最常用。cv2.RETR_TREE输出完整的嵌套层级关系处理孔洞、内外轮廓。轮廓点存储方式 methodcv2.CHAIN_APPROX_SIMPLE压缩轮廓点去掉重复冗余点节省内存推荐使用。cv2.CHAIN_APPROX_NONE保存边界上全部像素点点数量大。cv2.drawContours () 绘制轮廓cv2.drawContours(dst_img, contours, index, color, thickness)dst_img绘制轮廓的目标图像必须传入原图副本避免修改原始图像。contours需要绘制的轮廓列表为findContours检测得到的轮廓数组。index轮廓索引-1代表绘制所有轮廓传入具体数字如0、1仅绘制对应序号的单条轮廓。color轮廓绘制颜色遵循 OpenCV 的 BGR 通道格式例如(0,0,255)为红色、(0,255,0)为绿色。thickness轮廓线条宽度单位为像素设置为-1可填充整个轮廓内部区域1.3 轮廓检测基础代码import cv2 读取原图 phone cv2.imread(rD:\pythoncode2\bigdata_ai40\Image\phone.png) 转换灰度图 phone_gray cv2.cvtColor(phone, cv2.COLOR_BGR2GRAY) cv2.imshow(phone_gray, phone_gray) cv2.waitKey(0) 二值化处理分割前景与背景生成黑白二值图 ret, phone_binary cv2.threshold(phone_gray, 127, 255, cv2.THRESH_BINARY) cv2.imshow(phone_binary, phone_binary) cv2.waitKey(0) 查找轮廓 [-2] 兼容所有OpenCV版本稳定获取轮廓列表 RETR_TREE提取完整层级轮廓包含内部孔洞 CHAIN_APPROX_NONE保留轮廓全部像素点 contours cv2.findContours(phone_binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)[-2] print(f检测到轮廓数量{len(contours)}) 绘制所有轮廓 img_copy phone.copy() cv2.drawContours(imageimg_copy, contourscontours, contourIdx-1, color(0, 0, 255), thickness3) cv2.imshow(phone_contour, img_copy) cv2.waitKey(0) 释放所有窗口 cv2.destroyAllWindows()2、轮廓特征拿到单条轮廓cnt contours[i]可以计算物体各类几何特征用于筛选目标物体。1.轮廓面积 contourAreaarea cv2.contourArea(cnt)作用过滤噪声小轮廓设置面积阈值把过小干扰轮廓剔除。2.轮廓周长 arcLengthperi cv2.arcLength(cnt, closedTrue)closedTrue代表轮廓是闭合图形周长是轮廓近似的重要输入参数。3.外接矩形 boundingRect正外接矩形不旋转x, y, w, h cv2.boundingRect(cnt)x,y矩形左上角坐标w,h宽、高。可以画矩形cv2.rectangle(img,(x,y),(xw,yh),(0,0,255),2)4.最小外接旋转矩形 minAreaRectrect cv2.minAreaRect(cnt) box cv2.boxPoints(rect) box np.intp(box) cv2.drawContours(img, [box], 0, (255, 0, 0), 2)可以得到旋转角度适合倾斜物体。5.轮廓重心矩 MomentsM cv2.moments(cnt) cx int(M[m10] / M[m00]) cy int(M[m01] / M[m00])获取物体中心点坐标。使用场景通过面积、宽高比筛选只保留我们感兴趣的物体轮廓。3、轮廓近似3.1 原理原始轮廓包含大量点图像噪声会带来很多毛刺、抖动。轮廓近似approxPolyDP使用道格拉斯‑普克算法用少量顶点多边形去拟合原始复杂轮廓。3.2 APIapprox cv2.approxPolyDP(curve, epsilon, closed)curve输入单条轮廓不能直接传入全部 contours 列表。epsilon近似精度最核心超参数通常取轮廓周长的比例epsilon 0.04 * cv2.arcLength(cnt, True)epsilon 越大顶点越少轮廓越粗糙epsilon 越小顶点越多越贴近原始轮廓。closedTrue表示处理闭合轮廓。根据返回approx顶点数量做形状识别3 个顶点 → 三角形4 个顶点 → 矩形、正方形大量顶点 → 圆形或者不规则图形3.3 完整综合代码import cv2 import numpy as np 读取图像 img cv2.imread(rD:\pythoncode2\bigdata_ai40\Image\shape.png) origin_img img.copy() 图像预处理灰度转换 二值化 gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ret, binary cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) 查找外层轮廓兼容所有OpenCV版本 contours cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2] 绘制原始完整轮廓 cv2.drawContours(origin_img, contours, -1, (0, 255, 0), 2) 遍历所有轮廓计算特征、绘制矩形并执行轮廓近似 for cnt in contours: # 1. 计算轮廓面积过滤微小噪声轮廓 area cv2.contourArea(cnt) if area 50: continue # 2. 计算闭合轮廓周长 peri cv2.arcLength(cnt, closedTrue) # 3. 轮廓近似通过周长比例设置精度 epsilon 0.04 * peri approx cv2.approxPolyDP(cnt, epsilon, closedTrue) # 绘制近似后的多边形轮廓 cv2.drawContours(img, [approx], -1, (255, 0, 0), 2) # 4. 绘制正外接矩形不旋转 x, y, w, h cv2.boundingRect(approx) cv2.rectangle(img, (x, y), (x w, y h), (0, 255, 255), 2) # 5. 绘制最小外接旋转矩形适配倾斜物体 min_rect cv2.minAreaRect(cnt) min_box cv2.boxPoints(min_rect) min_box np.intp(min_box) cv2.drawContours(img, [min_box], 0, (255, 255, 0), 2) # 识别轮廓顶点数量并标注 point_num len(approx) cv2.putText(img, fpts:{point_num}, (x, y-8), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1) 展示结果 cv2.imshow(raw_contour, origin_img) cv2.imshow(approx_feature_result, img) cv2.waitKey(0) 释放所有窗口 cv2.destroyAllWindows()4、本章小结轮廓是闭合物体点集由二值图像提取区别于零散边缘。轮廓特征包含面积、周长、外接矩形、重心用于筛选目标物体。轮廓近似approxPolyDP依靠 epsilon 控制精度依靠顶点数目实现简单形状识别。典型场景零件检测、答题卡识别、图形分类、物体计数。

相关新闻

构建本地AI音乐创作平台:ACE-Step UI的SQLite数据库管理方案

构建本地AI音乐创作平台:ACE-Step UI的SQLite数据库管理方案

构建本地AI音乐创作平台:ACE-Step UI的SQLite数据库管理方案 【免费下载链接】ace-step-ui 🎵 The Ultimate Open Source Suno Alternative - Professional UI for ACE-Step 1.5 AI Music Generation. Free, local, unlimited. Stop paying for Suno! …

2026/10/16 19:29:25 阅读更多 →
ECharts多坐标系组合:解决复杂数据可视化的终极方案

ECharts多坐标系组合:解决复杂数据可视化的终极方案

ECharts多坐标系组合:解决复杂数据可视化的终极方案 【免费下载链接】echarts Apache ECharts is a powerful, interactive charting and data visualization library for browser 项目地址: https://gitcode.com/GitHub_Trending/echa/echarts 在数据可视化…

2026/10/21 10:25:48 阅读更多 →
终极指南:3步实现Office文档到Markdown的完美转换

终极指南:3步实现Office文档到Markdown的完美转换

终极指南:3步实现Office文档到Markdown的完美转换 【免费下载链接】markitdown Python tool for converting files and office documents to Markdown. 项目地址: https://gitcode.com/GitHub_Trending/ma/markitdown 还在为文档格式转换而头疼吗&#xff1f…

2026/10/22 7:24:18 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/21 9:32:40 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/21 9:32:40 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/21 9:32:40 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/21 9:32:40 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/21 9:32:40 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/21 9:31:32 阅读更多 →

日新闻

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/22 1:47:45 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/21 21:32:28 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/22 5:12:39 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/21 21:50:56 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/21 21:51:55 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/21 16:24:48 阅读更多 →