海康威视多相机同步采集与C# Halcon集成方案
📅 2026/7/30 11:27:07
👁️ 阅读次数
📝 编程学习
1. 项目背景与需求分析
在工业视觉检测领域,多相机同步采集是个经典需求。最近接到一个产线改造项目,需要同时控制3台海康威视工业相机进行连续采集,并将图像实时显示在C#开发的UI界面上。这种方案在电子元件检测、包装流水线质检等场景很常见,但实际开发时会遇到不少坑。
传统轮询方式(Polling)在多相机场景下性能堪忧,而回调函数(Callback)机制才是更专业的解决方案。通过海康SDK的回调接口,我们可以在相机硬件触发采集后立即获取图像数据,实现真正的低延迟处理。配合Halcon强大的图像处理能力,这套方案可以轻松应对600fps以上的高速采集需求。
2. 开发环境搭建
2.1 硬件选型要点
- 海康MV-CE060-10GM相机:支持10GigE接口,1920×1200分辨率下可达163fps
- 千兆交换机:建议使用带流量控制功能的工业级交换机(如Moxa PT-7728)
- 工控机配置:i7-1185G7处理器 + 32GB内存 + 512GB SSD + 独立千兆网卡×3
特别注意:多相机采集时务必为每个相机分配独立网卡,避免带宽争用导致丢帧
2.2 软件依赖安装
- 海康MVS开发包(版本≥3.4.0)
- Halcon 22.11 Runtime
- Visual Studio 2022社区版
- .NET 6.0 SDK
安装Halcon时记得勾选".NET Assembly"组件,这是C#调用的关键。我遇到过因为漏装这个导致HalconDotNet.dll引用失败的情况。
3. 核心代码实现
3.1 相机初始化模块
// 创建相机实例数组 private static List<ICamera> cameras = new List<ICamera>(3); void InitCameras() { for(int i=0; i<3; i++) { var cam = new HKCamera(i); // 自定义封装类 cam.SetTriggerMode(TriggerModeEnum.Software); cam.SetPixelFormat(PixelFormatEnum.Mono8); cam.RegisterImageCallBack(ImageCallBack); // 注册回调 cameras.Add(cam); } }3.2 回调函数实现
这是整个系统的核心,注意线程安全问题:
private static object lockObj = new object(); void ImageCallBack(IntPtr pData, MV_FRAME_OUT_INFO_EX frameInfo, IntPtr user) { lock(lockObj) // 多相机回调可能在不同线程触发 { // 转换图像数据为Halcon对象 HImage image = new HImage(); image.GenImage1("byte", frameInfo.nWidth, frameInfo.nHeight, pData); // 更新对应相机的显示窗口 Invoke((MethodInvoker)delegate { hSmartWindowControl[i].HaloionWindow.DispObj(image); }); } }3.3 连续采集控制
void StartAcquisition() { Parallel.ForEach(cameras, cam => { cam.StartGrabbing(); }); }4. 性能优化技巧
4.1 内存管理要点
- 使用对象池复用HImage对象
- 在回调中避免频繁new/delete操作
- 设置合理的GC模式:
System.Runtime.GCSettings.LatencyMode = GCLatencyMode.SustainedLowLatency;
4.2 显示优化方案
当分辨率较高时,建议:
- 使用Halcon的
set_window_attr关闭抗锯齿 - 启用双缓冲显示:
hSmartWindowControl.HalconWindow.SetWindowParam("buffer","true");
5. 常见问题排查
5.1 图像错位问题
现象:多相机图像出现行偏移 解决方法:
- 检查交换机QoS配置
- 调整相机PTP时钟同步
- 在SDK中设置
MV_CC_SetGrabTimeout(1500)
5.2 回调丢失问题
典型报错:"Callback not called within timeout" 处理步骤:
- 确认网络带宽是否饱和(使用Wireshark抓包)
- 检查
MV_CC_SetImageNodeNum设置值(建议≥10) - 降低采集分辨率测试
6. 扩展应用场景
这套框架稍作修改即可用于:
- 三维立体视觉(多目相机标定)
- 高速运动物体追踪
- 在线质量检测系统
最近在一个锂电池极片检测项目中,我们基于此方案实现了0.2mm/pixel的检测精度,通过多相机拼接实现了600mm宽幅产品的全覆盖检测。关键是在回调函数中直接集成Halcon的测量算法,实现了采集-处理-结果显示的流水线作业。
实际部署时发现,给每个相机单独配置UPS电源很重要——产线电压波动会导致相机IP地址丢失。另外建议在Halcon窗口显示中添加FPS计数器,方便实时监控系统状态。
编程学习
技术分享
实战经验