在zedboard上移植opencv

我使用的是ubuntu12.04

一:建立交叉编译环境的建立

    首先我所有的操作都是在系统模式下 
   su 
  你的密码
  1. apt-get update
     apt-get upgrade
      (应该不能少,少了之后安装32库会失败,因为 Sourcery CodeBench 是为32位系统 设计的,64位系统用户要安装32位库 )

   2.
     apt-get install ia32-libs ia32-libs-gtk
      安装32位库,遗憾的是ubuntu13.10版本以后不能用这个命令,因为没有ia32-libs,32位的库又不同的名字
  3.
   dpkg-reconfigure dash
    在弹出的对话框中选no,把dash改为bash
 4.
我是把《软硬件协同设计》那本书光盘中的 xilinx-2011.09-50-arm-xilinx-linux-gnueabi.bin 拷过来,也可以在http://wiki.xilinx.com/zynq-tools中下载
       在xilinx-2011.09-50-arm-xilinx-linux-gnueabi.bin文件同目录里执行./xilinx-2011.09-50-arm-xilinx-linux-gnueabi.bin,我选择的执行路径/opt/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/bin/
 5.
      /etc/bash.bashrc最后加入环境变量,也有说在etc/profile文件最后加环境变量,具体区别请参考点击打开链接,我是在bash.bashrc里添加的

export ARCH=arm

      export PATH=/opt/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/bin:$PATH

(一定是小写的for并不是每个首字母都大写,我第一次就是把for的首字母写成了大写,所以不成功的)

export CROSS_COMPILE=arm-xilinx-linux-gnueabi-

         然后 运行 source /etc/bash.bashrc 指令使设置立即生效,可以用echo $PATH查看设置是否成功
6.  

arm-xilinx-linux-gnueabi-gcc -v如果能打印出信息版本则交叉编译环境设置成功

二:opencv的移植

1.下载cmake 

   apt-get install cmake-curses-gui

   我觉得cmake-curses-gui就够了,不需要cmake-gui啥了

2.下载源码,我是直接在书后光盘里复制的

   官网:http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/

   解压,我是直接在文件系统里建立文件夹zynq/Opencv-2.3.1在此目录下解压,要在源码路径下建两个文件夹 build和install

          
tar -xvjf Opencv-2.3.1.tar.bz2 
       cd OpenCV-2.3.1
       mkdir build
       cd build
       

 在当前目录下新建toolchain.cmake文档,内容如下:

      ###########user defined#############

      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++ )

      ###########user defined#############

      set( CMAKE_FIND_ROOT_PATH "/zynq/Opencv-2.3.1/opencvlib" )//在当前目录下 cd ../../ mkdir opencvlib

      set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER )

      set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )

      set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )

      ######################################

      注意:最后的四行是用于交叉编译情况下依赖库查找路径以及查找模式的,它对于cmake能否找到依赖库来说非常重要

然后进行cmake的配置

 cmake -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake ../

ccmake ./

在zedboard上移植opencv_第1张图片

在zedboard上移植opencv_第2张图片

特别注意 LIBRARY_OUTPUT_PATH              /zynq/Opencv-2.3.1/opencvlib  ,不能是默认的usr/local/lib因为如果没有修改,选择默认将来编译后生成 的库是x86的不是arm的,不能用arm-xilinx-linux-gnueabi-g++编译,正如某大神所说【一般做嵌入式开发都会单独维护一个交叉编译的环境与库用来区别本地库】

所有的WITH开头的都要设置为OFF,如果没有第三方库的话

3.先在build文件夹下执行命令

make

make过后在

/zynq/Opencv-2.3.1/opencvlib里就会发现库库文件

在zedboard上移植opencv_第3张图片


然后执行

cmake -D CMAKE_INSTALL_PREFIX=/zynq/Opencv-2.3.1/OpenCV-2.3.1/install
make install
然后发现在install文件夹下也有一个库
在这两个库中都执行

发现都是arm的库,可以执行其他的.so.2.3.1文件试试,都是arm的

4.

arm-xilinx-linux-gnueabi-g++  -I /zynq/Opencv-2.3.1/OpenCV-2.3.1/install/include  -I/zynq/Opencv-2.3.1/OpenCV-2.3.1/install/include/opencv-L/zynq/Opencv-2.3.1/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

红体部分可以写-L/zynq/Opencv-2.3.1/OpenCV-2.3.1/install/lib也可以写/zynq/Opencv-2.3.1/opencvlib都对
我是在源码目录下建立code文件夹,然后 
vim 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;
}
编译成功后会出现edge_detection.o
参考博文:
懒兔子大神的交叉编译环境建立:http://www.eefocus.com/nightseas/blog/12-10/287208_5ceaa.html
 南邮-小辉辉的博文  http://blog.163.com/thinki_cao/blog/static/8394487520134209235258


    

你可能感兴趣的:(opencv,Embedded,System,环境变变量,zedboard,依赖库,opencv,嵌入式开发,交叉编译)