1. 需求背景与问题分析
最近在做一个工业检测项目,需要实时获取海康热成像相机的温度矩阵数据。刚开始看官方文档时,发现他们提供的demo是把字节流写入本地文件,然后再解析文件获取温度数据。这种方法在实验室测试还行,但到了实际工业场景就完全不行了——文件IO操作太慢,根本达不到实时性要求。
我记得第一次测试文件解析方式时,延迟高达500毫秒以上,这对于需要实时温度监控的生产线来说完全不可接受。而且频繁的磁盘写入还会影响系统稳定性,这个方案必须放弃。
真正的需求是在内存中直接处理相机传来的字节流,实现毫秒级的温度矩阵解析。这对工业检测、医疗测温等场景特别重要,比如在生产线上检测产品温度分布,或者医疗中实时监测体温变化,任何延迟都可能导致严重后果。
2. 整体架构设计思路
经过多次尝试,我最终确定了内存实时解析的方案架构。核心思路是把相机回调函数传来的字节流先缓存到内存中,当积累够一帧完整数据时,就立即解析成OpenCV的Mat矩阵。
这里有个关键点:海康相机的回调函数每次传来的数据长度是不固定的,可能这次是1024字节,下次就变成2048字节了。所以不能简单地把每次的数据直接当作一帧处理,必须要有缓存机制。
我选择使用QT的QBuffer作为内存缓存器,因为它既能高效处理字节数据,又和QT框架天然兼容。当缓存中的数据量达到一帧大小时,就把一帧数据提取出来解析,剩下的数据继续留在缓存中等待后续数据。
解析部分直接复用海康官方提供的文件解析函数,只是把输入从文件改成内存缓冲区。这样既保证了解析的正确性,又避免了重复造轮子。
3. 环境配置与相机设置
在开始编码前,需要先配置好开发环境。我用的QT 5.15.2和OpenCV 4.5,这两个版本搭配很稳定。记得在pro文件里加上必要的依赖:
LIBS += -lHKCameraLib -lopencv_core -lopencv_imgproc
相机网络配置也很重要。首先要用海康的SDK登录相机,然后设置视频流格式为温度数据流。关键代码是这样的:
// 设置视频流类型为温度数据
NET_DVR_COMPRESSIONCFG_V30 config;
NET_DVR_GetDVRConfig(lUserID, NET_DVR_GET_COMPRESSCFG_V30, 0, &config, sizeof(config));
config.byVideoCodingType = 1; // 1表示温度数据流
NET_DVR_SetDVRConfig(lUserID, NET_DVR_SET_COMPRESSCFG_V30, 0, &config, sizeof(config));
如果不设置byVideoCodingType为1,获取的就只是普通的视频流,而不是包含温度数据的字节流。这个坑我当初踩过,调试了好久才发现问题。
4. 回调函数中的数据缓存机制
数据缓存是这个项目的核心环节。海康的SDK会通过回调函数不断推送数据,我们

2201

被折叠的 条评论
为什么被折叠?



