1. 程式人生 > >基於OpenCV的移動物體檢測和目標追蹤

基於OpenCV的移動物體檢測和目標追蹤

視訊連結:

https://www.bilibili.com/video/av24220271

https://www.bilibili.com/video/av24220271

https://www.bilibili.com/video/av24181594

無人機的未來在於機器視覺,而機器視覺是離不開攝像頭的,也就是說無人機的未來離不開影象處理,去年電賽的經歷,讓我對此深有體會,包括電賽的尋線和追小車,我們都是使用的openmv,首先我要承認openmv的確不錯,至少在色塊檢測中幫了我們很大的忙,關鍵是容易上手,除錯方便快捷。但是其處理效能實在不敢恭維,尤其是做人臉識別,手勢識別,光流定點之類的,效能不夠用,我尤其是想做特徵點檢測的,但是

openmv根本實現不了那些高大上的功能,而且距離也受限制。思考再三我們打算採用樹莓派,但是實際測試尤其是跑光流的時候,也是比較卡,那就更不用說人臉識別和特徵點檢測之類的了。目前看來只有使用電腦處理了,但是電腦在現在的電賽中一般是不允許使用的,如果是真愛,你就不會為了比賽而比賽,所以我們現在的opencv地面站就誕生了。








這就是目前地面站所融合的幾個功能。大家不要先看這幾個功能,和openmv比還是十分強大的。尤其是模式3和模式4,我可以不謙虛的說,這個技術已經是目前網上開源當中效果很好的了。目前我開放了地面站模式3的功能供大家使用,實現的功能就是滑鼠點選感興趣物體,滑鼠選中到哪個位置飛機就飛到哪個位置,再也不用考慮到光線和顏色的差異了,其優點不知道比甩了簡單的色塊檢測幾條街,具體介紹請往下看。
1要連線USB攝像頭或者USB介面的圖傳接收機
2在地面站開啟執行之前,電腦必須先連線串列埠4(COM4),開啟裝置管理器檢視com4是否正確開啟,否則程式無法正常執行。可以使用USB轉TTL模組,或者數傳介面。上位機資料傳送的波特率設定為115200,因此數傳介面的波特率也必須設定為115200,否則接收資料會出現亂碼。
3地面站功能展示僅限於模式3,滑鼠選取感興趣物體,地面站通過串列埠把目標物體的座標傳送出去。追蹤區別於camshift,效果比camshift要好的多,檢測距離可以達到幾十米。
開發者可以用這個地面站來進行高空追蹤,目標定位。
推薦:
圖傳接收機-->牛牛航模5.8G圖傳手機接收機 ,
圖傳發射機-->熊貓發射機5.8G 
圖傳攝像頭-->彈弓攝像頭
注意:圖傳測試的時候建議在空曠的室外,效果較好,室內也是可以的,但是由於牆壁反射的原因影象會不太穩定
通過測試,程式無論是在無人機運動狀態下還是在靜止狀態下,追蹤效果都很穩定。
測試視訊效果展示:連結:https://pan.baidu.com/s/1IdUXxMEirfNXF0RXTpUhkg 密碼:njur
注意我們的主要任務是影象處理,提取目標資料,至於你如何用資料來控制飛機飛行就靠你自己發揮了,不過我們也簡單實現了一個點哪裡飛哪裡的飛控功能。
有問題請聯絡QQ:1628464345

地面站通訊協議:UAV地面站每隔10ms,傳送一組字串char[10]={‘s’,,,,’#’},波特率115200
Char[0]=’s’,Char[9]=’#’為校驗字元

Char[1],char[2],分別代表目標中心座標X的高8位和低8位 (16進製表示)

char[3],char[4]分別代表目標中心座標Y的高8位和低8位(16進製表示)

剩餘其他字元暫時保留。

以上就是影象處理部分。

無人機目標追蹤程式碼編寫
考慮到部分同學可能不知道怎麼修改基於無人機地面站追蹤的飛控程式,特此做了一個比較詳細的教程。程式碼已經成功移植到飛控上,而且就在昨天3月25號已經測試了,程式碼可用,但是PID控制引數需要優化。僅供大家參考。以下程式適合市面上所有開源的無人機飛控。大家只需要把一個c檔案和一個h標頭檔案新增到你的飛控程式,然後按照下面的步驟修改即可。
第一步向飛控程式裡面新增c檔案和.h標頭檔案


這兩個檔案也是小編整理的哦,花了我一天時間呢。可以直接新增到任何開源飛控,不依賴於任何飛控平臺。當然變數和函式的命名不能和你的自身飛控程式碼定義的衝突哈!其實這個程式碼我們電賽教學視訊裡面講解的巡線和追蹤思路一樣,巡線和追車其都是屬於位置控制。具體內容請結合電賽教學視訊。

 




第二步向飛控程式裡面新增串列埠接收程式:
我這裡以串列埠5為例。
首先在main函式初始化程式部分先初始化串列埠
 
其次貼上串列埠部分:
初始化串列埠的函式


接下來寫串列埠接收中斷部分
 

 

好啦,寫到這個位置我們的串列埠資料接收部分就完成了,那麼接下來就該寫我們拿這個資料來進行位置控制,
第三步 找到你的飛控程式的任務排程部分,新增第一步.c檔案裡面的位置控制函式

位置控制函式在我們的.c 檔案裡面寫好了哦

最後通過PID控制就把我們自己的postion_Roll和Position_Pitch計算好了哦。
第四部姿態控制部分
找到你的飛控程式的串級姿態控制的的外環(角度環),新增我們的姿態控制角度

好的,所有的都寫完了,我們3月26號測試了一下資料的正確性,然後測了一下高空追蹤追蹤效果可以,但是PID引數不夠好需要進一步優化,沒時間啦,月底就出去工作了,剩下的就交給大家去除錯吧。
哦忘了第五步了模式切換,通過六通道,也就是輔助2通道的閾值來進行模式切換。找到你的飛控程式的遙控接收部分,設定一下Mode的值吧
 
OpenCV處理原始碼請聯絡QQ:1628464345