
做工业视觉上位机开发的朋友,大概率都栽过相机采集的坑。单线程同步采图,一拍界面就卡死;多相机高速抓拍,处理稍慢就丢帧;图像来回拷贝,内存涨得飞快,GC一卡整个程序都停住。很多人把问题归为相机性能不够、电脑配置差,其实核心是采集架构没做对,用单线程串行的思路做多相机高速采集,不卡才怪。去年做3C电子配件外观检测项目,一共4台500万像素工业相机,在线高速抓拍,一秒钟各拍6帧。最开始图省事,在定时器里同步调用SDK采图,结果一跑起来问题全出来了:界面卡得拖不动,高速模式下频繁丢帧,一台相机出问题整个程序都卡住。后来推倒重来,按分层解耦的思路做了一套多线程异步采集架构,每个相机独立采集线程,图像环形缓存,处理线程池异步消费,UI和采集完全隔离。改造完之后,4台相机满速采集稳定不丢帧,CPU占用降了近一半,UI全程流畅,连续跑了三个多月没因为采集出过问题。今天就把完整的架构设计、核心模块实现、丢帧与内存优化方案和现场踩过的坑全部分享出来,都是视觉项目跑出来的实战经验。一、先捋痛点:工业相机采集中最常见的5个坑很多人觉得相机采集就是调用SDK的GrabImage,没什么技术含量。真到高速、多相机的场景才发现,坑全在并发和资源管理里。单线程同步采集,UI完全阻塞最经典的错误写法:在UI线程的定时器里直接调用采图方法。相机曝光、传输、成像都是耗时操作,少则几毫秒多则几十毫秒,这段时间UI线程完全被占住