zedboard开发板上一步步移植opencv

由于我本机测试使用的opencv的版本为opencv2.4.6.1.故而我想要移植这个版本的opencv到zedboard板卡上。参考Xilinx出版的《Zynq开发实战》的第13章以及几个人的博客进行配置编译的时候,总是会出现如下的错误:

In file included from /usr/include/math.h:409:0,
                 from /opt/opencv-2.4.6.1/modules/core/include/opencv2/core/types_c.h:94,
                 from /opt/opencv-2.4.6.1/modules/core/include/opencv2/core/core.hpp:49,
                 from /opt/opencv-2.4.6.1_forArm/modules/core/precomp.hpp:50:
/usr/include/bits/mathinline.h: In function 'void cv::randnScale_8u(const float*, uchar*, int, int, const float*, const float*, bool)':
/usr/include/bits/mathinline.h:675:3: error: unknown register name 'st' in 'asm'
/usr/include/bits/mathinline.h:675:3: error: unknown register name 'st' in 'asm'
/usr/include/bits/mathinline.h:675:3: error: unknown register name 'st' in 'asm'
/usr/include/bits/mathinline.h: In function 'void cv::randShuffle_(cv::Mat&, cv::RNG&, double) [with T = unsigned char]':
/usr/include/bits/mathinline.h:675:3: error: unknown register name 'st' in 'asm'
/usr/include/bits/mathinline.h: In function 'void cv::randShuffle_(cv::Mat&, cv:
......
在用交叉编译工具链编译opencv时候,我本来已经将交叉编译工具链写入了环境变量,那它搜索的时候,应该是遍历交叉编译工具链下的头文件,但是opencv却默认遍历到gcc头文件下,故而出现这样的错误,为何会这样呢?试了多种方式均不能编译通过,故而弃用书上编译opencv的方式,转向下面的方式:

我们采用图形化的cmake进行配置,这样就可以指定交叉编译工具链的头文件目录,下载cmake安装包(ps:不要下载源代码),下载地址如下:

http://www.cmake.org/cmake/resources/software.html我使用的系统为Centos6.4,故而我选择的平台为Linux i386,下载其后面的压缩包,如下图所示:

zedboard开发板上一步步移植opencv_第1张图片

下载完成后,解压缩cmake-2.8.12.2-Linux-i386.tar.gz到/usr/local下,使用下面的命令:

tar xvzf cmake-2.8.12.2-Linux-i386.tar.gz -C /usr/local
把cmake工具写入环境变量,编辑~/.bashrc,在最后面添加下面一句:

export PATH=$PATH:/usr/local/cmake-2.8.12.2-Linux-i386/bin
接下来,我们利用cmake-gui进行opencv的配置,创建zedopencv目录,解压缩opencv代码到此目录下,在opencv的源代码下创建zed_install,然后进入此目录。命令如下:

tar xvzf opencv-2.4.6.1.tar.gz -C ./zedopencv
cd ./zedopencv/opencv-2.4.6.1
mkdir zed_install
cd zed_install
cmake-gui
出现如下的界面:

zedboard开发板上一步步移植opencv_第2张图片
其中,按照提示选择要编译的opencv源代码的路径以及安装编译路径,这里如图所示。然后点击Configure,出现如下的配置界面:

zedboard开发板上一步步移植opencv_第3张图片
这里一定要注意,选择Unix Makefile选项,在下面选择指定编译器选项,然后点击next进入下面的界面,按照提示,填入如下的信息:

zedboard开发板上一步步移植opencv_第4张图片

指定交叉编译环境的头文件目录是/opt/xlinx-arm-gcc/arm-xilinx-linux-gnueabi/libc/usr/,选择C与C++的编译器,还有平台,这里一定要注意Library mode的选项,这里一定要选择在根目录与本地系统下均搜索,如上图所示,点击Finish完成配置。第三方库,尽量不用选,如下图所示:

zedboard开发板上一步步移植opencv_第5张图片

然后点击Generate,完成配置,然后执行make,开始编译,编译的过程中会出现下面的一个错误:

Linking CXX executable ../../bin/opencv_createsamples 
../../lib/libcxcore.so: undefined reference to `clock_gettime' 
../../lib/libcxcore.so: undefined reference to `pthread_key_create' 
../../lib/libcxcore.so: undefined reference to `pthread_getspecific' 
../../lib/libcxcore.so: undefined reference to `pthread_setspecific'
按照错误的提示,是缺少线程链接,我们需要对此目录下的CmakeCache.txt进行修改,修改的位置如下:

 178 //Flags used by the linker.
 179 CMAKE_EXE_LINKER_FLAGS:STRING=-lpthread -lrt
然后保存退出,继续编译就可以完成所有的编译。完成后,在此目录下的lib下发现已经编译好了所有的库文件,创建zed-lib-opencv文件夹,拷贝所用的.so文件到此目录下。为了便于管理所有的文件,我将opencv_lib拷贝到制作根文件的目录下。利用官网自带的根文件系统,也可以利用busybox进行制作,定制自己的文件系统,这里为了方便,我对官网的根文件系统进行修改,解压缩所有的东西到filesys目录下,我的如下图所示:


为了便于制作镜像文件,在此目录下创建ramdisk文件夹。我写了个shell脚本,也就是图中所示的fs.sh,为了便于操作其中的参数$1代表要制作的镜像的名称,$2代表要制作镜像的文件夹,$3代表镜像的大小,脚本的具体内容如下:

#!/bin/bash
dd if=/dev/zero of=$1.image bs=1M count=$3

mke2fs -F $1.image -L "ramdisk" -b 1024 -m 0
tune2fs $1.image -i 0

chmod 777 $1.image

#mkdir ramdisk

mount -o loop $1.image ./ramdisk

cp -R ./$2/* ./ramdisk

umount ./ramdisk

#gzip -9 $1.image
由于ramdisk文件系统的大小为8M,而Opencv的库文件显然大于8M,其接近于25M,故而8M是满足不了的,SD卡有4G的空间,制作库文件的镜像,拷贝到SD卡上,把SD卡挂载到Linux系统,就可以解决空间不够用的问题。我们进行如下的操作:

首先进入filesys,在usr目录下创建lib,再进入etc/init.d,对rcS文件进行修改。添加下面几行代码:

echo "mount otherlib....."
mount  /dev/mmcblk0p1  /mnt
mount /mnt/opencvlib.image   /usr/lib

export PATH=$PATH:/usr/local/bin
export LD_LIBRARY_PATH=/usr/local/lib:/lib
然后,我们进行镜像的制作:

./fs.sh ramdisk8M filesys  8
./fs.sh opecv_lib zed-lib-opencv 80
制作了两个镜像文件ramdisk8M.image opecv_lib.image大小分别为8M与80M.

然后对ramdisk进行压缩:

gzip -9 ramdisk8M.image
然后将新生成的ramdisk8M.image.gz与opencv_lib.image拷贝到SD卡启动zedboard即可发现,/usr/lib目录下已经有了opencv库文件,至此opencv移植到zedboard工作彻底完成!此方法也可以用于一般的arm开发板opencv的移植。
要支持第三方库,可以参照这个博客:ffmpeg支持,在编译完第三方库之后,需要重新编译opencv库!

这里注意的一点是,添加完第三方库的编译,我们需要将编译好的第三方库的动态连接库文件拷贝到交叉编译工具链的库文件搜索目录,否则编译opencv程序的时候会出现找不到jpeg、tiff库函数的错误。

交叉工具链的具体目录为:{你的安装路径}/arm-xilinx-linux-gnueabi/libc/lib

然后再将这些第三方库文件拷贝到原来的zed-lib-opencv目录下。

然后上电测试opencv程序,运行完全正常!







你可能感兴趣的:(zedboard开发板上一步步移植opencv)