这是之前做的一套硬件加软件的系统,用于检测室内被偷放以达到不可告人目的的无线摄像头。实现的原理很简单,一般无线摄像头在采集和传输图像的时候都会产生热量,我们通过红外温度传感器采集到温度点阵图后一分析就能检测到隐藏的摄像头了。
下面是硬件的实物图:
红外图像采集模组东西很丑,但是很靠谱。在这块小洞洞板上集成了一块STM32、MLX906红外传感器、锂电池、锂电池充电电路和蓝牙模块。简单来说就是STM32读取到红外传感器的数据后,通过蓝牙发送到手机上。这里面的难点主要是红外传感器的校准,红外传感器的原数据并不是温度,而是需要经过一系列的包括针对位置的校准和对温度的补偿等,最终才能得到比较一致的效果。
界面截图上图就是应用运行的结果了,中间的那一条就是温度图,之所以是扁平的一条,是因为MLX906传感器本身的点阵形状就是如此,其实总共只有16*4的点。在显示时我为了显示效果,使用了640*160的Bitmap,用插值的效果进行了优化,但是其实际上确实只有16*4,也就是64个点。
界面下面的危险程度的判定是我随便写的,判断是否为摄像头时考虑了两个因素 1.温度高低,温度要高于周围区域越多,则越可能是 2.高温区面积,高温区面积越小,越集中则越可能是。
此外,为了让64个温度点更快的传输到手机上,我想出了一种动态位宽的传输方法,这也算是一种图像压缩算法:
如果我要传输的16*4的点阵(也就是64个点),每个点用byte也就是char表示,也就是用8位数据表示-128℃~127℃,那么每帧传输需要64个byte。
但是如果此时所有点温度都在25~27(整数)范围内,我要传输的数取值只有25、26、27,那么我用8个位来表示一个点就很浪费了,实际上我用两个bit就能表示一个点了。而如果是在25~30的范围内,则用3个bit就可以表示。所以,在单片机端要传输图像的时候,可以首先确定所有点的最大和最小值,确定最低描述位数。然后在传输时,定义一套协议:
每帧图像包含两个部分,图像头和图像内容,图像头包括两个关键信息 1.偏移值 2.单点位宽。图像内容则根据指定的位宽对点的数据进行排列。
如果图像点的取值范围为2~3,则偏移值为2,单点位宽为1,总的数据长度为 1+1+64/8 = 10 byte。
如果图像点全部是2,则偏移值为2,单点位宽为0,总的数据长度为 1+1+0*64/8 = 2 byte,这里就很神奇,只需要两个字节就能传输64的相同的数。
如果图像点取值范围为0-31,则偏移值为0,单点位宽为5,总的数据长度为 1+1+5*64/8 = 42 byte
随着图像点的取值波动范围增大,其压缩的效果越差,但对于我这个应用来说效果还是不错的。
网友评论