機器視覺與嵌入式如何結合?
今年剛研一,方向是機器視覺,現成的項目做一個手提式三維掃描儀(當然是跟著師兄做)。同時本人對嵌入式(偏硬體)也非常感興趣,請問將這兩者結合起來該怎樣學習?以後的的發展會怎樣?
改 :不好意思弄錯了 machine version 不是 Computer Version 。
------------------------------------計算機視覺 (computer vision ) 又稱 CV ,其中要有 Intel 的OpenCV開放計算機,當然還有很多其它的 就不解釋了割-------------------------那我的例子來說吧
我今年剛剛好畢業於一個普通的學校,畢業設計做的就是這個方向;當初選題的時候就那一個人老師的課題做一下,因為本身是嵌入式方向的計算機科學專業的,老師課題是關於圖像處理,我就剛剛好結合一下。先給一個答案,做出的結果真的不好,手機回復就不貼圖了。硬體:
核心mcu arm9 s3c2410嵌入式的應該知道這款吧板子外圍介面都有,USB,串口,網口,sd卡槽等web camera (USB介面)nand Flash 64M軟體版本:
boot: uboot1.2
Linux kernel:2.6.26文件系統:yaffs編譯器:arm-gcc-linux 4.3.2文件系統製作工具:busybox以上是構建Linux系統軟體--------
OpenCV 2.8.2 源代碼cmake 工具編譯圖像處理依賴庫 所需
--------
宿主機Ubuntu 12.04(tftp server)這都是前期的準備
進入正題: 我的課題是《the real-time image processing system based on embedded arm Linux》
具體 bootloader 製作 Linux kernel 交叉編譯 文件系統製作 我在大三時候嵌入式專業課就搞好了,只不過後來因為要加上Linux V4L(Video for Linux) 又重新做了一遍。不會的網上有很多資料。ps:最好加上USB掛在U盤的相關驅動
具體 到 opencv的交叉編譯,首先一定要和文件系統相同版本的編譯器來compile;cmake 有相關選項 編譯選項有很多選上需要的,arm 不支持的不要選,不然編譯會報錯(我就編了兩天 ,編出來了可依賴庫文件)
--------------------------先寫這麼多,晚上接著跟#----------不好意思,由於這幾天比較忙就沒空跟帖 所以今天晚上就抽個空論文看了一遍,繼續寫了。。。針對於@張岱珅 說的問題 是我記錯了,cmake是用的2.8.10的 OpenCV使用的是2.4版本(目前最新3.0左右吧),不好意思。
至於@chen jason @Kaixiang Wang 多線程的問題實際在我這次實現中 更多的注重ARM嵌入式Linux 移植 OpenCV so文件是否在已有的演算法上可行,說實話結果並不是很好。好了,各位大神的支教就說到這了,具體到立體標定,三維識別和建模的相關演算法, 有興趣的同學可以深究,目前演算法OpenCV源代碼中有Example是給出的。
--------------------------------------------割---------------------------------------接下來接著說 移植 OpenCV Library 到 embedded Linux特地找了個Cmake-gui編譯的時候的圖,一般都是terminal下cmake就好了,但是gui看著比較直觀,不難看出編譯源文件的時候選用的是arm-linux-gcc和arm-linux-g++(切記版本一定要和製作FS的時候一致)configure 時 一般都是建立好 OpenCV的build目錄和lib的生成目錄,還有一些編譯選項 ,例如 WITH_CUDA WITH_TIFF 等等Generate 生成OpenCV的Makefile以後 就可以進入到build的目錄下 make 源碼 make install生成.so 和.a文件了。(這個過程還是需要點時間的,所以最好確保編譯選項選的合適,否則反反覆復也比較折騰的)
這個時候編譯好的庫文件有多種方法可以讓ARM板子上Linux使用(列3中)1,copy to U盤 ,板子如果可以有USB介面,可以mount U盤即可,再把U盤mount到Linux /lib下2,NFS 同樣通過這個可以mount到/lib下3,Linux根文件系統在製作的時候我們一般留有 一個 -rwx的/tmp目錄,tftp將這些 庫文件copy到板子上,在/tmp 目錄下建立 /tmp/lib 將 /lib 目錄下的原來的庫文件 copy to /tmp/lib,再將 OpenCV的庫文件copy to /tmp/lib 最後 mount /tmp/lib 到/lib 這樣就可以保證Linux可以使用OpenCV的庫文件了以上一般都是自己學習研究過程的做法,如果是APP層到kernel 都比較成熟的話 可以將kernel uImage 和 fs 和 APP 同時打包 一同燒錄到board 上就可以了, 即整個系統分為 boot + 打包的img
------------------------------------------------------------------------------------------------------------
以上基本上可以說 你可以運行需要OpenCV 的第三方庫的軟體 需要環境已建立APP層就可以有多種多樣的,對於ARM9上的APP那就不好說了,正如 @chen jason說的一樣,這個跑起來就是基本上是萎的拿一個例子來說吧stereo_calibration:攝像頭標定當然 編譯也當然要在宿主機上編譯(當然現在有的board可以帶編譯器) compiler版本要準確 -I 加上OpenCV的include -L OpenCV所需庫文件和其他的庫文件 編譯生成的文件 應該就是可以再board上跑的
這個應該很熟悉的 :LEFT000:RIGHT000執行成功後生成攝像頭內外參數文件,intrinsics.yml,extrinsics.yml 兩個文件,在立體匹配的參數輸入stereo_math 這個源文件也需要和stereo_clib同樣編譯 將以上的camera的內外參
intrinsics.yml,extrinsics.yml 放到改可執行文件的相同目錄下先看我們需要match 的兩個圖
--------------------------------------------------------------Left:--------------------------------------------------------------------------------------------------------------------------------------Right--------------------------------------------------------結果::::::結果:::::結果::::
深度圖:視差圖 明顯這個雜訊和誤差不是一般的大這個原因有很多種:最容易想到的是攝像頭不怎麼好,當時用的就是普通的web camera,還有標定的時候我看到動了位置和距離(大家應該都了解 Linux2.6.26內核是不支持同時打開1個以上的camera的:因為內核就只允許初始化一個camera dev),所以我就一個攝像頭拍完,USB介面取下來,另一個插上去 ,雖然插拔過程中沒有動過攝像頭,但是可能也有少許有的吧這個match過後還會生成一個 point.xyz的文件,這個應該都知道幹嘛的吧 ,就是 PCL(point cloud library) 點雲庫 工業機器人上應該用的比較多,也就是說xyz文件就是當前算出來的立體空間的三維坐標,也就是可以模擬出來三維空間。
至於OpenCV大概就是這樣,雖然吐圖像效果可以說是沒有,但是至少arm還是可行的,到時是arm晶元當然是越高檔越好。至於這個項目:當初老師說最終還是走gpu CUDA,目標是坐在多旋翼無人機上,進行地理勘測的。這個arm給我試試看來著;我畢業後也沒有在追過,我也就是興趣愛好探究一下,希望對大家有點幫助,多謝各位大神指教,恕不邀自來,O(∩_∩)O哈哈~機器視覺方面的開發板很多,硬體結構一般都不複雜,嵌入式的最小系統和相機模塊都得買,說是偏硬體其實還是在搞軟體,在arm上做機器視覺最大的問題是效率不高, 一般情況不要用現成的庫,自己根據實際情況寫演算法比較好。
糾正一下下面的回答計算器視覺被稱為Computer Vision又稱CV,代表的開源庫是OpenCV,而機器視覺被稱為Machina Vision,其實是兩個不的概念和領域。代表的有Halcon、康耐視、NI等等
硬體性能上:i5+中高端顯卡&>tk1&>樹莓派&> 2440之類 (dsp,fpga沒有接觸不作評論)
推薦閱讀:
※當前,在圖像處理領域,哪個方向比較火?或者比較好做?
※GitHub 上有哪些比較好的計算機視覺/機器視覺的項目?
※MXNet 的代碼要怎麼讀?
※為什麼在一堆字母「T」里找「I」比在一堆字母「I」里找「T」要難?
※機器學習、數據挖掘 如何進階成為大神?