c#opencv 算圆度
时间: 2025-02-10 11:01:31 浏览: 54
### 如何使用 C# 和 OpenCV 计算图像中物体的圆度
#### 圆度定义
圆度是一个衡量对象接近圆形程度的几何属性。对于一个完美的圆形,其周长 \( P \) 与其面积 \( A \) 的关系遵循公式:
\[ P = 2\pi r, \quad A = \pi r^2 \]
因此,可以推导出理想圆形的圆度公式为:
\[ Circularity = \frac{4\pi A}{P^2} \]
当形状越趋近于圆形时,该比率会更接近1;而对于其他形状,则通常小于1。
#### 实现步骤概述
为了计算给定二值化后的轮廓区域内的目标物之圆度,在C#环境中利用OpenCVSharp库完成如下操作:
- 转换成灰度并应用边缘检测算法获取边界信息;
- 查找所有的轮廓并将它们按大小排序选取最大者作为候选区;
- 对选定的最大连通域提取特征——即计算其外接多边形长度(相当于周长)、以及内部像素数量总和来估算面积;
- 应用上述提到的圆度公式得出最终结果。
下面是具体的代码实现方式:
```csharp
using Cv = OpenCvSharp;
using System;
public class ShapeAnalysis {
public static double CalculateCircularity(Cv.Mat image){
// 将输入图片转换成单通道灰度图
var grayImage = new Mat();
Cv.Cv2.CvtColor(image, grayImage, ColorConversionCodes.BGR2GRAY);
// 使用高斯模糊减少噪声影响
var blurredGrayImage = new Mat();
Cv.Cv2.GaussianBlur(grayImage, blurredGrayImage, new Size(5, 5), 0);
// 进行边缘检测得到二值化的边缘映射
var edges = new Mat();
Cv.Cv2.Canny(blurredGrayImage, edges, 50, 150);
// 寻找所有封闭曲线(轮廓)
List<Cv.Point[]> contours = new List<Point[]>();
HierarchyIndex[] hierarchyIndexes;
Cv.Cv2.FindContours(edges, out contours, out hierarchyIndexes,
RetrievalModes.External, ContourApproximationModes.ApproxSimple);
if (contours.Count == 0 || contours.Max(c => c.Length) <= 0)
throw new ArgumentException("No valid contour found.");
// 获取最大的轮廓
Point[] largestContourPoints = contours.OrderByDescending(c => Cv.Cv2.ContourArea(c)).First();
// 计算轮廓的弧长(Perimeter)与面积(Area)
double perimeter = Cv.Cv2.ArcLength(largestContourPoints.AsSpan(), true);
double area = Cv.Cv2.ContourArea(largestContourPoints);
// 如果面积过小则认为不是有效的圆形结构
if(area < 1e-6)
return Double.NaN;
// 根据公式计算圆度
double circularity = (4 * Math.PI * area)/(perimeter*perimeter);
return circularity;
}
}
```
此函数接收一幅彩色或黑白图像作为参数,并返回所选区域内最显著的对象对应的圆度数值。注意这里假设传入的是已经预处理过的合适尺寸且背景简单的图像[^1]。
阅读全文
相关推荐


















