歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Ubuntu下搭建樹莓派OpenCV交叉編譯環境

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

日期:2017/2/28 13:48:32   编辑:Linux教程

最近想把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程序交叉編譯環境搭建完成。

Copyright © Linux教程網 All Rights Reserved