天天看點

Ubuntu下OpenCV 2.4.3交叉編譯

轉自http://blog.163.com/thinki_cao/blog/static/8394487520134209235258/

軟體包位址:pan.baidu.com/......

主機平台(HOST):KUbuntu12.04

目标平台(TARGET):嵌入式Linux系統 3.x核心(Xilinx ZEDBoard) 由于OpenCV需要進行視訊中的運動檢測與分割,自然要用到相關函數打開AVI視訊.如果隻使用OpenCV進行交叉編譯,那麼預設情況下不支援AVI格式的打開與寫入,這是因為少了很多解碼庫與編碼庫,如x264,ffmpeg等,是以首先要對這些庫進行一次交叉編譯後,再進行OpenCV庫的交叉編譯才能支援AVI格式的視訊,這裡首先給出OpenCV交叉編譯時各個庫的依賴關系: OpenCV         |--------zlib                         |--------jpeg         |--------libpng                     |--------zlib          |--------tiff                     |--------zlib          |--------ffmpeg                     |--------x264                     |--------xvidcore

其中各個源碼包之間的依賴關系還是有一定的講究的,否則很容易編譯通不過,這裡建議下載下傳較新的穩定版進行交叉編譯,下面列出本人已經成功編譯通過的源碼包版本: ffmpeg-0.10.3 tiff-4.0.3 jpeg-8d x264-snapshot-20120528-2245-stable libpng-1.5.14 xvidcore-1.3.2 OpenCV-2.4.3 zlib-1.2.7 環境變量如下(最好在/etc/profile中添加): export PATH=/opt/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/bin:$PATH   #交叉編譯工具鍊 export CROSS_COMPILE=arm-xilinx-linux-gnueabi-    #編譯Xilinx ZEDBoard linux核心時需要的一個環境變量(根據需要設) export ZYNQ_QT_BUILD=/zynq/qt/qt-everywhere-opensource-src-4.8.3 export ZYNQ_CV_INSTALL=/zynq/opencv/opencv-lib   #OpenCV交叉編譯庫的安裝路徑 ———————————————————————————————————————————————— OpenCV-2.4.3 依賴庫的配置以及注意事項如下:

(有的CFLAGS中會有一些預設選項,如果直接覆寫可能會與預設配置不太一樣,大家可以先用預設的configure配置一遍檢視一下預設的CFLAGS中還有哪些選項,然後加在configure的CFLAGS選項中) zlib-1.2.7 export CC=arm-xilinx-linux-gnueabi-gcc ./configure --prefix=$ZYNQ_CV_INSTALL --shared make make install 注意:這裡需要事先聲明CC變量,zlib中沒有配置--host之類的選項 (如果要開啟ARM的NEON優化,需要修改Makefile中的CFLAGS,在最後加上 -mcpu=cortex-a9 -march=armv7-a -mfpu=neon -mfloat-abi=softfp)

jpeg-8d ./configure --prefix=$ZYNQ_CV_INSTALL --host=arm-xilinx-linux-gnueabi --enable-shared make make install (如果要開啟ARM的NEON優化,需要修改Makefile中的CFLAGS,在最後加上 -mcpu=cortex-a9 -march=armv7-a -mfpu=neon -mfloat-abi=softfp)

libpng 1.5.14 ./configure --prefix=$ZYNQ_CV_INSTALL --host=arm-xilinx-linux-gnueabi --enable-arm-neon --enable-shared --with-pkgconfigdir=$ZYNQ_CV_INSTALL/lib/pkgconfig LDFLAGS=”-L$ZYNQ_CV_INSTALL/lib" CFLAGS="-I$ZYNQ_CV_INSTALL/include" make make install 注意:libpng編譯過程中可能會用到zlib之類的庫,是以我們需要添加額外的LDFLAGS和CFLAGS變量,更多的資訊可以通過./configure --help進行參考 (如果要開啟ARM的NEON優化,需要修改在configure中的CFLAGS最後加上 -mcpu=cortex-a9 -march=armv7-a -mfpu=neon -mfloat-abi=softfp)

x264-snapshot-20120528-2245-stable ./configure --host=arm-linux --cross-prefix=arm-xilinx-linux-gnueabi- --enable-shared --prefix=$ZYNQ_CV_INSTALL make make install (如果要開啟ARM的NEON優化,需要在configure最後加上 --extra-cflags="-mcpu=cortex-a9 -march=armv7-a -mfpu=neon -mfloat-abi=softfp")

xvidcore-1.3.2 cd build/generic ./configure --prefix=$ZYNQ_CV_INSTALL --host=arm-xilinx-linux-gnueabi  make make install (如果要開啟ARM的NEON優化,需要在目前目錄下的config.status檔案中的S["CFLAGS"]開頭的那行最後加上 -mcpu=cortex-a9 -march=armv7-a -mfpu=neon -mfloat-abi=softfp)

tiff-4.0.3 ./configure --prefix=$ZYNQ_CV_INSTALL --host=arm-xilinx-linux-gnueabi --enable-shared LDFLAGS=-L$ZYNQ_CV_INSTALL/lib CFLAGS="-I$ZYNQ_CV_INSTALL/include -g -O2 -Wall -W"  CXXFLAGS="-I$ZYNQ_CV_INSTALL/include -g -O2" make make install 注意:tiff編譯過程中可能會用到zlib之類的庫,是以我們需要添加額外的LDFLAGS和CFLAGS變量,更多的資訊可以通過./configure --help進行參考 (如果要開啟ARM的NEON優化,需要在configure中的CFLAGS和CXXFLAGS最後都加上 -mcpu=cortex-a9 -march=armv7-a -mfpu=neon -mfloat-abi=softfp)

ffmpeg-0.10.3 ./configure --prefix=$ZYNQ_CV_INSTALL --enable-shared --disable-static --enable-gpl --enable-cross-compile --arch=arm --cpu=armv7-a --disable-stripping --target-os=linux --enable-libx264 --enable-libxvid --cc=arm-xilinx-linux-gnueabi-gcc --enable-swscale --extra-cflags=-I$ZYNQ_CV_INSTALL/include --extra-ldflags=-L$ZYNQ_CV_INSTALL/lib --disable-asm make make install 注意:ffmpeg編譯過程中可能會用到x264,xvid,zlib等之類的庫,是以我們需要添加額外的LDFLAGS和CFLAGS變量,更多的資訊可以通過./configure --help進行參考,ffmpeg的編譯中可能會調用arm指令集,但是在ZEDBoard上的ARM v7指令集的CortexA9核心隻能支援Thumb/Thumb2,是以這裡需要禁用彙編選項--disable-assembly (如果要開啟ARM的NEON優化,需要删除原來的"disable-asm"并且在configure中的CFLAGS和CXXFLAGS最後都加上 -march=armv7-a -mfpu=neon -mfloat-abi=softfp,注意這裡不能加-mcpu=cortex-a9,否則編譯器會報bug, 然後檢查config.h 裡面 HAVE_NEON 是不是有被置成 1,并且成功的話,libavcodec/arm/ 會有 *neon* 的目标檔案被生成 )

OpenCV2.4.3交叉編譯過程: 由于OpenCV從2.0以後的版本開始都是使用Cmake進行配置管理的,是以我們需要安裝相關的工具(對于PC機上OpenCV的本地編譯,可以參考官方網站上的 Installation in Linux) ,交叉編譯的情況下我們需要安裝cmake以及cmake-gui(包含在cmake-qt-gui中):

sudo apt-get install cmake cmake-qt-gui
      

首先解壓OpenCV2.4.3:

tar xvf OpenCV-2.4.3.tar.bz2
      

然後進入源碼目錄再建立一個build檔案夾并進入build檔案夾目錄:

cd 
   OpenCV
   -
   2.4
   .
   3
  
  
   
    mkdir
     build
   
   
    cd build
   
        

在目前目錄下建立toolchain.cmake文檔,内容如下: ###########user defined############# set( CMAKE_SYSTEM_NAME Linux ) set( CMAKE_SYSTEM_PROCESSOR arm ) set( CMAKE_C_COMPILER arm-xilinx-linux-gnueabi-gcc ) set( CMAKE_CXX_COMPILER arm-xilinx-linux-gnueabi-g++ ) ###########user defined############# set( CMAKE_FIND_ROOT_PATH "/zynq/opencv/opencv-lib" ) set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER ) set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY ) set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY ) ###################################### 注意:最後的四行是用于交叉編譯情況下依賴庫查找路徑以及查找模式的,它對于cmake能否找到依賴庫來說非常重要 然後進行cmake的配置:

cmake -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake ../
      

注意: 1. cmake的配置過程會修改OpenCV源碼中的内容,是以如果配置失敗的話請從解壓源碼開始從頭來過. 2. 配置過程開始之後會出現一堆的配置資訊,如果出現問題請仔細參考配置資訊. 3. 查找依賴庫的過程中調用pkg-config工具進行查找,對應的cmake指令在OpenCV-2.4.3/cmake/OpenCVFindPkgConfig.cmake檔案中,如果配置出現問題或者不能找到對應的庫路徑,可以在使用cmake重新配置之前在OpenCVFindPkgConfig.cmake找到#message(STATUS "  ${_varname} ... ${_pkgconfig_invoke_result}"),将#删除,在配置過程中會輸出pkg-config的查找過程,這是一個很不錯的查錯方式 配置完成以後在目前目錄下執行cmake-gui,設定好源碼路徑(OpenCV-2.4.3)與編譯路徑(OpenCV-2.4.3/build),将不要的東西全部勾掉,最後點選config之後出現如下配置資訊: (如果要開啟ARM的NEON優化,需要在cmake-gui中的設定環境變量,即CMAKE_CFLAGS和CMAKE_CXXFLAGS最後都加上 -mcpu=cortex-a9 -march=armv7-a -mfpu=neon -mfloat-abi=softfp) General configuration for OpenCV 2.4.3 =====================================   Version control:               exported

  Platform:     Host:                        Linux 3.2.0-37-generic-pae i686     Target:                      Linux arm     CMake:                       2.8.7     CMake generator:             Unix Makefiles     CMake build tool:            /usr/bin/make     Configuration:               Release

  C/C++:     Built as dynamic libs?:      YES     C++ Compiler:                /opt/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/bin/arm-xilinx-linux-gnueabi-g++  (ver 4.6.1)     C++ flags (Release):         -W -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -O3 -DNDEBUG  -DNDEBUG     C++ flags (Debug):           -W -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -g  -O0 -DDEBUG -D_DEBUG -ggdb3     C Compiler:                  /opt/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/bin/arm-xilinx-linux-gnueabi-gcc     C flags (Release):           -W -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -O3 -DNDEBUG  -DNDEBUG     C flags (Debug):             -W -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -g  -O0 -DDEBUG -D_DEBUG -ggdb3     Linker flags (Release):           Linker flags (Debug):             Precompiled headers:         YES

  OpenCV modules:     To be built:                 core imgproc flann highgui features2d calib3d ml video objdetect contrib nonfree photo legacy gpu stitching ts videostab     Disabled:                    python world     Disabled by dependency:      -     Unavailable:                 androidcamera java ocl

  GUI:      QT 4.x:                      NO     GTK+ 2.x:                    NO     GThread :                    NO     GtkGlExt:                    NO     OpenGL support:              NO

  Media I/O:      ZLib:                        zlib (ver 1.2.7)     JPEG:                        libjpeg (ver 62)     PNG:                         build (ver 1.5.12)     TIFF:                        build (ver 42 - 4.0.2)     JPEG 2000:                   build (ver 1.900.1)     OpenEXR:                     build (ver 1.7.1)

  Video I/O:     DC1394 1.x:                  NO     DC1394 2.x:                  NO     FFMPEG:                      YES       codec:                     YES (ver 53.61.100)       format:                    YES (ver 53.32.100)       util:                      YES (ver 51.35.100)       swscale:                   YES (ver 2.1.100)       gentoo-style:              YES     GStreamer:                   NO     OpenNI:                      NO     OpenNI PrimeSensor Modules:  NO     PvAPI:                       NO     GigEVisionSDK:               NO     UniCap:                      NO     UniCap ucil:                 NO     V4L/V4L2:                    NO/YES     XIMEA:                       NO     Xine:                        NO

  Other third-party libraries:     Use TBB:                     NO     Use Cuda:                    NO     Use OpenCL:                  NO     Use Eigen:                   NO

  Python:     Interpreter:                 /usr/bin/python (ver 2.7.3)

  Tests and samples:     Tests:                       NO     Performance tests:           NO     Examples:                    NO

  Install path:                  /zynq/opencv/OpenCV-2.4.3-cross/OpenCV-2.4.3/build/install

  cvconfig.h is in:              /zynq/opencv/OpenCV-2.4.3-cross/OpenCV-2.4.3/build -----------------------------------------------------------------

Configuring done 最後點選generate,生成makefile,之後就是我們熟悉的:

make

make install
      

PS:不要忘了在cmake-gui中配置安裝路徑,對應的環境變量是CMAKE_INSTALL_PREFIX 到此OpenCV-2.4.3的編譯與安裝就已經完成了。