zedboard---opencv移植与测试(一)

    首先本文主要内容是将opencv移植到zedboard的嵌入式linux中,并进行测试。写本文之前参考了xzyfeixiang,懒兔子,超群天晴,rainysky的博客与陆佳华的<嵌入式系统软硬件协同设计>,把我遇到的问题总结下。我的开发平台式win7+虚拟机VMare(安装ubuntu)。
本文主要分两个部分:1 opencv在ubuntu上的安装与测试 2 opencv在zedboard上的移植与测试

(一) opencv在ubuntu上安装与测试
 1 下载源码, 可以去opencv官网下载,因为我们在ubuntu上安装,要特别主要下载unix平台的,现在为止最新版本是opencv2.4.9
参考地址:http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/2.4.9/opencv-2.4.9.zip/download
2  安装第三方库,
    sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg62-dev   libtiff4-dev  libswscale-dev libjasper-dev cmake  cmake-curses-gui
这个一定要提前安装好,我出现过的一个编译错误就是:     OpenCV Error: Unspecified error (The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Carbon support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script) in cvNamedWindow, file /home/aborn/software/OpenCV-2.4.1/modules/highgui/src/window.cpp, line 598terminate called after throwing an instance of 'cv::Exception'
        what():  /home/aborn/software/OpenCV-2.4.1/modules/highgui/src/window.cpp:598: error: (-2) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Carbon support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function cvNamedWindow

查询网站后需要安装gtk 但是我安装了后问题没有解决,后来明白了,第三方库一定要在配置opencv前安装好,这个问题困扰了我很久,希望大家能够引以为戒。

3   将源文件opencv2.4.9.zip拷贝到/opt/zedboard/opencv_pc(自建的目录,也可以其他的地方,但后续目录相应改变), 解压 unzip opencv2.4.9.zip;     解压后多出一个目录,进入opencv2.4.9目录 ,  mkdir build 进入build目录;执行命令.注 本文一些命令需要root账号命令,所以先进入root账号,在进行命令操作
   cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local    ../     注意../一定不要丢了,因为他需要CMakeList.txt文件,在上一层目录下。/usr/local是安装目录。
4  ls一下, 发现build目录多了一些文件,执行ccmake ./ 进行opencv配置,
这里要千万注意注意:
书上要把一些需要第三方支持的库设置位OFF,之前安装的一些就是第三方的库,疑问:??如果要显示图像WITH_GTK,关掉就算你按照了gtk的库也是没用的。
这次只把WITH_1394,WITH_CUDA,WITH_EIGEN,WITH_FFMPEG设为OFF, 其它都没变。 按 c 键进行配置,g键产生Makefile


5   make      这个过程会久一点 大约20多分钟
6  make install 安装完成后, 可以在 /usr/local/lib目录下看看这些链接库,
7  配置。  
  vim /etc/ld.so.conf.d/opencv.conf   添加/usr/local/lib,退出保存
  sudo ldconfig

vim /etc/bash.bashrc,在末尾添加
          PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
          export PKG_CONFIG_PATH
保存,重启终端

8  测试
cd /opt/zedboard/opencv_pc/opencv2.4.9/samples/c
chmod +x build_all.sh
./build_all.sh
./facedetect baboon.jpg


(二) opencv在zedboard的移植与测试


1    将opencv2.4.9.zip拷贝到/opt/zedboard/opencv_zed(自建目录),解压,
2  ubuntu系统已经做好交叉编译环境(如没有可以参考以上我提到的博客名字)
3  进入opencv2.4.9目录, 新建一个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-2.4.9/install   ../
4 接着进行ccmake ./ 配置,配置的内容与pc机上有很大区别,将所有WITH开头的选项选成OFF(除了WITH_V4L为ON)
因为这些需要第三方库支持的,要是选择这些的话就需要安装第三方库了。
按 c 键配置   按g键生成并保存
5  开始进行 make 编译  然后make install 安装。安装完成后在install的文件夹里就是运行库啦
6 测试:
我zedboard板子装的linux系统是官方给的OOB安装包,实际上是ramdisk镜像,一个非常简易的linux操作系统,最大只能有8M。我们在测试的过程中要可执行文件与opencv的动态库拷贝到sd卡,或u盘,而库文件会大于8M,所以需要将opencv链接库文件压缩为一个镜像文件。
制作镜像文件的方法:
cd   /opt/zedboard/opencv_zed/

dd if=/dev/zero of=qt_lib.img bs=1M count=80//这里的count与bs组合起来表示制作80M的镜像,具体可以根据实际链接库总的大小来设置count

mkfs.ext2 -F cv_lib.img

chmod go+w cv_lib.img

mount cv_lib.img -o loop /mnt

cp /opt/zedboard/opencv_zed/opencv-2.4.9/install/* /mnt
chmod go-w cv_lib.img
umount /mnt
我们会发现多出一个cv_lib.img文件,这是需要拷贝到zedboard上的库文件。
测试代码我们采用陆佳华书上的edge_detection.cpp
<span style="font-size:18px;">/*code*/
#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;
}</span>


进行交叉编译:
输入
arm-xilinx-linux-gnueabi-g++  -I /opt/zedboard/opencv_zed/opencv-2.4.9/install/include  -I/opt/zedboard/opencv_zed/opencv-2.4.9/install/include/opencv -L/opt/zedboard/opencv_zed/opencv-2.4.9/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盘里,然后开始测试啦。
8 我使用的是u盘启动
启动好zedboard后,cd /dev     ;ls 下, 看dev文件里是否多出sda,sda(1,2,3,4)我的是sda4,设备文件。 下面将u盘进行挂载
mount /dev/sda4  /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 就说明编译成功,边缘图像生成了。





  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值