如何通過目標(biāo)追蹤功能制作一個(gè)手機(jī)攝像頭實(shí)時(shí)跟蹤小車,該設(shè)計(jì)運(yùn)用OpenCV的圖像處理APP,手機(jī)APP通過攝像頭實(shí)時(shí)跟蹤設(shè)定的顏色目標(biāo),并且通過手機(jī)藍(lán)牙將目標(biāo)坐標(biāo)位置和大小等信息輸出,配合藍(lán)牙串口模塊和我寫的配套Arduino數(shù)據(jù)接收庫,就可以做成一個(gè)簡單的手機(jī)跟蹤尋跡小車。
手機(jī)實(shí)時(shí)跟蹤尋跡小車視頻演示:
手機(jī)實(shí)時(shí)跟蹤尋跡小車手機(jī)APP截圖:
安裝方法:
1.直接安裝Trace.apk,Android5.0以上系統(tǒng)需要到設(shè)置里賦予應(yīng)用相機(jī)和藍(lán)牙權(quán)限
2.在豌豆莢搜索“跡”安裝,同上
使用方法:
1.進(jìn)軟件之后可以點(diǎn)擊連接藍(lán)牙,選擇你的藍(lán)牙模塊(模塊需要事先在手機(jī)系統(tǒng)藍(lán)牙設(shè)置里面配對好),連接上之后如果有目標(biāo)信息就會(huì)通過藍(lán)牙發(fā)送到模塊上,Arduino進(jìn)行讀取就可以了。
2.點(diǎn)擊左上角的按鈕進(jìn)入預(yù)覽畫面,此時(shí)在預(yù)覽窗口中點(diǎn)擊任何一個(gè)你想追蹤的物體,就會(huì)自動(dòng)進(jìn)行處理輸出數(shù)據(jù)了,頂欄會(huì)顯示你選中的顏色。
3.這里說明一下,跟蹤原理是以顏色為特征的,所以應(yīng)該盡量避免視野中出現(xiàn)顏色相同的物體,同時(shí)如果發(fā)現(xiàn)跟蹤物體的周圍出現(xiàn)大量小塊的目標(biāo)塊,可以適當(dāng)調(diào)大屏幕下方的進(jìn)度條,直到雜塊消失只剩一個(gè)目標(biāo)。
說明一下屏幕下方各個(gè)控件的含義:
1.左邊的按鈕是切換手機(jī)前后鏡頭的(現(xiàn)在應(yīng)該沒有不帶前置鏡頭的手機(jī)了吧…)
2.進(jìn)度條用于調(diào)節(jié)圖像處理閾值,這個(gè)值用于色塊過濾,可以理解為,用于設(shè)置最小的目標(biāo)塊的限制,也就是當(dāng)目標(biāo)小于一定程度就過濾掉。
3.T、X、Y三個(gè)參數(shù)是目標(biāo)的信息,XY是坐標(biāo)大家都知道(坐標(biāo)的最大值跟手機(jī)鏡頭分辨率有關(guān));T是目標(biāo)的大小信息,如果檢測到多個(gè)目標(biāo)或者沒有檢測到任何目標(biāo)這里會(huì)顯示E(error)。T可以用于粗略得判斷物體的遠(yuǎn)近(近大遠(yuǎn)小),不過更推薦的方式是用Y軸判斷遠(yuǎn)近(見后文的小車)。
手機(jī)實(shí)時(shí)跟蹤尋跡小車設(shè)計(jì)總結(jié):
這個(gè)小車大家可以隨意搭建,只要能把你的手機(jī)放上去就行。Tmp上我用了兩個(gè)舵機(jī)改造成輪子,把180度的舵機(jī)改成可以連續(xù)旋轉(zhuǎn)的360舵機(jī),這樣就省下了電機(jī)驅(qū)動(dòng)以及麻煩的減速箱,而且只用一根信號線就可以控制電機(jī)的正反轉(zhuǎn)和速度,這部分要是大家感興趣可以上網(wǎng)搜搜相關(guān)改造教程。
然后我們需要把小車和手機(jī)聯(lián)系起來,通過藍(lán)牙模塊:
需要使用從機(jī)模塊,最好把波特率設(shè)置為115200,連線如下:
藍(lán)牙模塊 Arduino
Tx -> Rx
Vcc -> 5V
Gnd -> Gnd
1.注意藍(lán)牙的Rx是不接Arduino的,因?yàn)锳rduino只需要接收APP的數(shù)據(jù)而不需要發(fā)送,這樣的話留出的Tx就可以通過Serial.Print()打印到電腦端的串口助手。
2.當(dāng)然,考慮到一般Arduino都只有一個(gè)硬件串口,這樣串口被藍(lán)牙模塊占用了之后每次下載都需要拔下藍(lán)牙以避免數(shù)據(jù)串?dāng)_,解決辦法是換用軟串口或者換用Mega等不止一個(gè)串口的板子。
3.軟件部分,提供已經(jīng)封裝好的Arduino庫,放到library文件夾后打開示例就會(huì)用了
需要自己完成的部分就是,把獲取到的x,y坐標(biāo)轉(zhuǎn)換為小車電機(jī)的速度,思路是這樣的:
1.假設(shè)我們希望目標(biāo)始終在屏幕中間,那么當(dāng)y坐標(biāo)大于屏幕y最大值的一半時(shí)讓車有一個(gè)往前的基礎(chǔ)速度V,反 之則是向后的基礎(chǔ)速度-V;
2.如果x坐標(biāo)大于屏幕x最大值的一半,那么讓車子有一個(gè)旋轉(zhuǎn)速度Vt,反之有個(gè)旋轉(zhuǎn)速度-Vt;
最后賦值給小車的速度是:左輪 = V+Vt,右輪 = V-Vt,也就是所謂的差速驅(qū)動(dòng)了。
最后給出APP和Arduino庫,見“相關(guān)文件”下載。