JoyD
图像处理相关
InfoImage, ImageBuffer, 图像框的bitmap, LastImage
- 初始化时,都创建成512x384的透明bitmap
- 中途不进行Dispose和设置为null,只在上面进行绘制
- 仅当控件被Dispose时,才进行Dispose和设置为null
操作流程
修改流程
- 暂停或恢复时,设置暂停状态,调用更新Info
- 断开或连接时,设置连接状态,调用更新Info
- Ping通状态变化时,修改Ping状态,调用更新Info
- 图像更新时,保存LastImage,调用更新Info
- 2-4 只在非暂停状态下调用更新,暂停状态下不更新Info和UI
更新Info
- 以透明色清空Info
- 如果暂停,显示暂停信息,否则如果Ping不通或断开,显示重连信息 否则满足就绪条件
- 在就绪条件下,如果有温度数据,显示最高温度
- 最后调用更新UI
更新UI
- 先将LastImage绘制到全局缓冲
- 再将InfoImage绘制到缓冲
- 最后一次性绘制到图像框的bitmap
TCP温度数据接收
- 系统初始化时,创建后台线程
- 然后线程循环执行
- 判断是否存在tcp连接实例
- 如果不存在连接实例,则判断是否暂停。如果暂停,则Sleep 1秒后继续执行。否则创建一个新的连接实例。
- 如果存在连接实例,则判断是否连接。如果未连接,则重新连接
- 同步接收和处理数据
- 收到数据后,如果暂停,接收后丢弃,Sleep 1秒。否则同步将收到的数组复制放到待处理列表(线程安全列表)。
- 通知处理线程,有新数据到达
- 跳转到6
- Dispose时,关闭后台线程
温度数据接收时的补充说明
总之就是不主动断开连接:
- 同步机制简单,不用考虑阻塞,因为在后台线程里
- 不用心跳机制,协议约定是每秒1帧数据
- 异常情况处理,出现异常就跳转到第3步
- 不用考虑波动问题,这是在一个循环中,它会下次重试
- 在异常出现且需要重新创建对象前,先释放旧的资源
- 数据完整性验证放在了数据处理环节
- 连接失败,会跳转到第3步。下一循环会自动重试
温度数据处理逻辑
- 收到的数组放到待处理列表中
- 开始循环处理列表
- 如果列表为空,退出循环
- 从列表中读取第一个数组,查看是否有头信息
- 如果没有头信息,将数组从列表中移除,跳转到3
- 如果有头信息,查看头信息中数据长度信息
- 检查数组中是否有足够的数据长度
- 如果没有足够的数据长度,看列表中是否有下一个数组
- 如果没有,则退出循环,否则将下一个数组合并到当前数组中尾部,将下一个数组从列表中移除,然后跳转到7
- 如果有足够的数据长度,则检查数据长度范围内是否又出现了头信息
- 如果有,则将数组中第二个头信息之前的数据移除,然后跳转到6
- 如果没有,则将数据长度范围内的数据从数组取出进行解析处理,剩余部分保留到数组中,跳转到4
- 处理完毕后,跳转到3
- 循环完成,进入等待状态
温度数据解析处理逻辑
根据热像仪SDK文档,原始温度数据的解析处理需遵循以下逻辑:
原始温度数据格式说明
- 通过TCP端口8081获取温度数据
- 数据包含24字节头部和温度数据两部分
- 头部结构体(header)包含:
- mark[5]: 固定标识"+TEMP"
- payload_length: 温度数据长度
- timestamp: 时间戳(前4字节为秒级时间,后2字节为毫秒级时间)
- 温度数据长度计算:宽×高×2字节,例如240×180分辨率时为240×180×2字节
- 数据按字节低位在前读取,如读取为80 51 01 00时实际值为00 01 51 80的16进制值
原始温度数据解析方法
-
单像素温度计算:
- 每个像素点温度由两个字节组成(L为低8位,H为高8位)
- 公式:摄氏温度×10 = H×256 + L
- 实际温度:摄氏温度 = (H×256 + L)/10
-
温度数据布局:
- 数据按行优先顺序排列
- 例如分辨率为4×3时,数据顺序为:L1 H1 L2 H2 L3 H3 L4 H4 L5 H5 ...
温补值处理
-
温补值获取:
- 通过SDK函数
sdk_get_comp_temp获取温补值 - 函数原型:
sdk_get_comp_temp(const char* ip, int* comp_temp) - 返回值为0表示获取成功
- 通过SDK函数
-
温补值应用:
- 温补值也是摄氏度乘以10的结果
- 最终温度计算公式:
最终温度 = 原始温度 + 温补值 - 示例:原始温度为243(24.3°C),温补值为5(0.5°C),则最终温度为248(24.8°C)
温度数据解析处理流程
- 接收TCP数据并解析头部信息
- 验证mark标识是否为"+TEMP"
- 根据payload_length确定温度数据长度
- 按像素点顺序解析每个像素的温度值
- 获取温补值并应用到每个像素的温度上
- 计算得到最终的温度数据
注意事项
- 时间戳转换时需注意低字节在前、高字节在后的顺序
- 温补值是设备补偿值,必须应用到原始温度上才能得到与网页计算结果一致的温度
- 分辨率不同时,温度数据长度会相应变化,解析时需根据实际分辨率计算
- 原始温度数据更新频率约为每秒一条