linux opencv2.3.1移植到tiny6410 支持視頻讀寫

交叉編譯了兩個月的opencv現在總算是告一段落了。先前嘗試過好多次,也遇到了好多錯誤,也成功過好多次,但是編譯的opencv總是缺少某些功能。其中不能讀取視頻就是一個非常嚴重的問題。由於所做項目必須對視頻進行處理,所以不得不重複編譯。但慶幸的是到最後也算是成功了。再次與大家分享。


想要opencv能夠讀取視頻,必須編譯一些解碼庫。如ffmpeg,而編譯ffmpeg又需要一些依賴庫。所以在編譯opencv之前,我們還需要編譯一些相關的庫。在編譯庫時參照了小安崽崽的編譯方法。在此表示感謝。

下面就是本人編譯所用到的庫

linux環境:Fedora9

arm開發板:tiny6410

交叉編譯器:cmake2.8.12.2

opencv版本:2.3.1

libz:        zlib-1.2.7
libjpeg:       jpegsrc.v7
libpng:       libpng-1.2.18
libyasm:       yasm-1.2.0
libx264:       x264-snapshot-20120608-2245
libxvid:       xvidcore-1.3.2
ffmpeg:       ffmpeg-0.10.3



1、libz的交叉編譯:

# ./configure --prefix=/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi --shared

修改makefile
CC=arm-linux-gcc
AR=arm-linux-ar rc
RANLIB=arm-linux-ranlib
LDSHARED=arm-linux-gcc -shared -wl, -soname,libz.so.1,--version-script,zl
lib.map
#make
#make install

2、libjpeg的交叉編譯:

#./configure --host=arm-linux --prefix=/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi --enable-shared --enable-static
#make install


3、libpng的交叉編譯

#./configure --host=arm-linux --prefix=/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi --enable-shared --enable-static
#make
#make install

4、yasm的交叉編譯:

#./configure --host=arm-linux --prefix=/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi --enable-shared --enable-static
#make
#make install


5、libx264的交叉編譯:

#CC=arm-linux-gcc ./configure --enable-shared --host=arm-linux --disable-asm --prefix=/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi
#make
#make install
6、libxvid的交叉編譯:

#cd build/generic
#./configure --prefix=/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi --host=arm-linux  --disable-assembly
#make
#make install

7、ffmpeg的交叉編譯:

#./configure --prefix=/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi --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
#make
#make install

編譯完依賴庫後下面開始編譯opencv。編譯opencv用到的是cmake。cmake2.8.12.2是免安裝的,解壓後就能用,不過我們需要將解壓後的bin目錄添加到環境變量PATH中,因爲下面我們會在其他路徑下執行cmake。然後再解壓opencv2.3.1。
解壓完後新建build目錄,作爲編譯opencv的工作目錄。
mkdir build
cd build
在opencv2.3.1目錄下新建toolchain.cmake文件。vi toolchain.cmake
文件內容爲
set( CMAKE_SYSTEM_NAME Linux )
set( CMAKE_SYSTEM_PROCESSOR arm )
set( CMAKE_C_COMPILER arm-linux-gcc )
set( CMAKE_CXX_COMPILER arm-linux-g++ )
set( CMAKE_FIND_ROOT_PATH "/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/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 )

注:/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/lib爲上面編譯相關庫時的安裝目錄。

最後四行非常重要,否者可能找不到相關庫。

進入build目錄執行cmake -D CMAKE_TOOLCHAIN_FILE=../toolchain.cmake ../


完成之後查看輸出信息,不幸的是FFMPEG 對應的仍然是 NO。也就是說我們先前編譯的ffmpeg,此時並沒有找到。在安裝ffmpeg的路徑下lib中生成了一個pkgconfig,此時我們還需要添加PKG_CONFIG_PATH。

export PKG_CONFIG_PATH=/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/lib/pkgconfig:$PKG_CONFIG_PATH

之後再回到build目錄下執行cmake -D CMAKE_TOOLCHAIN_FILE=../toolchain.cmake ../

此時便會看到FFMPEG對應的是YES



之後再cmake-gui CMakeCache.txt 去掉一些沒用的選項,否則編譯會出現錯誤。我最後編譯的選項如下,有些選項也不知道是什麼意思。也是憑感覺去掉。慶幸的是最後也編譯通過了,不知道以後會碰到什麼問題。等碰到問題再說吧。

此處CMAKE_INSTALL_PREFIX後面是安裝目錄,可以根據自己的需要去改。另外PYTHON那一項一定要去掉不然會出錯。







此處TITH_TIFF一定要去掉。另外WITH_QT也可以不勾,雖然我們opencv是在qt上運行的。但是我們先前也已經成功移植了qt在開發板上。WITH_V4L一定要勾上,與視頻讀取有關。之後再configure一下,否則上面的修改並不會生效。上圖也是我configure之後的情況。

此時再查看FFMPEG仍然是YES。恭喜你已經距離成功不遠了。


然後generate一下,進入opencv2.3.1下的build目錄,再執行make。編譯開始進行。此時可能還會碰到一個錯誤。

好像是找不到fabsl,反正錯誤與fabsl有關,此時

修改OpenCV-2.3.1/modules/flann/include/opencv2/flann/dist.h文件

在第63行的源碼:{ return fabsl(x); }改爲{ return fabs(x); }。

然後重新make

不出意料還會出現一個與pthread有關的錯誤。

此時需要在build目錄下的CMakeCache.txt,CMAKE_EXE_LINKER_FLAGS原來爲空,加上-lpthread -lrt

然後再執行make應該不會再碰到問題。祝你好運啊。當然遇到問題也不要害怕,多baidu  Google一下。畢竟我當年編譯了兩個月啊。

make成功之後再執行make install就會安裝在上面設置的安裝目錄下。

然後把安裝目錄下lib文件夾中的libopencv各種.so文件和先前編譯的相關庫.so文件打包放到開發板上(執行程序時提示頭文件找不到,還需要把opencv頭文件也打包過去)。建議一塊做成壓縮包,否則鏈接文件可能會丟失。

把壓縮包移到開發板之後解壓目錄要與上面安裝目錄一致。然後再export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/arm(/usr/local/arm爲解壓目錄,也是在虛擬機上opencv安裝目錄)。如果再執行程序時還是顯示找不到libopencv各種.so文件,就在根目錄下lib即 /lib下再把壓縮包裏.so文件拷貝過去。當然如果考慮存儲空間問題,可以建立軟連接。

以上就把opencv交叉編譯移植完成了,接下來就是運行例題了。不過tiny6410不支持opencv的cvNameWidow(),cvWaitKey(),cvShowImage()等顯示函數,不過幸好支持opencv加載圖片和視頻的函數。因此,在顯示圖片時我們需要把opencv的Iplimage圖片轉換爲Qt的QImage圖片,然後顯示在QT界面上。


運行實例時我們需要一起交叉編譯QT和opencv程序。此時需要把opencv的庫添加到qt中,以使得qt的qmake時能找到opencv庫函數。

移植到開發板上的程序需用QT/Embedded中的qmake進行構建。此時需要找到Qt/Embedded的安裝目錄。然後再找mkspecs/qws/linux-arm-g++/qmake.conf文件。在裏面添加opencv庫。 添加方式如下圖


以上準備工作就全部完成。接下來就是交叉編譯程序。

cd videoReader5-25

(videoReader5-25盛放要編譯源程序)

qmake -project

qmake -spec ......mkspecs/qws/linux-arm-g++ -o Makefile

(......mkspecs/qws/linux-arm-g++就是剛纔qmake.conf文件目錄)

make

此時在videoReader5-25文件夾中就會生成一個videoReader5-25可執行文件。移植到開發板上,按照tiny6410執行qt程序步驟去執行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章