最小外接矩形
最小外接矩形一、技术背景最小外接矩形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/10/12 10:42:07 阅读更多 →
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/10/11 22:22:58 阅读更多 →
Qwen3.8-Max-Preview大模型前端开发能力全面解析与应用指南

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

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

2026/10/14 6:57:51 阅读更多 →

最新新闻

对抗样本攻击方法全解析:从FGSM到物理世界攻击

对抗样本攻击方法全解析:从FGSM到物理世界攻击

1. 对抗样本攻击的底层逻辑与整体分类框架搞机器学习安全这块的人,迟早会碰到对抗样本这个绕不开的坎。我第一次接触这个概念是在做一个图像分类的小项目时,模型在测试集上准确率跑到98%以上,结果把一张熊猫照片加上一层肉眼几乎看不出来的噪…

2026/10/15 6:13:42 阅读更多 →
屏幕蓝光与色温调节:Iris护眼软件配置指南

屏幕蓝光与色温调节:Iris护眼软件配置指南

长时间盯着屏幕,眼睛干涩、酸胀、晚上睡不着,这种状态持续了几年之后,我开始认真研究手里的显示设备到底哪里出了问题。折腾过显示器自带的护眼模式,试过系统里的夜间模式,也换过防蓝光眼镜——最后在日常主力设备上长…

2026/10/15 6:13:42 阅读更多 →
曲线轨道轮轨关系与钢轨磨耗养护全解析

曲线轨道轮轨关系与钢轨磨耗养护全解析

1. 曲线轨道:铁路线上最含蓄的“舞池”入行头几年,我一直觉得铁路最迷人的地方不是直线,而是曲线。直线太直白——两条钢轨平铺到底,列车轰隆而过,唯独曲线,列车在这里减速、倾斜、轮缘死死贴住轨侧&#x…

2026/10/15 6:13:42 阅读更多 →
YOLOv8移动端部署实战:NCNN、TNN、MNN三引擎横评与选型指南

YOLOv8移动端部署实战:NCNN、TNN、MNN三引擎横评与选型指南

忙了一下午,把训练好的YOLOv8s导出成ONNX,再转成三种不同的移动端格式,在真机上跑了三轮。反复替换、反复校准,最后得到的结论和很多人想的并不一样——跑分最高的引擎,不一定最少排坑;排坑最少的&#xff…

2026/10/15 6:13:42 阅读更多 →
对抗样本攻击方法全解析:从FGSM到PGD的实战指南

对抗样本攻击方法全解析:从FGSM到PGD的实战指南

1. 对抗样本攻击方法总结:从原理到实操的完整拆解搞对抗样本这几年,我最大的感受就是:攻击方法和防御方法就像在打一场永不停歇的军备竞赛。你今天找到一个能骗过模型的扰动,明天人家加个防御层就把你挡住了。但不管防御怎么进化&…

2026/10/15 6:13:42 阅读更多 →
桌面端AI工具实战:本地会话管理与API密钥安全存储指南

桌面端AI工具实战:本地会话管理与API密钥安全存储指南

1. 桌面端AI工具的核心价值与设计思路1.1 为什么桌面端是更务实的选择聊到AI工具的使用形态,很多人第一反应是打开浏览器、登录网页、输入问题、等待回答。这套流程在偶尔用用的时候没什么问题,但一旦你把它当成日常生产力工具,每天要调用几十…

2026/10/15 6:12:42 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/15 0:14:36 阅读更多 →
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/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练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/14 7:53:34 阅读更多 →