海康威视多相机同步采集与C# Halcon集成方案

📅 2026/7/30 11:27:07 👁️ 阅读次数 📝 编程学习
海康威视多相机同步采集与C# Halcon集成方案

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 软件依赖安装

  1. 海康MVS开发包(版本≥3.4.0)
  2. Halcon 22.11 Runtime
  3. Visual Studio 2022社区版
  4. .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 显示优化方案

当分辨率较高时,建议:

  1. 使用Halcon的set_window_attr关闭抗锯齿
  2. 启用双缓冲显示:
    hSmartWindowControl.HalconWindow.SetWindowParam("buffer","true");

5. 常见问题排查

5.1 图像错位问题

现象:多相机图像出现行偏移 解决方法:

  1. 检查交换机QoS配置
  2. 调整相机PTP时钟同步
  3. 在SDK中设置MV_CC_SetGrabTimeout(1500)

5.2 回调丢失问题

典型报错:"Callback not called within timeout" 处理步骤:

  1. 确认网络带宽是否饱和(使用Wireshark抓包)
  2. 检查MV_CC_SetImageNodeNum设置值(建议≥10)
  3. 降低采集分辨率测试

6. 扩展应用场景

这套框架稍作修改即可用于:

  • 三维立体视觉(多目相机标定)
  • 高速运动物体追踪
  • 在线质量检测系统

最近在一个锂电池极片检测项目中,我们基于此方案实现了0.2mm/pixel的检测精度,通过多相机拼接实现了600mm宽幅产品的全覆盖检测。关键是在回调函数中直接集成Halcon的测量算法,实现了采集-处理-结果显示的流水线作业。

实际部署时发现,给每个相机单独配置UPS电源很重要——产线电压波动会导致相机IP地址丢失。另外建议在Halcon窗口显示中添加FPS计数器,方便实时监控系统状态。