ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

相机 SDK 集成到图像采集一体化,核心是**把“触发→曝光→传输→缓冲→交付”这条链路封装成一个稳定的、可复用的采集模块**,让上层算法不需要关心底层是海康还是 Basler,只需要拿到一帧可处理的

相机 SDK 集成到图像采集一体化,核心是**把“触发→曝光→传输→缓冲→交付”这条链路封装成一个稳定的、可复用的采集模块**,让上层算法不需要关心底层是海康还是 Basler,只需要拿到一帧可处理的 相机 SDK 集成到图像采集一体化核心是把“触发→曝光→传输→缓冲→交付”这条链路封装成一个稳定的、可复用的采集模块让上层算法不需要关心底层是海康还是 Basler只需要拿到一帧可处理的图像。一体化的三层封装第一层统一接口。定义ICamera接口屏蔽品牌差异。海康的MV_CC_*、Basler 的pylon、大恒的 SDK全部实现同一套方法。publicinterfaceICamera:IDisposable{boolConnect();voidStartGrab();voidStopGrab();ImageDataGrab(inttimeoutMs);// 同步取图voidSetTriggerMode(TriggerModemode);// 硬触发/软触发voidSetExposure(doublemicroseconds);eventActionImageDataFrameArrived;// 回调模式}第二层品牌实现。每个品牌一个实现类把 SDK 的细节封在里面。海康相机实现ICamera时内部调用MV_CC_RegisterImageCallBackEx注册回调回调里只做Marshal.Copy拷贝像素到自己的缓冲区然后触发FrameArrived事件。第三层采集管理器。管理多相机的生命周期提供统一的启动、停止、取图接口。上层业务只和采集管理器交互不直接碰相机对象。回调里的“黄金三秒”相机 SDK 的回调函数运行在 SDK 的内部线程中。回调里只做三件事拷贝、入队、返回。privatevoidImageCallback(IntPtrpData,refMV_FRAME_OUT_INFO_EXpFrameInfo,IntPtrpUser){intwidthpFrameInfo.nWidth;intheightpFrameInfo.nHeight;intstride(int)pFrameInfo.nStride;intsizestride*height;// ① 拷贝到自己的内存必须拷贝pData 在回调返回后失效byte[]buffernewbyte[size];Marshal.Copy(pData,buffer,0,size);// ② 封装入队_queue.Add(newImageData{Pixelsbuffer,Widthwidth,Heightheight,Stridestride,TimestampDateTime.Now});// ③ 立刻返回让 SDK 回收缓冲区}为什么不能直接在回调里做算法相机 SDK 的缓冲区是循环使用的。回调返回后SDK 认为这帧数据已经“消费完毕”会把缓冲区回收给下一帧使用。如果你在回调里花 50ms 做模板匹配高帧率下 SDK 来不及回收就会丢帧。有界队列 背压采集线程和处理线程之间用BlockingCollection连接必须设容量上限。// 有界队列容量 10满了就丢最旧的privateBlockingCollectionImageData_queuenew(newConcurrentQueueImageData(),10);// 入队时如果队列满丢弃最旧帧publicvoidEnqueue(ImageDataimage){while(!_queue.TryAdd(image)){_queue.TryTake(out_);// 丢弃最旧帧}}为什么必须有界如果算法处理速度跟不上相机帧率无界队列会无限增长最终内存耗尽。有界队列满了之后要么丢弃最旧帧保证处理最新数据要么阻塞采集保证不丢数据但可能丢帧。在线检测场景通常选“丢旧保新”。硬件触发的时序保证工业现场几乎都用硬触发光电传感器检测到工件到位直接给相机 IO 口一个电平信号相机立即曝光。// 设置为硬触发信号来自 Line0MV_CC_SetEnumValue(handle,TriggerMode,1);// 打开触发MV_CC_SetEnumValue(handle,TriggerSource,0);// Line0 硬触发MV_CC_StartGrabbing(handle);硬触发的延迟是微秒级且确定的软件触发受操作系统调度影响延迟可能达到毫秒级且抖动大。产线节拍要求高时硬触发是唯一选择。多相机同步多相机场景需要解决两个问题触发同步和带宽分配。触发同步所有相机接收同一个硬触发信号同时曝光。如果需要更精确的同步如 3D 双目用相机的PTPIEEE 1588协议通过以太网实现亚微秒级时钟同步。带宽分配多相机同时传输图像会争抢网络带宽。GigE 相机单口带宽约 100MB/s一台 500 万像素、8 位灰度相机每帧 5MB30fps 就是 150MB/s已经超了。解决方案是多网卡分流——每块网卡接一台相机或者降低帧率、提高压缩率。断线重连与状态监控相机掉线是现场常态。采集管理器需要自动检测并重连privatevoidMonitorLoop(){while(!_cts.IsCancellationRequested){if(!_camera.IsConnected){_logger.Warn(相机掉线尝试重连...);_camera.Disconnect();Thread.Sleep(1000);_camera.Connect();_camera.StartGrab();}Thread.Sleep(5000);}}状态变化通过事件通知 UI操作员能看到“相机在线/掉线”的实时状态。一句话总结相机 SDK 集成到图像采集一体化本质是**“回调拷贝入队算法独立线程队列有界背压硬触发保时序断线自动重连”**。上层算法只拿到一帧干净的图像不需要知道底层是哪个品牌的 SDK。采集层的稳定性决定了整个视觉系统的上限。
返回列表