Zedboard安装与移植OpenCV

转自http://blog.csdn.net/brilliantdo/article/details/51417798

参照《嵌入式系统软硬件协同设计实战指南》这本书第十三章13.5 OpenCV移植与sanwan的一篇博客中的相关内容;

主要分为两个大部分,OpenCV在PC Ubuntu上的安装OpenCV在Zedboard上的移植

一、OpenCV在PC Ubuntu上的安装

采用的是Ubuntu 14.04系统,在OpenCV官网下载的源码版本为2.3.1,下载地址

https://sourceforge.net/projects/opencvlibrary/files/opencv-unix/2.3.1/

1. 安装第三方库

获取su权限进行操作。安装第三方库,命令如下:

apt-get install build-essential
apt-get install cmake cmake-gui
apt-get install libgtk2.0-dev
apt-get install libavcodec-dev libavformat-dev libswscale-dev
apt-get install libdc1394-22-dev
apt-get install libjpeg-dev libpng-dev libtiff-dev libjasper-dev
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2. 新建安装文件夹

将OpenCV解压到自建目录/home/linux/OpenCV-2.3.1下,新建目标build。这是个临时文件夹,安装完成后可以删除。

进入build目录。进行命令配置:

mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ../
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

在这里设置了安装目录为/usr/local(其实也是默认的安装路径,当然可以修改为自定义路径),命令完成后build目录下多了一些文件,可以通过ls命令进行查看。

3. OpenCV安装配置

执行ccmake ./进行OpenCV配置,把WITH_1394WITH_CUDAWITH_FFMPEG设置为OFF,其他不变;

按c键进行配置,g键产生Makefile

4. 进行编译和安装:

这个过程时间比较长,make比较占时间。

make
sudo make install
  • 1
  • 2
  • 1
  • 2

安装结束后可以在/usr/local/lib目录下看到OpenCV的链接库。

5. 配置系统变量

vi /etc/ld.so.conf.d/opencv.conf
  • 1
  • 1

添加/usr/local/lib,保存并退出,进行配置:

sudo ldconfig
  • 1
  • 1

打开并修改bash.bashrc文件:

vi /etc/bash.bashrc
  • 1
  • 1

在末尾添加如下两行:

PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH
  • 1
  • 2
  • 1
  • 2

保存并重启终端。

6. 测试OpenCV的效果

进入OpenCV的解压目录,找到samples文件夹,运行其中的C程序样例进行测试

cd /home/linux/OpenCV-2.3.1/samples/c
chmod +x build_all.sh
./build_all.sh
./facedetect lena.jpg
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

测试效果如图所示:

这里写图片描述


二、OpenCV在Zedboard上的移植

前提是Ubuntu要配置好交叉编译环境,也需要获取su权限

1. 新建安装文件目录

新建文件夹OpenCV_zed,作为OpenCV移植Zedboard的相关文件的配置文件夹;将OpenCV源码解压;

此时的目录/home/linux/OpenCV_zed/OpenCV-2.3.1;

2. 配置安装链

OpenCV-2.3.1文件夹内建立installbuild文件夹,并创建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++)
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

3. OpenCV安装配置

进入bulid文件夹进行命令配置,关联toolchain.cmake文件并配置移植OpenCV的安装目录:

cmake -D CMAKE_TOOLCHAIN_FILE=toolchain.cmake -D CMAKE_INSTALL_PREFIX=/home/linux/OpenCV_zed/OpenCV-2.3.1/install ../
  • 1
  • 1

4. 生成Makefile文件

执行ccmake ./进行OpenCV配置,将所有WITH开头的选项选成OFF(除了WITH_V4L为ON);按c键进行配置,g键产生Makefile

5. 编译安装

通过make编译,make install进行安装;安装结束后Zedboard上的OpenCV库已经生成,在install文件夹下。

6. OpenCV库移植

可以通过将OpenCV运行库压缩到ramdisk镜像中的方法进行移植;不过在这里将OpenCV运行库压缩成镜像,Zedboard上板测试时通过加载镜像的方式使用;下面进行镜像制作:

cd /home/linux/OpenCV_zed/
// 生成镜像的目录
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/linux/OpenCV_zed/OpenCV-2.3.1/install/* /mnt
// 复制相应的库的即将压缩的镜像中
chmod go-w opencv_lib.img
umount /mnt 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

在相应的/home/linux/OpenCV_zed/目录下就会生成opencv_lib.img镜像文件,可以在Zedboard上加载使用。

7. 移植结果测试

测试的源码为陆佳华书上的edge_detection.cpp,如下:

#include "cv.h"
#include "highgui.h"

IplImage* doCanny(
    IplImage* in,
    double lowThresh,
    double highThresh,
    double aperture)
{
    if (in->nChannels != 1)
        return 0;   // Canny only handles gray scale images
    IplImage* out = cvCreateImage( 
        cvGetSize( in ),
        in->depth,  //IPL_DEPTH_8U,    
        1);
    cvCanny( in, out, lowThresh, highThresh, aperture );
    return( out );
};

int main( int argc, char** argv )
{
    if(argc!= 3) printf("arguments error! format origin_image.bmp target_image.bmp\n");
    IplImage* img_rgb = cvLoadImage( argv[1] );
    IplImage* img_gry = cvCreateImage( cvSize( img_rgb->width, img_rgb->height ), img_rgb->depth, 1); 
    cvCvtColor(img_rgb, img_gry ,CV_BGR2GRAY);
    // cvNamedWindow("Example Gray", CV_WINDOW_AUTOSIZE );
    // cvNamedWindow("Example Canny", CV_WINDOW_AUTOSIZE );
    // cvShowImage("Example Gray", img_gry );
    IplImage* img_cny = doCanny( img_gry, 10, 100, 3 );
    if(cvSaveImage(argv[2], img_cny,0) != 0)
        printf("Save Image Successful\n");
    // cvShowImage("Example Canny", img_cny );
    // cvWaitKey(0);
    cvReleaseImage( &img_rgb);
    cvReleaseImage( &img_gry);
    cvReleaseImage( &img_cny);
    // cvDestroyWindow("Example Gray");
    // cvDestroyWindow("Example Canny");
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

edge_detection.cpp进行交叉编译,命令如下:

arm-xilinx-linux-gnueabi-g++ -I /home/linux/OpenCV_zed/OpenCV-2.3.1/install/include -I /home/linux/OpenCV_zed/OpenCV-2.3.1/install/include/opencv -L /home/linux/OpenCV_zed/OpenCV-2.3.1/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
  • 1
  • 1

生成可执行文件edge_detection.o

将OpenCV库文件opencv_lib.img、可执行文件edge_detection.o和原图像lena.bmp放入U盘中,启动Zedboard,挂载U盘:

mount /dev/sda1 /mnt
  • 1
  • 1

将镜像文件opencv_lib.img挂载到/usr/lib文件夹中:

cd /usr
mkdir lib
mount /mnt/opencv_lib.img /usr/lib
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

查看挂载结果,如图所示:

这里写图片描述

运行可执行文件./edge_detection.o lena.bmp out.bmp,如果出现successful则编译成功,如图所示:

这里写图片描述

边缘检测的结果保存在输出图像out.bmp中。

不能挂载U盘的仿zedboard板子(俺的就是),可以采用以下流程

将板子自带的4G的SD卡格式化成fat32格式,将edge_detection.o和lena.bmp(使用jpg格式会出错)以及opencv_lib.img和官网的OOB文件全部拷到SD卡中,将zedboard板跳帽设置成从SD卡启动,上电后挂载SD卡:在超级终端中输入

fdisk -l
可知SD卡为 /dev/mmcblk0p1,然后挂载:
mount /dev/mmcblk0p1 /mnt/
SD卡挂载完成后,进入/mnt可看到SD卡里面的文件,将 opencv_lib.img 挂载到/usr/lib(板子如果没有lib可建立该目录)
mount /mnt/opencv_lib.img /usr/lib
在超级终端中进入SD卡挂载的目录/mnt,然后执行

./edge_detection.o ./lena.bmp ./lena_edge.bmp

即可得到边缘检测后的图片lena_edge.bmp,最后将lena_edge.bmp拷贝到电脑上看效果


你可能感兴趣的:(Zedboard安装与移植OpenCV)