OpenCV是眼下開源項目中最著名的基於機器視覺方向的圖像處理的開發包,眼下已經有被移植到嵌入式Linux環境上。
本文介紹了OpenCV交叉編譯的基本步驟。
在opencv交叉編譯之前要先進行依賴庫的交叉編譯,然后才干進行opencv庫的交叉編譯(由於opencv依賴於非常多庫函數,假設不編譯會造成,編譯后的opencv無法使用)這里首先給出OpenCV交叉編譯時各個庫的依賴關系:
OpenCV
|——–zlib
|——–jpeg
|——–libpng
|——–zlib
|——–tiff
|——–zlib
|——–ffmpeg
|——–x264
|——–xvidcore
當中各個源代碼包之間的依賴關系還是有一定的講究,否則非常easy編譯努通過,這里建議下載較新的穩定版進行交叉編譯,以下列出了本人的配置環境:
一、編譯環境及庫文件
linux環境:ubuntu12.04
交叉編譯:4.3.2
arm板子:iTOP4412開發板
libz:
libjpeg:
libpng:
libyasm:
opencv:
libx264:
libxvid:
lffmpeg:
cmake:
二、opencv-2.4.9的移植過程
1、libz的交叉編譯:
./configure –prefix=/usr/local/arm/4.3.2/arm-none-linux-gnueabi/zlib-install –shared
改動makefile
CC=arm-linux-gcc
AR=arm-linux-ar
RANLIB=arm-linux-ranlib
CDSHARED=arm-linux-gcc -shared -wl, -soname,libz.so.1,–version-script,zl lib.map (不一樣沒關系僅僅改前面編譯器)
make
make install
2、libjpeg的交叉編譯:
./configure –host=arm-linux –prefix=/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libjpeg-install –enable-shared –enable-static
make
make install
3、libpng的交叉編譯:
./configure –host=arm-linux –prefix=/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libpng-install –enable-shared –enable-static
make
make install
4、yasm的交叉編譯:
./configure –host=arm-linux –prefix=/usr/local/arm/4.3.2/arm-none-linux-gnueabi/yasm-install –enable-shared –enable-static
make
make install
5、libx264的交叉編譯:
CC=arm-linux-gcc ./configure –enable-shared –host=arm-linux –disable-asm –prefix=/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libx264-install
make
make install
6、libxvid的交叉編譯:
cd build/generic
./configure –prefix=/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libxvid-install –host=arm-linux –disable-assembly
make
make install
#
注意:
在繼續下一步之前須要拷貝之前編譯好的庫即每一個-install/lib/下的文件到/usr/local/arm/4.3.2/arm-none-linux-gnueabi/opencv-depend以下不然后面會提示找不到庫(多謝群里的朋友反映這個問題)
(–extra-cflags=”-l usr/local/arm/4.3.2/arm-none-linux-gnueabi/opencv-depend”
這個命令制定了依賴庫文件夾路徑以供configure查找)
#
7、ffmpeg的交叉編譯:
./configure –prefix=/usr/local/arm/4.3.2/arm-none-linux-gnueabi/ffmpeg-install –enable-shared –disable-static –enable-gpl –enable-cross-compile –arch=arm –disable-stripping –target-os=linux –enable-libx264 –enable-libxvid –cc=arm-linux-gcc –enable-swscale –extra-cflags=”-L usr/local/arm/4.3.2/arm-none-linux-gnueabi/opencv-depend”
make
make install
到此全部依賴庫編譯安裝完畢
安裝文件夾在:/usr/local/arm/4.3.2/arm-none-linux-gnueabi/
每一個庫有各自的-install文件夾
新建文件夾
mkdir /usr/local/arm/4.3.2/arm-none-linux-gnueabi/opencv-depend/
然后拷貝全部-install下的lib下的文件到opencv-depend文件夾下
8.cmake-gui安裝(自己下載)
到官網上下載已經編譯好的cmake-2.8.8-Linux-i386.tar,gz,解壓就能夠了
9、opencv2.4.9的交叉編譯:
用到的主要文件夾說明:
交叉編譯工具鏈所在文件夾 /usr/local/arm/4.3.2/
安裝opencv的文件夾 /usr/local/arm/opencv-install
opencv源代碼所在文件夾 /usr/local/arm/opencv2.4.9
編譯好的opencv庫所在文件夾 /usr/local/arm/opencv-2.4.2/build
10.配置cmake(這一步的目的是配置編譯器並讓cmake-gui找到全部共享庫不然cmake-gui會少非常多選項由於沒有發現依賴庫,比如你直接cmake-gui就沒有v4l選項,直接導致移植成功后無法打開攝像頭,別問我是怎么知道的..說多了都是淚啊)
cd opencv-2.4.9
mkdir build
cd build
vim toolchain.cmake
內容例如以下
#####user defined
set( CMAKE_SYSTEM_NAME Linux )
set( CMAKE_SYSTEM_PROCESSOR arm )
set( CMAKE_C_COMPILER arm-none-linux-gnueabi-gcc )
set( CMAKE_CXX_COMPILER arm-none-linux-gnueabi-g++ )
#####user defined
set( CMAKE_FIND_ROOT_PATH” /usr/local/arm/4.3.2/arm-none-linux-gnueabi/opencv-depend/ ” )
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 -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake ../
11.配置cmake-gui
cmake-gui
選擇源代碼文件夾/usr/local/arm/opencv-2.4.9/
選擇Build文件夾:/usr/local/arm/opencv-2.4.2/build
點擊Configure。保持generator為Unix Makefiles(不用改),選擇Specify options for cross-compiling(最后一個選項),點擊Next,
Operating System填寫arm-linux
C Compilers填寫/usr/local/arm/4.3.2/bin/arm-linux-gcc
C++ Compilers填寫/usr/local/arm/4.3.2/bin/arm-linux-g++
程序庫的Target Root填寫/usr/local/arm/4.3.2/
然后點擊Finish。
默認安裝文件夾為/usr/local,改為/usr/local/arm/opencv-install(由於之前安裝了x86的opencv在usr/local為了避免弄混了)
CMAKE_INSTALL_PREFIX /usr/local/arm/opencv-install
改動選項(假設不改make會出現非常多錯誤由於找不到庫)
去掉WITH_CUDA
去掉WITH_GTK
去掉WITH_1394
去掉WITH_GSTREAMER
去掉WITH_LIBV4L(后邊有v4l這個沒用不要選)
去掉WITH_TIFF
去掉BUILD_OPENEXR
去掉WITH_OPENEXR
去掉BUILD_opencv_ocl
去掉WITH_OPENCL
完畢后Generate
改動CMakeCache.txt,CMAKE_EXE_LINKER_FLAGS原來為空,加上-lpthread -lrt,
點擊Generate生成Makefile。(203行附近有小引號能夠帶着像這樣’-lpthread -lrt’)
make(出現錯誤通常是選多了或者前面做錯了make clean)
make install
12.最后
另一步特別關鍵 。須要把/usr/local/arm/opencv-install/lib 下全部的動態鏈接庫 復制到交叉編譯下/usr/local/arm/4.3.2/arm-non-linux-gnueabi/lib下
三、測試
測試程序:(qt設置)
四.復制到開發板運行
1.將/usr/local/arm/opencv-install/lib/下的庫復制到開發板/lib/下
2.#mkdir /usr/local/arm/opencv-install/lib/
並拷貝上述庫到mkdir /usr/local/arm/opencv-install/lib/
3.拷貝opencv-depend下庫到開發板/lib/下
4.拷貝測試程序到開發板/bin/文件夾下賦予可運行權限chmod 777 CamaraGet
5. cd /bin/
./ CamaraGet –qws &
(假設提示庫找不到原因是你編譯的庫建立了相似快捷方式的東西而你拷貝的庫沒有拷貝快捷方式所以程序連接的時候找不到快捷方式,能夠將你的庫改名成提示缺少的庫名(快捷方式名)基本上就是去掉版本號后綴比如
( mv libopencv_core.so.2.4.9 libopencv_core.so.2.4 )
以下是文件文件夾演示樣例
五.說明
開發板USB攝像頭預覽節點是/dev/video4 opencv調cam = cvCreateCameraCapture(204); 這個函數的意思是打開video4網上非常多討論括號中的參數僅僅要有: 0 , -1, 202 但要依據你自己的情況改,實測204(在板子上能夠)
所需依賴庫在這里下載
http://download.csdn.net/detail/engineer_wjr/9419761
交叉編譯好的依賴庫在這里
http://download.csdn.net/detail/engineer_wjr/9419761