linux opencv2.3.1移植到tiny6410 支持视频读写

来源:互联网 发布:郑州it公司 编辑:程序博客网 时间:2024/05/16 04:39

交叉编译了两个月的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程序步骤去执行。

0 0