這是之前做的一套硬件加軟件的系統(tǒng)锄奢,用于檢測室內(nèi)被偷放以達到不可告人目的的無線攝像頭混聊。實現(xiàn)的原理很簡單毅往,一般無線攝像頭在采集和傳輸圖像的時候都會產(chǎn)生熱量漾稀,我們通過紅外溫度傳感器采集到溫度點陣圖后一分析就能檢測到隱藏的攝像頭了。
下面是硬件的實物圖:
? ? 東西很丑腾节,但是很靠譜忘嫉。在這塊小洞洞板上集成了一塊STM32、MLX906紅外傳感器案腺、鋰電池庆冕、鋰電池充電電路和藍牙模塊。簡單來說就是STM32讀取到紅外傳感器的數(shù)據(jù)后劈榨,通過藍牙發(fā)送到手機上访递。這里面的難點主要是紅外傳感器的校準,紅外傳感器的原數(shù)據(jù)并不是溫度同辣,而是需要經(jīng)過一系列的包括針對位置的校準和對溫度的補償?shù)瓤阶耍罱K才能得到比較一致的效果惭载。
上圖就是應用運行的結(jié)果了,中間的那一條就是溫度圖响巢,之所以是扁平的一條描滔,是因為MLX906傳感器本身的點陣形狀就是如此,其實總共只有16*4的點踪古。在顯示時我為了顯示效果含长,使用了640*160的Bitmap,用插值的效果進行了優(yōu)化灾炭,但是其實際上確實只有16*4茎芋,也就是64個點。
界面下面的危險程度的判定是我隨便寫的蜈出,判斷是否為攝像頭時考慮了兩個因素 1.溫度高低田弥,溫度要高于周圍區(qū)域越多,則越可能是 2.高溫區(qū)面積铡原,高溫區(qū)面積越小偷厦,越集中則越可能是。
此外燕刻,為了讓64個溫度點更快的傳輸?shù)绞謾C上只泼,我想出了一種動態(tài)位寬的傳輸方法,這也算是一種圖像壓縮算法:
如果我要傳輸?shù)?6*4的點陣(也就是64個點)卵洗,每個點用byte也就是char表示请唱,也就是用8位數(shù)據(jù)表示-128℃~127℃,那么每幀傳輸需要64個byte过蹂。
但是如果此時所有點溫度都在25~27(整數(shù))范圍內(nèi)十绑,我要傳輸?shù)臄?shù)取值只有25、26酷勺、27本橙,那么我用8個位來表示一個點就很浪費了,實際上我用兩個bit就能表示一個點了脆诉。而如果是在25~30的范圍內(nèi)甚亭,則用3個bit就可以表示。所以击胜,在單片機端要傳輸圖像的時候亏狰,可以首先確定所有點的最大和最小值,確定最低描述位數(shù)潜的。然后在傳輸時骚揍,定義一套協(xié)議:
每幀圖像包含兩個部分,圖像頭和圖像內(nèi)容啰挪,圖像頭包括兩個關(guān)鍵信息 1.偏移值 2.單點位寬信不。圖像內(nèi)容則根據(jù)指定的位寬對點的數(shù)據(jù)進行排列。
如果圖像點的取值范圍為2~3亡呵,則偏移值為2抽活,單點位寬為1,總的數(shù)據(jù)長度為 1+1+64/8 = 10 byte锰什。
如果圖像點全部是2下硕,則偏移值為2,單點位寬為0汁胆,總的數(shù)據(jù)長度為 1+1+0*64/8 = 2 byte,這里就很神奇梭姓,只需要兩個字節(jié)就能傳輸64的相同的數(shù)。
如果圖像點取值范圍為0-31嫩码,則偏移值為0誉尖,單點位寬為5,總的數(shù)據(jù)長度為 1+1+5*64/8 = 42 byte
隨著圖像點的取值波動范圍增大铸题,其壓縮的效果越差铡恕,但對于我這個應用來說效果還是不錯的。