1. 项目概述:当C#遇上计算机视觉
十年前我第一次接触工业视觉检测时,需要配置复杂的C++环境和晦涩的OpenCV接口。如今通过OpenCvSharp和Emgu.CV这两个.NET封装库,我们可以在熟悉的C#环境中快速实现强大的视觉算法。这次我将分享如何从零开始构建一个完整的视觉识别系统,重点演示工业场景中最实用的卡尺找圆算法实现。
OpenCvSharp是OpenCV的.NET Standard封装,相比Emgu.CV更接近原生OpenCV的API风格。两者都支持:
- 图像采集与预处理(滤波、二值化等)
- 特征检测(边缘、角点、轮廓等)
- 模式识别(模板匹配、机器学习等)
- 几何测量(尺寸、角度、位置等)
实测对比:OpenCvSharp在算法执行效率上比Emgu.CV快15%-20%,但Emgu.CV的文档和示例更丰富。对于需要与WPF深度集成的项目,Emgu.CV的Mat与Bitmap互转更便捷。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境搭建与基础配置
2.1 开发环境准备
推荐使用VS2022+.NET6环境,通过NuGet安装:
bash复制Install-Package OpenCvSharp4
Install-Package OpenCvSharp4.runtime.win
若选择Emgu.CV则需额外安装:
bash复制Install-Package Emgu.CV
Install-Package Emgu.CV.runtime.windows
2.2 图像处理基础框架
创建通用图像处理类时,建议采用如下结构:
csharp复制public class VisionProcessor : IDisposable
{
private Mat _srcImage;
private Mat _processedImage;
public void LoadImage(string path) {
_srcImage = Cv2.ImRead(path, ImreadModes.Color);
}
public Mat Preprocess() {
_processedImage = new Mat();
Cv2.CvtColor(_srcImage, _processedImage, ColorConversionCodes.BGR2GRAY);
Cv2.GaussianBlur(_processedImage, _processedImage, new Size(5,5), 1.5);
return _processedImage;
}
public void Dispose() {
_srcImage?.Dispose();
_processedImage?.Dispose();
}
}
3. 核心算法实现:卡尺找圆技术
3.1 算法原理剖析
卡尺找圆(Caliper Circle Detection)是工业视觉中的经典算法,其核心流程:
- ROI区域设定:在预期位置划定搜索区域
- 边缘梯度检测:沿径向布置测量卡尺
- 边缘点筛选:通过梯度阈值过滤噪声点
- 圆拟合计算:最小二乘法拟合最佳
