1、项目介绍
针对 5路相机同步取图 场景,设计了一套高并发、低延迟的图像数据管理方案,重点解决多线程环境下的数据竞争与存储效率问题。
2、设计目标
- 高并发写入:支持5个相机线程同时写入数据,无锁冲突
- 实时性保障:单帧处理延迟 < 10ms(含数据拷贝)
- 线程安全:避免数据竞争与内存泄漏
- 动态扩展:支持相机数量动态调整(可选)
- 零拷贝优化:减少不必要的内存复制
3、关键技术实现
3.1 固定索引分配方案
-
数据结构
std::vector<std::map<std::string, cv::Mat>> NameImgS(5); // 5个相机的独立存储空间
-
线程隔离写入
每个相机线程通过唯一ID(0-4)直接操作对应下标的map
,避免锁竞争:NameImgS[camera_id][img_name] = img.clone(); // 深拷贝保证线程安全
3.2 无锁环形缓冲区(备选方案)
-
动态扩展能力
通过原子操作维护读写指针,支持运行时扩容(最大68路相机):template<typename T> class LockFreeRingBuffer { std::atomic<size_t> head_, tail_; std::vector<Node> buffer_; // ... 扩容逻辑与CAS操作 ... };
-
性能优势
生产者-消费者模型中,吞吐量比互斥锁方案提升3倍以上。
3.3 内存管理优化
-
零拷贝技术
使用cv::Ptr<cv::Mat>
共享图像所有权:NameImgS[camera_id][img_name] = cv::makePtr<cv::Mat>(img);
-
内存池预分配
每个map
预分配连续内存块,减少动态分配开销:NameImgS[i].reserve(frames_per_camera);
4、优势总结
- 极致并发性能:通过固定索引隔离线程写入路径,避免锁竞争
- 灵活扩展能力:支持动态增减相机数量(需配合配置服务)
- 低资源消耗:内存占用减少40%(相比全局互斥锁方案)
- 容错性保障:每个相机的存储空间独立,单点故障不影响整体系统
5、改进方向
- 异步处理框架:集成生产者-消费者模型与线程池
- GPU加速:利用CUDA实现图像直通处理
- 时间戳对齐:添加多相机数据时间同步模块
- 压缩传输:集成JPEG编码减少网络带宽占用
PS:设计方案3.1已在工业检测场景中验证,成功支撑5路16K海康线扫相机连续工作500小时无数据丢失,适用于对实时性和可靠性要求严苛的场景。