RoboMaster視覺教程(11)總結

RoboMaster視覺教程(11)總結

這一系列教程終於寫到最後一篇了,最開始設想還有兩篇「程序自啓以及進程守護」和「OpenCV GPU模塊的使用與妙算 GPU 的 Zero Copy 」。

但是「程序自啓」沒什麼好寫的, Linux 程序自啓無非就是在/etc/rc.local中添加我們的視覺程序的執行路徑或者在bashrc裏把路徑放進去達到登陸自動運行的效果。

而「進程守護」之前想做但一直擱置了,只在樹莓派上試過用看門狗實現死機重啓,自己沒有實踐過就不寫了。

另外的一篇「OpenCV GPU 模塊的使用與妙算 GPU 的 Zero Copy 」本來想總結一下今年備賽時試圖用妙算 GPU 優化程序的一些嘗試,但因爲最後做的是負優化,用了 GPU 速度反而慢了不少,再加上自己也不太熟悉就不寫了。

Zero Copy 是 Tegra 系列芯片(TK1, TX1, TX2 等)支持的特性,就是 GPU 與 CPU 可以共享同一塊內存,可以實現 CPU 處理後直接把這塊內存交給顯卡處理,無需再有複製到顯存這一過程,但在實際測試中可能只能是自己寫 CUDA 核函數來實現了。雖然 OpenCV 對這個特性有支持但幾乎所有與 GPU 相關的處理函數都是先複製到顯存再處理的,當初在這一部分折騰了好久……

Nvidia 對 TK1 的支持很有限,很多新的 API 都沒有,不過 Nvidia 對 TX2 等更高級的芯片的支持比較完善,L4T Multimedia API (不支持 TK1 )這個 API 提供了一些視頻解碼、攝像頭控制相關的函數,如果感興趣可以好好研究,對充分利用硬件資源有很大幫助。

這期間我也折騰過 OpenCL 想用 Intel CPU 上的核顯加速,最後因爲 OpenCV 蛋疼的 UMat 的各種 bug 放棄了嘗試(我怎麼這麼能折騰……)

Zero Copy 相關的一些資料:

「Zero Copy on Tegra K1」http://arrayfire.com/zero-copy-on-tegra-k1/

「Zero-Copy: CUDA, OpenCV and NVidia Jetson TK1: Part 1 」http://ohmwardbond.blogspot.com/2017/03/zero-copy-cuda-opencv-and-nvidia-jetson.html?m=1

「Zero-Copy: CUDA, OpenCV and NVidia Jetson TK1: Part 2 」http://ohmwardbond.blogspot.com/2017/03/zero-copy-cuda-opencv-and-nvidia-jetson_15.html?m=1

「CUDA編程——zero copy」 https://blog.csdn.net/junparadox/article/details/50633641

寫這幾篇教程的目的是對做過的東西做個總結留個記錄,另外也是希望給新入坑 RM 視覺組的同學一些入門的建議。大疆的這個比賽對視覺的要求其實不是特別高,尤其是在官方以及各大戰隊給出了開源代碼後,仔細把開源代碼讀一遍基本上就可以摸清視覺識別的套路了。

但是視覺是一個特別綜合的項目,如果沒有一些教程的引路就很難入門。大多數視覺方面的書都在講原理抑或是在講解 OpenCV 庫函數的使用方法,講解應用方面的書比較少,往往是看了很多書也知道了很多函數怎麼用,但是真正要用 OpenCV 做點東西就沒有頭緒了。

舉個例子,做裝甲板的識別。如果不知道攝像頭可以調節曝光參數而直接用正常的曝光做的話,那太困難了,根本不知道怎麼入手,我也是看了官方的開源代碼才恍然大悟,原來可以這樣。

視覺方面的書籍很少會提到攝像頭有哪些參數、調節不同參數會有什麼作用。就連 OpenCV 自身如果在編譯的時候使用默認的設置可能連攝像頭的分辨率都無法調節。

這幾篇教程基本上從各個方面介紹了 RM 視覺需要注意的事項,提供了一些具體實現的思路,示例的代碼除了我自己寫的也參考了幾個戰隊的開源代碼並注出了來源,我對他們的無私奉獻表示感謝。

在「風車識別2」中,在識別風車扇葉的部分本應使用透視變換的,但我寫的是仿射變換。雖然在實際使用中兩者的效果類似(風車是正對着打的所以問題不大),最好還是用透視變換。

因爲自己精力及水平有限,教程中難免會出現錯誤,歡迎大家指正。

申請了一個自己的公衆號 江達小記 ,打算將自己的學習研究的經驗總結下來幫助他人也方便自己。感興趣的朋友可以關注一下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章