1. 项目概述:多相机并行采集系统设计
在工业视觉检测领域,多相机同步采集是常见的硬件架构方案。最近完成的一个食品包装检测项目需要同时连接三台海康威视MV-CE060-10GC工业相机,通过C#开发的上位机程序配合Halcon实现实时图像采集与处理。这种架构的典型应用场景包括:
- 产线多工位同步质检
- 物体三维重建的多视角采集
- 高速运动物体的多角度追踪
关键挑战:当相机数量增加时,传统的轮询采集方式会导致帧率下降和时序不同步。实测显示,三台相机轮询采集时总帧率会从单相的25fps降至不足15fps。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 硬件环境搭建要点
2.1 海康相机网络配置
采用独立的千兆网卡连接三台相机(建议使用Intel I350芯片组的工业网卡),每台相机需要单独设置静态IP:
bash复制Camera1: 192.168.1.101
Camera2: 192.168.1.102
Camera3: 192.168.1.103
子网掩码统一为255.255.255.0
避坑指南:务必关闭网卡的节能模式和流量控制(通过设备管理器->网卡属性调整),否则可能引发图像丢帧。
2.2 Halcon环境配置
使用Halcon 20.11版本时需要特别注意:
- 安装时勾选"Runtime License"选项
- 将以下dll拷贝到程序输出目录:
- halcon.dll
- halcondotnet.dll
- hdevenginecpp.dll
3. 核心代码实现解析
3.1 回调函数架构设计
采用事件驱动的回调模式,相比轮询方式可降低30%以上的CPU占用率:
csharp复制// 相机初始化代码示例
private void InitCameras()
{
for(int i=0; i<3; i++){
m_cameras[i] = new HCamera();
m_cameras[i].SetCameraHandle(i);
m_cameras[i].SetGrabbingCallback(GrabCallback); // 注册回调
m_cameras[i].StartGrabbing();
}
}
// 统一回调处理函数
private void GrabCallback(IntPtr handle, IntPtr pBuffer, uint dwBufferSize, IntPtr pUser)
{
int camIndex = GetCameraIndex(handle);
HImage image = new HImage();
image.GenImage1("byte", 2448, 2048, pBuffer);
// 使用委托更新UI线程
this.Invoke(new UpdateImageDelegate(UpdateImage),
new object[] { camIndex, image });
}
3.2 多线程图像处理
为避免UI卡顿,采用生产者-消费者模式:
csharp复制ConcurrentQueue<HImage>[] imgQueues = new ConcurrentQueue<HImage>[3];
// 图像处理线程
void ProcessThread(int camIndex)
{
while(!stopped){
if(imgQueues[camIndex].TryDequeue(out HImage img)){
// 执行Halcon处理算法
HRegion defect = img.Threshold(120, 255);
// ...其他处理逻辑
img.Dispose();
}
Thread.Sleep(1);
}
}
4. 性能优化关键参数
4.1 相机参数调优
通过海康SDK的MV_CC_SetEnumValue接口调整:
csharp复制// 设置关键参数
MV_CC_SetEnumValue(handle, "AcquisitionMode", MV_ACQ_MODE_CONTINUOUS);
MV_CC_SetEnumValue(handle, "TriggerMode", MV_TRIGGER_MODE_OFF);
MV_CC_SetFloatValue(handle, "AcquisitionFrameRate", 25.0f);
MV_CC_SetEnumValue(handle, "ExposureAuto", MV_EXPOSURE_AUTO_MODE_OFF);
MV_CC_SetFloatValue(handle, "ExposureTime", 8000.0f);
4.2 内存管理要点
多相机系统容易出现内存泄漏问题,需要特别注意:
- 每个回调中生成的HImage对象必须及时Dispose
- 使用内存池复用图像缓冲区
- 定期调用GC.Collect()强制回收(建议在空闲时段触发)
5. 常见问题解决方案
5.1 图像时间戳同步
通过PTP协议实现硬件级同步:
- 启用相机的PTP功能(MV_CC_SetBoolValue(handle, "PTPEnable", true))
- 配置一台相机为Master,其余为Slave
- 在交换机端启用PTP支持(需要支持IEEE 1588的工业交换机)
5.2 Halcon License报错处理
当出现"Check for a valid license"错误时:
- 检查环境变量HALCONROOT是否指向正确路径
- 确认license文件中的hostid与机器匹配
- 尝试重新安装Runtime License
6. 项目扩展方向
当前架构可进一步优化为:
- 添加GPU加速处理(通过Halcon的CUDA算子)
- 实现分布式采集(多台工控机协同工作)
- 集成数据库存储(使用SQLite缓存检测结果)
我在实际部署中发现,当三台相机同时工作在2048×2448分辨率下时,建议使用至少32GB内存的工作站,并配置RAID0阵列存储原始图像数据。对于长时间运行的产线系统,建议添加看门狗程序监控采集线程状态。
