首頁 > 軟體

Ubuntu下搭建樹莓派OpenCV交叉編譯環境

2020-06-16 17:32:02

       最近想把PC上執行的視訊監控的程式移植到嵌入式平台上,所以入手一款 Raspberry Pi 2 Model B。想按交叉編譯的方式編譯程式下載到樹莓派上。我的樹莓派安裝了Raspbian作業系統,PC機使用了Ubuntu作業系統。

0.為什麼要使用交叉編譯:

        雖然樹莓派2的主頻可達900MHz,但相比於PC機其效能還是差些,使用交叉工具鏈可節約開發時間。在編譯連結同等規模的程式碼時,PC機所用的時間應少於樹莓派所用時間。而且PC機軟體功能更完備,可以使用很多提高效率的外掛。所以通過交叉編譯的方式能很大程度上提高編碼效率。   

        樹莓派中已經安裝了gcc工具鏈,可在樹莓派中直接編譯原始碼生成可執行檔案。同時,PC機上也可使用gcc工具鏈生成可執行程式碼,但是和樹莓派上的gcc工具不同,PC機上的gcc工具生成intel或amd晶片上可執行的程式碼,但樹莓派卻是arm系列的晶片,使用的完全不是一個指令集。所以需要使用交叉工具鏈,在PC機上開發樹莓派中可執行程式。

1.如何安裝交叉編譯工具鏈 

        在樹莓派中文論壇裡已經有人介紹了交叉編譯平台的搭建。http://www.linuxidc.com/Linux/2016-09/135509.htm
        按照論壇中的說明即可安裝樹莓派的編譯器。個人認為這種編譯器應該針對樹莓派本身硬體做過一定優化,比如硬體浮點數運算等,編譯效果要好於一般的arm-linux-gcc/arm-linux-g++。
        有了這個編譯器,編譯一般的程式已經不成問題,但是還缺少OpenCV的標頭檔案和連線庫,不能交叉編譯OpenCV程式。

2.樹莓派如何安裝OpenCV

        網上已經有人介紹了兩種在樹莓派上OpenCV的方式,原始碼方式安裝 http://www.linuxidc.com/Linux/2016-09/135510.htm 和apt方式安裝http://www.linuxidc.com/Linux/2016-09/135511.htm  。這與一般嵌入式平台上的OpenCV移植不同,都是不通過交叉編譯(當然樹莓派應該也是可以交叉編譯移植OpenCV的,但是依賴的各種庫有的已經有了,有的還沒有,折騰起來會比較麻煩),直接在樹莓派上安裝OpenCV的方法。如果直接在樹莓派上編譯和使用OpenCV程式,它們確實非常方便,但是如果搭建交叉編譯環境,就要再費些功夫了。考慮到原始碼方式安裝OpenCV會比較麻煩,我選擇了apt方式安裝。下載安裝了OpenCV 2.4.1 的連線庫和一系列和它們有依賴關係的庫。

3.PC上OpenCV程式交叉編譯環境的搭建

        樹莓派上已經有了gcc工具鏈、OpenCV連線庫以及一系列它們依賴的庫。所以已經可以在上面編譯OpenCV程式了。但是我們的PC機上還沒有相應的庫。需要我們把上一步安裝好的庫拷貝到PC機上。

        首先把樹莓派接入網路,再給它設定一個固定的IP地址,這樣就可以使用ssh通過PC控制樹莓派了。在樹莓派上先 sudo apt-get install locate,這樣定位一些連結庫檔案就方便多了。當然別忘了updatedb,不然會搜什麼都搜不到。使用這個命令不難定位到OpenCV相關的庫都在 /usr/lib 中,而標頭檔案在 /usr/include/opencv 和 /usr/include/opencv2 中。使用scp指令,把它們拷貝到PC中儲存。

        如果這時嘗試編譯那些使用OpenCV函數的程式,會發現如果程式中呼叫了OpenCV highgui 模組的函數,就會因為缺少依賴項,有些符號無法解析而編譯失敗。這是因為libopencv_highgui.so檔案又呼叫了一些有諸如解碼ffmeg,解碼jpeg,gtk顯示等等功能的 .so 檔案。這些檔案有一些是Raspbian系統自帶的,有一些是安裝OpenCV時附帶安裝的。這些檔案也需要拷貝到PC機上。經過嘗試,發現一部分依賴項也在 /usr/lib 中,有些在 /usr/lib/arm-linux-gnueabihf 中,還有一些在 /lib/arm-linux-gnueabihf 中。拷貝檔案時我先把/usr/lib/arm-linux-gnueabihf拷貝到了PC機的home路徑下,然後把 /usr/lib 和 /lib/arm-linux-gnueabihf 中的 .so 檔案也拷貝到了這個資料夾中,這樣,我把所有的OpenCV庫函數和標頭檔案放到了raspberryOpenCV資料夾中,把其他依賴項放到了arm-linux-gnueabihf 中,如下圖所示(查詢這些檔案時可以嘗試編譯呼叫了OpenCV highgui 模組的函數的程式,arm-linux-gnueabihf-g++ 會提示缺少哪些檔案。在樹莓派上搜尋這些檔案並拷貝到主機,按照文章後面的方式指定路徑,再次編譯,反復幾次直到成功為止)

 

4.程式編譯與下載執行

        經過上面的步驟我們已經把編譯程式所有需要的內容都準備好了。下面就可以開始編譯程式了。輸入如下命令;

arm-linux-gnueabihf-g++ -I'/home/windfish/raspberryOpenCV/include' -I'/home/windfish/raspberryOpenCV/include/opencv' -I'/home/windfish/raspberryOpenCV/include/opencv2' -L'/home/windfish/raspberryOpenCV/lib' -Wl,-rpath='/home/windfish/arm-linux-gnueabihf' -lopencv_highgui -lopencv_imgproc -lopencv_core CannyDetector_Demo.cpp -o CannyDetector
        由於我們沒有pkg-config命令,所以需要指定OpenCV標頭檔案和庫檔案的路徑。其他依賴項已經拷貝到 /home/windfish/arm-linux-gnueabihf 資料夾中,可以用
   -Wl,-rpath='/home/windfish/arm-linux-gnueabihf'

        指定(rpath連結選項主要有兩個功能:(1)程式執行時,優先到rpath指定的目錄去尋找依賴庫(2)程式連結時,在指定的目錄中,隱式的連結那些動態庫所需要的連結庫。往往我們都熟知第一個功能,忽略第二個功能。而第二個功能正是此處所需要的)。這樣就能編譯出我們需要的程式了。

        把 CannyDetector 檔案和所需圖片使用 scp 複製到樹莓派中。這時如果在ssh上執行該程式,程式在顯示圖片的時候會出現問題。而直接在樹莓派上操作是可以執行的。這是因為ssh預設是不接受圖片顯示的。按照文章 http://www.linuxidc.com/Linux/2012-01/52306.htm  中的方法進行設定(文章中沒有提到主機更改設定後也要重新啟動ssh,這一點也很重要),再次執行,就能看到回傳的結果了。

        至此,OpenCV程式交叉編譯環境搭建完成。

本文永久更新連結地址http://www.linuxidc.com/Linux/2016-09/135512.htm


IT145.com E-mail:sddin#qq.com