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

OpencvSharp 算子学习教案之 - Cv2.MinEnclosingCircle 重载1

OpencvSharp 算子学习教案之 - Cv2.MinEnclosingCircle 重载1

大家好,Opencv在很多工程项目中都会用到,而OpencvSharp则是以C#开发与实现的Opencv操作库,对.NET开发人员友好,但很多API的中文资料、应用场景及常见坑点等缺乏系统性归纳,因此这系列博客将给大家带来Cv2及Mat对象全系列算子学习教案,供大家参考学习。

Cv2.MinEnclosingCircle

  • 教案版本:V1.0
  • 面向对象:OpenCvSharp 初学者
  • 所属模块:imgproc
  • 源码位置:OpenCvSharp/Cv2/Cv2_imgproc.cs:3376 / 3392 / 3407

摘要:本页演示MinEnclosingCircle(InputArray)如何从Mat点集计算最小外接圆的圆心和半径,并说明结果会写回Point2f centerfloat radius

1. 函数名称(带参数签名)

publicstaticvoidMinEnclosingCircle(InputArraypoints,outPoint2fcenter,outfloatradius)

2. 函数用途

Cv2.MinEnclosingCircle(...)用来计算包住所有输入点的最小圆。

这个重载最适合点集已经在Mat里的场景:

  1. 输入可以直接来自轮廓矩阵。
  2. 返回结果是圆心和半径,便于后续绘图。
  3. 不需要先把点拆成别的容器。

它常用于:

  1. 目标大小估计。
  2. 圆形区域分析。
  3. 几何教学中的“最小包围”概念演示。
  4. 作为更复杂测量步骤的前置结果。

3. 函数公式

最小外接圆可以写成一个约束优化问题:

C ∗ = arg ⁡ min ⁡ C ⊇ P A r e a ( C ) C^* = \arg\min_{C \supseteq P} Area(C)C=argCPminArea(C)

其中圆C CC可以表示为:

C = { ( x , y ) ∣ ( x − c x ) 2 + ( y − c y ) 2 ≤ r 2 } C = \{(x, y) \mid (x-c_x)^2 + (y-c_y)^2 \le r^2\}C={(x,y)(xcx)2+(ycy)2r2}

这里c x , c y c_x, c_ycx,cy是圆心坐标,r rr是半径。

4. 函数原理说明

这个函数的重点不是“画圆”,而是“找到刚好包住全部点的最小圆”。

对初学者来说,可以先这样理解:

  1. 先观察点集的大致分布。
  2. 再寻找一个能包住所有点的最小圆。
  3. 最后把圆心和半径返回给调用者。

官方文档说明它是一个迭代式算法,所以它输出的是数值结果,而不是圆周上的点集。

5. 参数含义解析

参数名类型必填含义
pointsInputArray输入二维点集
centerPoint2f输出圆心
radiusfloat输出半径

补充说明:

  1. points常见来源是MatUMat或轮廓缓存。
  2. centerPoint2f,所以圆心可以保留小数。
  3. radiusfloat,适合直接用于Cv2.Circle

6. 应用场景列表

场景名场景说明典型用途
场景A:目标范围用一个圆概括对象大小检测与测量
场景B:圆形近似估计对象的近似半径粗略分类
场景C:可视化把圆心和半径画回图像教学演示
场景D:教学入门理解“最小外接”几何概念OpenCvSharp 入门

7. 函数使用示例(与 WPF 场景一一对应)

说明:下面示例对应 WPF 场景 A。它先把点集包装成 Mat,再求最小外接圆。

usingSystem;usingOpenCvSharp;internalstaticclassProgram{privatestaticvoidMain(){// 这组点围成一个略微不规则的圆形,便于观察最小外接圆的效果。Point2f[]points={newPoint2f(82.5f,166.0f),newPoint2f(100.0f,108.5f),newPoint2f(158.0f,76.0f),newPoint2f(226.5f,80.5f),newPoint2f(284.0f,122.0f),newPoint2f(300.0f,186.5f),newPoint2f(268.0f,246.0f),newPoint2f(208.5f,270.0f),newPoint2f(140.0f,262.5f),newPoint2f(90.0f,218.0f),};// InputArray 重载常常用在“点集已经存在于 Mat 里”的场景。usingvarpointMat=Mat.FromArray(points);// 这里会返回圆心和半径,便于直接绘图或继续做几何分析。Cv2.MinEnclosingCircle(pointMat,outPoint2fcenter,outfloatradius);// 额外打印一个外接矩形,帮助初学者理解圆和矩形的包围关系。RectboundingRect=Cv2.BoundingRect(pointMat);Console.WriteLine($"PointCount ={points.Length}");Console.WriteLine($"Center = ({center.X:F1},{center.Y:F1})");Console.WriteLine($"Radius ={radius:F2}");Console.WriteLine($"Diameter ={(radius*2):F2}");Console.WriteLine($"CircleArea ={(Math.PI*radius*radius):F2}");Console.WriteLine($"BoundingRect = ({boundingRect.X},{boundingRect.Y},{boundingRect.Width},{boundingRect.Height})");// 这行说明了本例的核心:MinEnclosingCircle 返回的是圆心和半径,而不是圆周点。Console.WriteLine("MinEnclosingCircle 会直接给出圆心和半径,后续可交给 Cv2.Circle 绘制。\n");}}

8. 常见错误与避坑

  1. MinEnclosingCircleHoughCircles混为一谈。
  2. 忘记centerPoint2f,画图时需要先转成像素坐标。
  3. 误以为输出的是圆周上的点集,而不是圆心和半径。
  4. 只关注半径,忽略输入点集整体分布。

9. 进阶扩展

  1. 可以把圆心和半径传给Cv2.Circle画出结果。
  2. 可以把最小外接圆和BoundingRectMinAreaRect放在一起对比。
  3. 可以用圆面积和外接矩形面积做粗略形状分析。
  4. 可以把圆心当成对象中心点,继续做后续测量。

10. 小结

Cv2.MinEnclosingCircle(...)的 InputArray 重载适合已经在Mat中保存的点集。

如果你只想知道“这个点集最小能被什么圆包住”,它会直接返回圆心和半径。

11. 相关链接

  • WPF 教学控件:Cv2MinEnclosingCircleControl.xaml.cs
  • 样例实现:MinEnclosingCircleInputArraySample.cs
  • 官方文档源码位置:OpenCvSharp/Cv2/Cv2_imgproc.cs
  • 另一个重载源码位置:OpenCvSharp/Cv2/Cv2_imgproc.cs
  • 另一个重载源码位置:OpenCvSharp/Cv2/Cv2_imgproc.cs
http://www.jsqmd.com/news/927653/

相关文章:

  • Vue项目实战:用vue3-scroll-seamless为数据大屏打造‘会呼吸’的实时滚动列表
  • 宇树Z1机械臂ROS仿真:从Gazebo启动到键盘操控的保姆级避坑指南(ROS Noetic)
  • 告别单调画面!用UE5材质和后期处理Box调出电影级监控摄像头滤镜
  • 用PYNQ和ZYNQ7000玩转实时人脸识别:从笔记本摄像头到开发板LED灯的全流程实战
  • AI如何重塑超市运营:五大核心场景与落地实践
  • 量子计算中的硬件串扰攻击与防御策略
  • 规则引擎与AI系统:从if-else到机器学习的智能决策技术解析
  • PCB设计省钱指南:如何用SI9000仿真帮你选对板材(FR4还是高速料?)
  • 基于AI智能体与知识图谱的个性化烹饪助手:从规划到执行的系统实践
  • CDO、CAIO、CRO:数据、AI与机器人时代的企业新C级领导力
  • PPT怎么转PDF?免费PPT转PDF在线工具与方法2026实测指南
  • 从《我的世界》到《原神》:聊聊Unity材质管理sharedMaterial和material在游戏开发中的那些“潜规则”
  • 双端口构网控制技术在混合交直流系统中的应用
  • DE2-115开发板实战:用Verilog HDL驱动LCD1602显示滚动字符(附完整代码与避坑指南)
  • ADI SigmaStudio+ 2.1安装后别乱点!先找到这个隐藏的‘Target’文件夹(ADSP-21569开发必备)
  • 保姆级教程:用Nvidia-smi命令行参数,给你的GPU做个‘全身体检’
  • 别只盯着成品排程,MRP 算不准库存照样得停产
  • 增强型人类技术:从脑机接口到外骨骼的实践与伦理挑战
  • 人决策、AI支持、区块链支付:下一代工作协作范式解析
  • Spring Boot 从零入门:请求响应、三层架构与 IOC/DI 实践总结
  • AI驱动招聘自动化:从简历解析到智能匹配的实战架构与落地
  • openEuler内网yum源搭建实战:用Nginx快速部署,实现团队共享软件包
  • Rust服务端渲染实战:集成Dall.E API构建高性能AI图像生成应用
  • 别再只盯着RabbitMQ和Kafka了:深度解析TongLINKQ的进程模型与高可靠设计
  • 游戏开发避坑指南:用SAT算法搞定Unity/Cocos Creator中复杂3D模型的碰撞检测
  • 拒绝“胡言乱语”:企业级 RAG 应用中如何彻底规避 LLM 幻觉?
  • 电磁场:从库伦定律到高斯公式、静电平衡
  • Windows Terminal配置
  • Instant-NGP里的哈希表魔法:用Python代码拆解多分辨率哈希编码,告别NeRF的‘过平滑’
  • ICML 2024投稿倒计时24天:手把手教你用OpenReview搞定顶会论文提交(附避坑清单)