歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Ubuntu 16.04上用CMake圖形界面交叉編譯樹莓派的OpenCV3.0

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

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

引言

最近有個科研課題需要在樹莓派上做一系列驗證,但是實驗的程序是依賴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

[翻譯]Ubuntu 14.04, 13.10 下安裝 OpenCV 2.4.9 http://www.linuxidc.com/Linux/2014-12/110045.htm

OpenCV的詳細介紹:請點這裡
OpenCV的下載地址:請點這裡

Copyright © Linux教程網 All Rights Reserved