前面我们已经基本了解了什么是openCV,这一片我们首先明确,移植OpenCV到ZedBoard上需要两大过程。
1、opencv在ubuntu上的安装与测试 2、opencv在zedboard上的移植与测试
我们直接说第二步,第一步网上有许多教程。
我们首先要明确:移植opencv需要在交叉编译环境已经搭建好的基础下进行。
我们都知道pc的可执行程序不能直接在arm板卡上运行,pc机与arm采用的就体系结构不同,两个可以执行的二进制代码不一样,要是使用还是有办法的,那就是交叉编译,交叉编译的目的就是在主机上生成目标机(zedboard)能执行的文件。其实zedboard已经将交叉编译的文件给我们了,只需要执行几个简单的指令就可以了。
用 ./xilinx-2011.09-50-arm-xilinx-linux-gnueabi.bin 安装文件会出现错误,
在终端里输入如下命令 dpkg-reconfigure dash,并且在弹出的对话框里选择 <否>即可
可以安装的时候,就一路默认
这个时候你就可以找到类似于gcc一样的交叉编译工具了
在ubuntu中,环境变量的文件是 /etc/bash.bashrc,修改这个文件就行了(命令vim /etc/bash.bashrc),增加的内容是
export ARCH=arm
export CROSS_COMPILE=arm-xilinx-linux-gnueabi-
export PATH=/root/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/bin/:$PATH
此时保存文件,并且关闭终端,重新打开一个终端 输入arm-xilinx 按几下tab键是不是显示出来了可爱的交叉编译链。到此说明交叉编译链安装完成
交叉编译链安装成功了,就可以交叉编译c文件了,进入到/opt/zedboard/code/文件夹下面,使用arm-xilinx-linux-gnueabi-gcc helloworld.c -o helloworld_zed,来生成在zed板卡上能执行的文件。
到这里我们只是安装好了交叉编译链,接下来就让我们把OpenCV移植过来吧。
进入opencv3.1.0目录, 新建一个build和install目录,并且新建一个toolchain.cmake文件,输入:
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++)
进入build目录,输入
cmake -D CMAKE_TOOLCHAIN_FILE=toolchain.cmake -D
CMAKE_INSTALL_PREFIX=/opt/zedboard/opencv_zed/opencv-3.1.0/install ../
接着进行ccmake ./ 配置,配置的内容与pc机上有很大区别,将所有WITH开头的选项选成OFF(除了WITH_V4L为ON)因为这些需要第三方库支持的,要是选择这些的话就需要安装第三方库了。
按 c 键配置 按g键生成并保存
开始进行 make 编译 然后make install 安装。
安装完成后在install的文件夹里就是运行库啦。
zedboard板子装的linux系统一般是官方给的OOB安装包,实际上是ramdisk镜像,一个非常简易的linux操作系统,
最大只能有8M。我们在测试的过程中
要可执行文件与opencv的动态库拷贝到sd卡,或u盘,而库文件会大于8M,所以需要
将opencv链接库文件压缩为一个镜像文件。测试代码我们采用陆佳华书上的edge_detection.cpp进行交叉编译:输入
arm-xilinx-linux-gnueabi-g++ -I /opt/zedboard/opencv_zed/opencv-3.1.0/install/include -I/opt/zedboard/opencv_zed/opencv-3.1.0/install/include/opencv -L/opt/zedboard/opencv_zed/opencv-3.1.0/install/lib -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_ml -lopencv_video -lopencv_features2d -lopencv_calib3d -lopencv_objdetect -lopencv_contrib -lopencv_legacy -lopencv_flann ./edge_detection.cpp -o ./edge_detection.o
最后我们将 edge_detection.o、 cv_lib.img 、lena.bmp拷贝到sd卡或者u盘里,然后开始测试。
使用U盘启动
启动好zedboard后,cd /dev ;ls 下, 看dev文件里是否多出sda,sda(1,2,3,4)设备文件。 下面将u盘进行挂载
mount /dev/sda(1,2,3,4) /mnt
cd /usr
mkdir lib
再将库文件挂载到/usr/lib下, mount /mnt/cv_lib.img /usr/lib
查看 /usr/lib 是否多出一些库, 如没有,多试几次上面的命令
下面开始执行,进入到/mnt目录下:
./edge_detection.o lena.bmp lena_edge.bmp
如果出现successful 就说明编译成功,边缘图像生成。
参考资料:
http://blog.csdn.net/sanwandoujiang/article/details/39338725
这里有一种使用SD卡启动的示例:
http://blog.chinaaet.com/Esion/p/44410