C#联合halcon开发的通用视觉框架,可供初学者使用

打开Visual Studio新建一个C#项目,拖入那个灰底黄框的HWindowControl控件,这玩意儿就是咱们和Halcon交互的主战场。别急着写代码,先想清楚视觉项目的通用套路------相机控制、图像处理、结果显示三大模块得拆明白。

框架里我最得意的CameraController类,封装了海康、Basler这些常见相机的SDK。看这段初始化代码:
csharp
public void Connect(string cameraSN, int timeout = 3000)
{
_hwCamera = new HCamera("GigEVision2", 0, 0, cameraSN);
_hwCamera.OpenFramegrabber();
_isConnected = _hwCamera.IsOpen();
}
参数验证和异常处理被我藏在内部方法里,新手调用时只需要传相机序列号就行。注意那个OpenFramegrabber可能抛出的HalconException,框架里用统一错误码处理,比原生的HOperatorSet友好多了。

图像处理流程才是重头戏。模板匹配模块的FindModel方法藏着几个实用技巧:
halcon
* 缩放模板提升匹配速度
zoom_image_size (TemplateImage, TemplateImageZoom, 320, 240, 'constant')
create_shape_model (TemplateImageZoom, 5, rad(0), rad(360), 'auto', 'auto', 'use_polarity', 'auto', 5, ModelID)
C#那边用Wrapper封装成带进度回调的异步方法,防止界面卡死。看这个匹配结果的可视化代码:
csharp
hWindow.HalconWindow.SetColor("red");
hWindow.HalconWindow.DispRectangle2(pose.Row, pose.Column, pose.Angle, 50, 30);
用HSV颜色空间转换替代RGB是个坑,框架里的ColorConverter类自动处理通道顺序问题,避免新手被Halcon的channel顺序搞懵。
想扩展功能?试试往ProcessingPipeline里加自定义算子。我留了个FilterChain的钩子:
csharp
public void AddFilter(Func<HObject, HObject> filter)
{
_filters.Add(filter);
}
这样你自创的滤波算法可以直接插入处理流程。数据存储模块用SQLite缓存检测结果,查询时注意线程安全:
csharp
lock (_dbLock)
{
using var cmd = _connection.CreateCommand();
cmd.CommandText = "INSERT INTO Results VALUES (@time, @data)";
cmd.Parameters.AddWithValue("@time", DateTime.Now.ToString("yyyyMMddHHmmss"));
cmd.ExecuteNonQuery();
}
GitHub仓库里准备了二十几个常见缺陷检测的案例项目,从二维码识别到焊点检测都有现成参考。记住别在halcon代码里写死路径,框架的ResourceManager会自动定位到项目下的images文件夹,新手克隆仓库直接F5就能跑起来。