OpenCV编译
本文的前提是zynq交叉编译环境设置
- 下载opencv3.1.0源码,并解压
wget https://github.com/Itseez/opencv/archive/3.1.0.zip
- 在解压后的目录下新建两个目录:install,build,并新建
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++)
- 进入
bulid目录
进行命令配置,关联toolchain.cmake
文件并配置移植OpenCV的安装目录:
cmake -D CMAKE_TOOLCHAIN_FILE=toolchain.cmake -D CMAKE_INSTALL_PREFIX=/home/ubuntu/opencv-2.3.1/install ../
注意此处应该更换为自己的实际目录名称。
- 生成Makefile文件
执行ccmake ./
进行OpenCV配置,将所有WITH开头的选项选成OFF(除了WITH_V4L为ON);按c键进行配置,g键产生Makefile
- 编译安装
通过make
编译,make install
进行安装;安装结束后Zedboard上的OpenCV库已经生成,在install
文件夹下。
OpenCV库移植
依次执行下面的命令,可以在指定的目录下生成opencv_lib.img
镜像文件,该文件可以在Zedboard上加载使用
cd /home/ubuntu/opencv_zynq/
// 生成镜像的目录
dd if=/dev/zero of=opencv_lib.img bs=1M count=80
// 镜像的名字opencv_lib.img和大小80M,可以根据实际链接库的大小进行设置
mkfs.ext2 -F opencv_lib.img
chmod go+w opencv_lib.img
mount opencv_lib.img -o loop /mnt
cp /home/ubuntu/opencv3.1.0/install/* /mnt
// 复制相应的库的即将压缩的镜像中
chmod go-w opencv_lib.img
umount /mnt
移植测试
测试代码,imgshow.cpp:
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
int main()
{
Mat img = imread("test.jpg");
// 创建一个名为 "Pic"窗口
namedWindow("Pic");
// 在窗口中显示图片
imshow("Pic", img);
// 等待6000 ms后窗口自动关闭
waitKey(6000);
}
makefile:
LINK_C = imgshow.cpp
LINK_H = -I /opt/opencv-3.1/include/opencv -I /opt/opencv-3.1/include -I /opt/opencv-3.1/include/opencv2
LINK_LIB = -L /opt/opencv-3.1/lib
target:
arm-xilinx-linux-gnueabi-g++ -O2 -I./ -o imgshow_arm $(LINK_C) -Wall -lm -lopencv_core -lopencv_highgui -lopencv_imgproc -lopencv_imgcodecs $(LINK_H) $(LINK_LIB)
#finished make imgshow_arm
编译后生成imgshow_arm.o
将OpenCV库文件opencv_lib.img
、可执行文件edge_detection.o
和原图像放入U盘中,启动Zedboard,挂载U盘:
mount /dev/sda1 /mnt
将镜像文件opencv_lib.img
挂载到/usr/lib
文件夹中:
cd /usr
mkdir lib
mount /mnt/opencv_lib.img /usr/lib
运行可执行文件./imgshow_arm.o