最小外接矩形
最小外接矩形一、技术背景最小外接矩形Bounding Rectangle是包围目标轮廓的最小矩形区域。在SEM图像分析中最小外接矩形用于测量目标的宽度和高度确定目标的空间位置计算目标的长宽比OpenCV提供两种最小外接矩形正交外接矩形边界与图像坐标轴对齐的矩形旋转外接矩形可任意角度旋转的最小面积矩形二、数学原理2.1 正交外接矩形BoundingRect正交外接矩形定义为R[xmin,ymin,w,h]R [x_{min}, y_{min}, w, h]R[xmin​,ymin​,w,h]其中xminmin⁡ixix_{min} \min_{i} x_ixmin​mini​xi​最小x坐标yminmin⁡iyiy_{min} \min_{i} y_iymin​mini​yi​最小y坐标wxmax−xminw x_{max} - x_{min}wxmax​−xmin​宽度hymax−yminh y_{max} - y_{min}hymax​−ymin​高度2.2 旋转外接矩形minAreaRect旋转外接矩形是面积最小的外接矩形通过遍历所有可能的角度求解min⁡θA(θ)\min_{\theta} A(\theta)θmin​A(θ)其中A(θ)A(\theta)A(θ)为角度θ\thetaθ时的外接矩形面积。2.3 算法原理正交外接矩形计算所有点的x、y极值复杂度O(n)O(n)O(n)旋转外接矩形基于凸包计算使用旋转卡壳算法复杂度O(nlog⁡n)O(n \log n)O(nlogn)2.4 参数说明类型返回值参数含义BoundingRectRectx, y, width, heightminAreaRectRotatedRectcenter, size, angle三、代码实现3.1 MainForm中的正交外接矩形文件路径:e:\SEM\Forms\MainForm.cs// 正交外接矩形计算for(inti0;iprocessingImageInfo.contours.Length;i){varcountourprocessingImageInfo.contours[i];doublearea_pxCv2.ContourArea(countour);if(area_px200){// 正交外接矩形RectbboxCv2.BoundingRect(countour);// 单位换算像素 → μmvarmetricnewimageUtils.ContourMetric{Indexi1,Area_um2areaUm2,Perimeter_umperi_um,BBoxX_umbbox.X,BBoxY_umbbox.Y,BBoxWidth_umMath.Round(bbox.Width*umPerPixel,2),BBoxHeight_umMath.Round(bbox.Height*umPerPixel,2)};processingImageInfo.ContourMetrics.Add(metric);}}3.2 报告导出中的应用文件路径:e:\SEM\Forms\MainForm.cs// 报告导出中的外接矩形参数for(inti0;iinfo.contours.Length;i){varcontourinfo.contours[i];// 面积过滤doubleareaThreshold200*areaPixelToUm2;if(areaareaThreshold)continue;// 正交外接矩形RectbboxCv2.BoundingRect(contour);// 单位换算后的参数doublewidth_umbbox.Width*umPerPixel;doubleheight_umbbox.Height*umPerPixel;varrownewListstring{Path.GetFileName(imgPath),area.ToString(F2),bbox.X.ToString(),bbox.Y.ToString(),(bbox.Width*umPerPixel).ToString(),(bbox.Height*umPerPixel).ToString(),// ... 其他参数};}3.3 硬垫分割中的外接矩形文件路径:e:\SEM\Forms\MainForm.cs// 硬垫分割结果处理for(inti0;iprocessingImageInfo.contours.Length;i){varcontourprocessingImageInfo.contours[i];doublearea_pxCv2.ContourArea(contour);if(area_px200){// 正交外接矩形RectbboxCv2.BoundingRect(countour);// 椭圆拟合如果点数足够if(contour.Length5){RotatedRectellipseCv2.FitEllipse(contour);}varmetricnewimageUtils.ContourMetric{Indexi1,Area_um2area_um2,Perimeter_umperi_um,BBoxX_umbbox.X,BBoxY_umbbox.Y,BBoxWidth_umMath.Round(bbox.Width*umPerPixel,2),BBoxHeight_umMath.Round(bbox.Height*umPerPixel,2)};processingImageInfo.ContourMetrics.Add(metric);}}3.4 ContourMetric结构体文件路径:e:\SEM\Utils\imageUtils.cspublicclassContourMetric{publicintIndex{get;set;}publicdoubleArea_um2{get;set;}publicdoublePerimeter_um{get;set;}publicdoubleBBoxX_um{get;set;}// 外接矩形左上角XpublicdoubleBBoxY_um{get;set;}// 外接矩形左上角YpublicdoubleBBoxWidth_um{get;set;}// 外接矩形宽度publicdoubleBBoxHeight_um{get;set;}// 外接矩形高度publicdoubleMajorAxis_um{get;set;}publicdoubleMinorAxis_um{get;set;}publicdoubleAngle_deg{get;set;}}四、参数调优4.1 单位换算文件路径:e:\SEM\Methods\MicroscopeScale.cs// 放大倍率与像素尺寸对应MicroscopeScalescaleToolnewMicroscopeScale();intmagnification200;doubleumPerPixelscaleTool.GetUmPerPixel(magnification);// 宽度像素 → μmdoublewidth_umbbox.Width*umPerPixel;// 高度像素 → μmdoubleheight_umbbox.Height*umPerPixel;4.2 放大倍率对应关系放大倍数μm/pixel说明X60~2.5每像素约2.5μmX100~1.58每像素约1.58μmX200~0.79每像素约0.79μm4.3 测量精度影响测量精度的因素图像分辨率放大倍率标定精度轮廓检测精度提高精度方法// 方法1使用高分辨率// 方法2亚像素边缘检测// 方法3多次测量取平均五、常见问题Q1: BoundingRect与minAreaRect的区别对比项BoundingRectminAreaRect方向固定与坐标轴对齐可旋转面积较大最小计算速度快O(n)O(n)O(n)较慢O(nlog⁡n)O(n \log n)O(nlogn)适用场景快速定位精确测量示例对斜椭圆BoundingRect面积较大包含空白区域minAreaRect面积最小紧密包围Q2: 如何选择使用哪种外接矩形选择依据快速筛选使用BoundingRect精确测量使用minAreaRect方向分析使用minAreaRect获取角度Q3: 外接矩形的坐标原点在哪里OpenCV图像坐标系原点左上角X轴向右为正Y轴向下为正外接矩形的(x,y)(x, y)(x,y)表示左上角坐标。Q4: 如何计算长宽比RectbboxCv2.BoundingRect(contour);// 正交外接矩形的长宽比doubleaspectRatio(double)bbox.Width/bbox.Height;// 或者使用minAreaRectRotatedRectminRectCv2.MinAreaRect(contour);doublemajorAxisMath.Max(minRect.Size.Width,minRect.Size.Height);doubleminorAxisMath.Min(minRect.Size.Width,minRect.Size.Height);doubleaspectRatiomajorAxis/minorAxis;Q5: 外接矩形参数如何转换单位单位换算公式长度μm长度pixel×umPerPixel\text{长度}_{\mu m} \text{长度}_{pixel} \times \text{umPerPixel}长度μm​长度pixel​×umPerPixel面积μm2面积pixel2×(umPerPixel)2\text{面积}_{\mu m^2} \text{面积}_{pixel^2} \times (\text{umPerPixel})^2面积μm2​面积pixel2​×(umPerPixel)2// 长度换算doublewidth_umbbox.Width*umPerPixel;doubleheight_umbbox.Height*umPerPixel;// 坐标换算如果需要实际位置doublex_umbbox.X*umPerPixel;doubley_umbbox.Y*umPerPixel;Q6: 如何绘制外接矩形// 绘制正交外接矩形RectbboxCv2.BoundingRect(contour);Cv2.Rectangle(image,bbox,newScalar(0,255,0),2);// 绘制旋转外接矩形RotatedRectminRectCv2.MinAreaRect(contour);Point[]verticesCv2.BoxPoints(minRect).Select(pnewPoint((int)p.X,(int)p.Y)).ToArray();for(inti0;i4;i){Cv2.Line(image,vertices[i],vertices[(i1)%4],newScalar(255,0,0),2);}// 同时绘制两种矩形对比效果Cv2.Rectangle(image,bbox,newScalar(0,255,0),1);// 绿色正交矩形Cv2.Polylines(image,new[]{vertices},true,newScalar(0,0,255),2);// 红色旋转矩形

相关新闻

C++网络五子棋实战:从Socket通信到多线程对战系统开发

C++网络五子棋实战:从Socket通信到多线程对战系统开发

1. 项目概述:从单机到网络的五子棋跃迁五子棋,规则简单,策略深邃,是很多人编程入门的经典练手项目。一个控制台下的单机双人对战,用基础的二维数组和判断逻辑就能实现。但当我们把“网络”和“对战”这两个词加进来&am…

2026/7/24 18:51:40 阅读更多 →
NoSleep防休眠工具深度解析:如何用200KB代码彻底解决Windows自动锁屏难题

NoSleep防休眠工具深度解析:如何用200KB代码彻底解决Windows自动锁屏难题

NoSleep防休眠工具深度解析:如何用200KB代码彻底解决Windows自动锁屏难题 【免费下载链接】NoSleep Lightweight Windows utility to prevent screen locking 项目地址: https://gitcode.com/gh_mirrors/nos/NoSleep 你是否曾因Windows系统自动休眠而丢失重要…

2026/7/24 18:51:40 阅读更多 →
Qwen3.8-Max-Preview大模型前端开发能力全面解析与应用指南

Qwen3.8-Max-Preview大模型前端开发能力全面解析与应用指南

这次我们来看阿里云最新发布的 Qwen3.8-Max-Preview 大模型版本,重点聚焦其在前端开发能力上的显著提升。作为通义千问系列的最新预览版,这个版本在前端代码生成、调试、优化等场景表现出更强的专业能力,对于前端开发者来说值得重点关注。 从…

2026/7/24 18:51:40 阅读更多 →

最新新闻

终极免费直播录制指南:一次配置永久监控40+平台

终极免费直播录制指南:一次配置永久监控40+平台

终极免费直播录制指南:一次配置永久监控40平台 【免费下载链接】DouyinLiveRecorder 可循环值守和多人录制的直播录制软件,支持抖音、TikTok、Youtube、快手、虎牙、斗鱼、B站、小红书、pandatv、sooplive、flextv、popkontv、twitcasting、winktv、百度…

2026/7/24 19:33:50 阅读更多 →
终极分屏游戏革命:如何用Nucleus Co-op让单机游戏变多人派对

终极分屏游戏革命:如何用Nucleus Co-op让单机游戏变多人派对

终极分屏游戏革命:如何用Nucleus Co-op让单机游戏变多人派对 【免费下载链接】nucleuscoop Starts multiple instances of a game for split-screen multiplayer gaming! 项目地址: https://gitcode.com/gh_mirrors/nu/nucleuscoop 你是否曾经梦想过将PC游戏…

2026/7/24 19:33:50 阅读更多 →
如果AI比人类更聪明,社会结构会如何改变?

如果AI比人类更聪明,社会结构会如何改变?

最近两年,AI的进化速度远超所有人的预期。从最初简单的文字生成、图片制作,到如今能独立完成逻辑推演、科研实验、方案设计、数据分析,甚至在学习、决策、创造层面不断突破人类上限。很多人开始正视一个曾经只存在于科幻电影的问题&#xff1…

2026/7/24 19:33:50 阅读更多 →
抖音直播录制终极指南:专业级多平台直播录制解决方案

抖音直播录制终极指南:专业级多平台直播录制解决方案

抖音直播录制终极指南:专业级多平台直播录制解决方案 【免费下载链接】DouyinLiveRecorder 可循环值守和多人录制的直播录制软件,支持抖音、TikTok、Youtube、快手、虎牙、斗鱼、B站、小红书、pandatv、sooplive、flextv、popkontv、twitcasting、winktv…

2026/7/24 19:33:50 阅读更多 →
提示词风格漂移预警系统上线!——用BERT+Rule Engine实现毫秒级语气一致性检测(附开源代码)

提示词风格漂移预警系统上线!——用BERT+Rule Engine实现毫秒级语气一致性检测(附开源代码)

更多请点击: https://kaifayun.com 第一章:提示词语气风格控制 提示词的语气与风格直接影响大语言模型输出的专业性、亲和力与一致性。在实际工程实践中,通过结构化指令显式声明语气偏好,比依赖模型默认行为更可靠、可复现。 明…

2026/7/24 19:33:50 阅读更多 →
Excel/WPS自动化排班表制作:函数公式与条件格式实战指南

Excel/WPS自动化排班表制作:函数公式与条件格式实战指南

在企业日常管理中,员工排班是项繁琐但重要的工作。传统手工排班不仅耗时耗力,还容易出错。本文将完整演示如何利用Excel和WPS制作自动化排班表,通过函数公式、条件格式和数据有效性等功能,实现一键生成轮班表、自动标记异常排班、…

2026/7/24 19:32:49 阅读更多 →

日新闻

用Highcharts 创建可拖拽三维散点立方体3D图表

用Highcharts 创建可拖拽三维散点立方体3D图表

该案例基于Highcharts scatter3d 三维散点图实现空间立方体散点可视化,核心特色:三维 X/Y/Z 三轴空间,所有散点分布在 0~10 立方体空间内;散点使用径向渐变实现立体 3D 圆球质感;支持鼠标 / 触屏拖拽画布,…

2026/7/24 0:00:29 阅读更多 →
AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口 AppCertDlls 位于 HKLM\System\CurrentControlSet\Control\Session Manager\AppCertDlls。本文的程序功能是只读列出这个键在 64 位和 32 位注册表视图中的全部值,并显示每条值的来源、名称、类型和可安全显示的数…

2026/7/24 0:00:29 阅读更多 →
我的编程之路:第一篇博客

我的编程之路:第一篇博客

大家好,我是一名编程初学者,同时这也是我编程学习之路上的第一篇博客。在这里,我想要向大家介绍我的一些想法和规划。a.自我介绍我是一个刚刚接触编程的新手,目前在学习c语言,我对编程世界充满了强烈的好奇。当然&…

2026/7/24 0:00:29 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/24 3:59:20 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/24 1:23:39 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/24 18:52:18 阅读更多 →

月新闻