Unbuntu16.04上用CMake圖形介面交叉編譯樹莓派的OpenCV3.0
引言
最近有個科研課題需要在樹莓派上做一系列驗證,但是實驗的程式是依賴OpenCV庫的(最重要我們修改了庫原始碼),而在樹莓派上編譯OpenCV原始碼很費時間,因此我只好使用交叉編譯的方法來編譯源程式。剛開始我們覺著網上材料大片,這部分的問題應該不大。可到操刀幹活的時候,我才發現網上很多方法不僅繁瑣,而且有的甚至還不是那麼一回事,沒看到一篇完全適合我的情況的。於是,我花了一天半左右的時間,整理這些材料並結合一點TRIZ原理,完成了這項任務。現在分享一下我的方案總結,不過我的方案不盡完善,歡迎大家指點修正,幫助後人節省時間。
準備工作
首先,我的作業系統是Ubuntu16.04,其實OpenCV的交叉編譯對系統並沒有任何特殊要求,只是我個人覺著Linux操作環境比較方便而已,本文提供的方法理論上window系統只需稍加修改應該也是適用的。不過值得注意的是,如果想按照
然後,安裝下載git,cmake圖形介面工具,樹莓派編譯工具,以及OpenCV原始碼。
參考操作:
apple@hello-world :~$ sudo apt-get install git cmake-qt-gui
apple@hello-world:~$ git clone https://github.com/opencv/opencv.git
apple@hello-world:~$ git clone https://github.com/raspberrypi/tools.git
安裝下載完成後,我們就能看到當前目錄下多了兩個目錄——opencv和tool——以及一個cmake-gui的指令,到這裡我們的準備工作就完成了。
交叉編譯OpenCV
完成了準備工作,接下來就是實際操做編譯OpenCV。
1.建立編譯連結目錄,用cmake-gui配置編譯工具
參考操作:
apple@hello-world:~$ cd opencv
apple@hello-world:~$ mkdir build
apple@hello-world:~$ cd build
apple@hello-world:~$ cmake-gui
進入如圖所示的cmake圖形介面。
1)先點選Browse Source…選擇到opencv的根目錄,如~/opencv
2)再點選Browse Build…選擇到opencv下我們建立的編譯連結目錄,如~/opencv/build
3)最後點選Configure,進入編譯器選擇介面如下圖
4)選擇Specify options for cross-compiling,並點選Next進入編譯器設定介面如下圖
5)如圖填寫編譯工具資訊,其中比較重要的是Compilers下的C, C++, Target Root項。
其中C項代表的是樹莓派編譯工具的gcc編譯器,如本文的
/home/apple/tools/arm-bcm2708/arm-rpi-4.9.3-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc
而C++項表示樹莓派編譯工具的g++編譯器,如本文的
/home/apple/tools/arm-bcm2708/arm-rpi-4.9.3-linux-gnueabihf/bin/arm-linux-gnueabihf-g++
Target Root代表標準庫與標頭檔案的搜尋起始位置,可以理解為對應交叉編譯工具的根目錄。
/home/apple/tools/arm-bcm2708/arm-rpi-4.9.3-linux-gnueabihf/arm-linux-gnueabihf
6)點選Finish生成一系列編譯配置。
2.建立裝載目錄,配置編譯選項,生成Makefile。
1)在編譯連結目錄下,建立一個裝載目錄。
apple@hello-world:~$ mkdir install
2)在Search欄上輸入BUILD_SHARED_LIBS,並去掉對應value的勾,我們採用靜態編譯。
3)在Search欄上輸入WITH_CUDA,也去掉對應value的勾,不編譯CUDA部分程式碼。
4)在Search欄上輸入CMAKE_INSTALL_PREFIX,將對應value的值改成我們build下的install裝載目錄,如/home/apple/opencv/build/install
5)在Search欄上輸入BUILD_DOCS,去掉對應value的勾,表示不生成幫助文件。
6)在Search欄上輸入WITH_CUFFT,去掉對應value的勾,表示不用cuda的fft。
7)在Search欄上輸入CL,分別將WITH_OPENCL, WITH_OPENCLAMDBLAS, WITH_OPENCLAMDFFT, OPENCL_FOUND的勾去掉,我們的實驗不採用OpenCL的GPU加速。
8)點選Configure,進度條完成後,再點選Generate,即會在build下產生Makefile編譯檔案。
3.修改CMakeCache.txt檔案,編譯並裝載庫檔案。
1)開啟CMakeCache.txt檔案,查詢CMAKE_CXX_FLAGS:STRING,併為其賦值-lpthread -lrt
apple@hello-world:~$ vim CMakeCache.txt
將CMAKE_CXX_FLAGS:STRING=
改成CMAKE_CXX_FLAGS:STRING=-lpthread -lrt
儲存並關閉CMakeCache.txt檔案。
2)執行編譯裝載指令。
apple@hello-world:~$ make
apple@hello-world:~$ make install
4.完成OpenCV的交叉編譯。這時,我們可以檢查以下install/lib目錄下是否有我們所需要的.a靜態庫檔案。如果存在這些檔案,就表示我們已經編譯裝載成功了。
如果在編譯過程中遇到問題,可以參考這篇部落格嘗試修正。
測試編譯結果
最後,我們將install目錄傳到樹莓派上做測試。注:下面的說明都建立在install目錄已經在樹莓派板子上的前提條件下。
1.修改~/.bashrc,在檔案尾部新增下面兩行程式碼:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/pi/install/lib
export LIBRARY_PATH=$LIBRARY_PATH:/home/pi/install/lib
2.執行install/bin下的opencv_version,如果列印輸出是該opencv的版本號就表明咱們交叉編譯成功!
總結
雖然上面的操作相當簡單,但是如果對Linux系統的一些機制和編譯流程沒有一定理解,我想大家還是會有不少問題的。所以,歡迎大家評論提問,指點修正,集思廣益。