這是之前做的一套硬件加軟件的系統(tǒng),用于檢測室內(nèi)被偷放以達(dá)到不可告人目的的無線攝像頭。實(shí)現(xiàn)的原理很簡單,一般無線攝像頭在采集和傳輸圖像的時(shí)候都會產(chǎn)生熱量,我們通過紅外溫度傳感器采集到溫度點(diǎn)陣圖后一分析就能檢測到隱藏的攝像頭了。
下面是硬件的實(shí)物圖:

? ? 東西很丑,但是很靠譜。在這塊小洞洞板上集成了一塊STM32、MLX906紅外傳感器、鋰電池、鋰電池充電電路和藍(lán)牙模塊。簡單來說就是STM32讀取到紅外傳感器的數(shù)據(jù)后,通過藍(lán)牙發(fā)送到手機(jī)上。這里面的難點(diǎn)主要是紅外傳感器的校準(zhǔn),紅外傳感器的原數(shù)據(jù)并不是溫度,而是需要經(jīng)過一系列的包括針對位置的校準(zhǔn)和對溫度的補(bǔ)償?shù)龋罱K才能得到比較一致的效果。

上圖就是應(yīng)用運(yùn)行的結(jié)果了,中間的那一條就是溫度圖,之所以是扁平的一條,是因?yàn)镸LX906傳感器本身的點(diǎn)陣形狀就是如此,其實(shí)總共只有16*4的點(diǎn)。在顯示時(shí)我為了顯示效果,使用了640*160的Bitmap,用插值的效果進(jìn)行了優(yōu)化,但是其實(shí)際上確實(shí)只有16*4,也就是64個(gè)點(diǎn)。
界面下面的危險(xiǎn)程度的判定是我隨便寫的,判斷是否為攝像頭時(shí)考慮了兩個(gè)因素 1.溫度高低,溫度要高于周圍區(qū)域越多,則越可能是 2.高溫區(qū)面積,高溫區(qū)面積越小,越集中則越可能是。
此外,為了讓64個(gè)溫度點(diǎn)更快的傳輸?shù)绞謾C(jī)上,我想出了一種動(dòng)態(tài)位寬的傳輸方法,這也算是一種圖像壓縮算法:
如果我要傳輸?shù)?6*4的點(diǎn)陣(也就是64個(gè)點(diǎn)),每個(gè)點(diǎn)用byte也就是char表示,也就是用8位數(shù)據(jù)表示-128℃~127℃,那么每幀傳輸需要64個(gè)byte。
但是如果此時(shí)所有點(diǎn)溫度都在25~27(整數(shù))范圍內(nèi),我要傳輸?shù)臄?shù)取值只有25、26、27,那么我用8個(gè)位來表示一個(gè)點(diǎn)就很浪費(fèi)了,實(shí)際上我用兩個(gè)bit就能表示一個(gè)點(diǎn)了。而如果是在25~30的范圍內(nèi),則用3個(gè)bit就可以表示。所以,在單片機(jī)端要傳輸圖像的時(shí)候,可以首先確定所有點(diǎn)的最大和最小值,確定最低描述位數(shù)。然后在傳輸時(shí),定義一套協(xié)議:
每幀圖像包含兩個(gè)部分,圖像頭和圖像內(nèi)容,圖像頭包括兩個(gè)關(guān)鍵信息 1.偏移值 2.單點(diǎn)位寬。圖像內(nèi)容則根據(jù)指定的位寬對點(diǎn)的數(shù)據(jù)進(jìn)行排列。
如果圖像點(diǎn)的取值范圍為2~3,則偏移值為2,單點(diǎn)位寬為1,總的數(shù)據(jù)長度為 1+1+64/8 = 10 byte。
如果圖像點(diǎn)全部是2,則偏移值為2,單點(diǎn)位寬為0,總的數(shù)據(jù)長度為 1+1+0*64/8 = 2 byte,這里就很神奇,只需要兩個(gè)字節(jié)就能傳輸64的相同的數(shù)。
如果圖像點(diǎn)取值范圍為0-31,則偏移值為0,單點(diǎn)位寬為5,總的數(shù)據(jù)長度為 1+1+5*64/8 = 42 byte
隨著圖像點(diǎn)的取值波動(dòng)范圍增大,其壓縮的效果越差,但對于我這個(gè)應(yīng)用來說效果還是不錯(cuò)的。