首頁 > 軟體

Ubuntu 16.04上用CMake圖形介面交叉編譯樹莓派的OpenCV3.0

2020-06-16 17:30:27

引言

最近有個科研課題需要在樹莓派上做一系列驗證,但是實驗的程式是依賴OpenCV庫的(最重要我們修改了庫原始碼),而在樹莓派上編譯OpenCV原始碼很費時間,因此我只好使用交叉編譯的方法來編譯源程式。剛開始我們覺著網上材料大片,這部分的問題應該不大。可到操刀幹活的時候,我才發現網上很多方法不僅繁瑣,而且有的甚至還不是那麼一回事,沒看到一篇完全適合我的情況的。於是,我花了一天半左右的時間,整理這些材料並結合一點TRIZ原理,完成了這項任務。現在分享一下我的方案總結,不過我的方案不盡完善,歡迎大家指點修正,幫助後人節省時間。

準備工作

首先,我的作業系統是Ubuntu 16.04,其實OpenCV的交叉編譯對系統並沒有任何特殊要求,只是我個人覺著Linux操作環境比較方便而已,本文提供的方法理論上window系統只需稍加修改應該也是適用的。不過值得注意的是,如果想按照OpenCV官方教學的話,我建議使用14.04LTS的Ubuntu舊版本系統。因為16.04採用的編譯工具已經升級到5.0了,它編譯出來的檔案需要依賴新版本的libstdc++庫,要求樹莓派更新安裝gcc-5.0或g++-5.0才可以使用,但在樹莓派上安裝那玩意並不划算,所以我建議在老版本的Ubuntu環境下按照官方教學操作,從apt獲取4.9以下的GNU交叉編譯工具,交叉編譯OpenCV3.0的目的。記得在樹莓派上執行相應程式前,要將編譯好的庫檔案拿進板載系統裡面,並設定好相應的環境變數,具體後文會有詳細介紹。

然後,安裝下載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靜態庫檔案。如果存在這些檔案,就表示我們已經編譯裝載成功了。

如果在編譯過程中遇到問題,可以參考這篇文章嘗試修正。http://www.linuxidc.com/Linux/2014-05/101224.htm

測試編譯結果

最後,我們將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系統的一些機制和編譯流程沒有一定理解,我想大家還是會有不少問題的。所以,歡迎大家評論提問,指點修正,集思廣益。

OpenCV官方教學中文版(For Python) PDF  http://www.linuxidc.com/Linux/2015-08/121400.htm

Ubuntu Linux下安裝OpenCV2.4.1所需包 http://www.linuxidc.com/Linux/2012-08/68184.htm

Ubuntu 12.04 安裝 OpenCV2.4.2 http://www.linuxidc.com/Linux/2012-09/70158.htm

CentOS下OpenCV無法讀取視訊檔 http://www.linuxidc.com/Linux/2011-07/39295.htm

Ubuntu 12.04下安裝OpenCV 2.4.5總結 http://www.linuxidc.com/Linux/2013-06/86704.htm

Ubuntu 10.04中安裝OpenCv2.1九步曲 http://www.linuxidc.com/Linux/2010-09/28678.htm

基於QT和OpenCV的臉部辨識系統 http://www.linuxidc.com/Linux/2011-11/47806.htm


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