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 center和float radius。1. 函数名称带参数签名publicstaticvoidMinEnclosingCircle(InputArraypoints,outPoint2fcenter,outfloatradius)2. 函数用途Cv2.MinEnclosingCircle(...)用来计算包住所有输入点的最小圆。这个重载最适合点集已经在Mat里的场景输入可以直接来自轮廓矩阵。返回结果是圆心和半径便于后续绘图。不需要先把点拆成别的容器。它常用于目标大小估计。圆形区域分析。几何教学中的“最小包围”概念演示。作为更复杂测量步骤的前置结果。3. 函数公式最小外接圆可以写成一个约束优化问题C ∗ arg min C ⊇ P A r e a ( C ) C^* \arg\min_{C \supseteq P} Area(C)C∗argC⊇PminArea(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)∣(x−cx)2(y−cy)2≤r2}这里c x , c y c_x, c_ycx,cy是圆心坐标r rr是半径。4. 函数原理说明这个函数的重点不是“画圆”而是“找到刚好包住全部点的最小圆”。对初学者来说可以先这样理解先观察点集的大致分布。再寻找一个能包住所有点的最小圆。最后把圆心和半径返回给调用者。官方文档说明它是一个迭代式算法所以它输出的是数值结果而不是圆周上的点集。5. 参数含义解析参数名类型必填含义pointsInputArray是输入二维点集centerPoint2f是输出圆心radiusfloat是输出半径补充说明points常见来源是Mat、UMat或轮廓缓存。center是Point2f所以圆心可以保留小数。radius是float适合直接用于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 里”的场景。usingvarpointMatMat.FromArray(points);// 这里会返回圆心和半径便于直接绘图或继续做几何分析。Cv2.MinEnclosingCircle(pointMat,outPoint2fcenter,outfloatradius);// 额外打印一个外接矩形帮助初学者理解圆和矩形的包围关系。RectboundingRectCv2.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. 常见错误与避坑把MinEnclosingCircle和HoughCircles混为一谈。忘记center是Point2f画图时需要先转成像素坐标。误以为输出的是圆周上的点集而不是圆心和半径。只关注半径忽略输入点集整体分布。9. 进阶扩展可以把圆心和半径传给Cv2.Circle画出结果。可以把最小外接圆和BoundingRect、MinAreaRect放在一起对比。可以用圆面积和外接矩形面积做粗略形状分析。可以把圆心当成对象中心点继续做后续测量。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
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 center和float radius。1. 函数名称带参数签名publicstaticvoidMinEnclosingCircle(InputArraypoints,outPoint2fcenter,outfloatradius)2. 函数用途Cv2.MinEnclosingCircle(...)用来计算包住所有输入点的最小圆。这个重载最适合点集已经在Mat里的场景输入可以直接来自轮廓矩阵。返回结果是圆心和半径便于后续绘图。不需要先把点拆成别的容器。它常用于目标大小估计。圆形区域分析。几何教学中的“最小包围”概念演示。作为更复杂测量步骤的前置结果。3. 函数公式最小外接圆可以写成一个约束优化问题C ∗ arg min C ⊇ P A r e a ( C ) C^* \arg\min_{C \supseteq P} Area(C)C∗argC⊇PminArea(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)∣(x−cx)2(y−cy)2≤r2}这里c x , c y c_x, c_ycx,cy是圆心坐标r rr是半径。4. 函数原理说明这个函数的重点不是“画圆”而是“找到刚好包住全部点的最小圆”。对初学者来说可以先这样理解先观察点集的大致分布。再寻找一个能包住所有点的最小圆。最后把圆心和半径返回给调用者。官方文档说明它是一个迭代式算法所以它输出的是数值结果而不是圆周上的点集。5. 参数含义解析参数名类型必填含义pointsInputArray是输入二维点集centerPoint2f是输出圆心radiusfloat是输出半径补充说明points常见来源是Mat、UMat或轮廓缓存。center是Point2f所以圆心可以保留小数。radius是float适合直接用于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 里”的场景。usingvarpointMatMat.FromArray(points);// 这里会返回圆心和半径便于直接绘图或继续做几何分析。Cv2.MinEnclosingCircle(pointMat,outPoint2fcenter,outfloatradius);// 额外打印一个外接矩形帮助初学者理解圆和矩形的包围关系。RectboundingRectCv2.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. 常见错误与避坑把MinEnclosingCircle和HoughCircles混为一谈。忘记center是Point2f画图时需要先转成像素坐标。误以为输出的是圆周上的点集而不是圆心和半径。只关注半径忽略输入点集整体分布。9. 进阶扩展可以把圆心和半径传给Cv2.Circle画出结果。可以把最小外接圆和BoundingRect、MinAreaRect放在一起对比。可以用圆面积和外接矩形面积做粗略形状分析。可以把圆心当成对象中心点继续做后续测量。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