欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

Zedboard学习(八):zedboard移植opencv

发布时间:2025/3/21 44 豆豆
生活随笔 收集整理的这篇文章主要介绍了 Zedboard学习(八):zedboard移植opencv 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

准备工作

  • opencv源码包下载:http://pan.baidu.com/s/1qXTKIdQ(opencv-2.4.9),后面我们要在虚拟机中编译;
  • 搭建好zedboard在Linux下的交叉编译环境,以前的博客有介绍(Zedboard学习(二):zedboard的Linux下交叉编译环境搭建)。
  • zedboard官方SD卡启动文件,把这些文件放到sd卡中即可。
  • 由于zedboard上运行的是嵌入式linux,处理器是arm9,与pc的不同,代码必须要经过交叉编译工具编译后才可以执行。
    注意:官方给出的这个版本是不带图形界面的,桌面版本的Linux我们可以自己使用虚拟机制作。(Zedboard学习(一):移植Ubuntu桌面操作系统)

    移植

    首先要说明的是,往zedboard上移植opencv跟我们平时在pc上安装opencv的过程不同。毕竟zedboard是嵌入式平台很多东西都要删减,而且zedboard官方移植的linux不带图形界面,我们要自己在命令行下配置环境。
    为了防止权限冲突,建议在root权限下操作,不在root权限下可能会报错。

    1、先新建一个文件夹,存放所有文件:

    mkdir opencv_zed cd opencv_zed

    2、下载的源码是opencv2.4.9.tar.gz,将其从windows下拷贝到虚拟机中(Ubuntu14.04下FTP服务器的搭建配置):

    拷贝到之前建立的opencv_zed目录中,输入指令:

    tar -zxvf opencv-2.4.9.tar.gz

    3、在opencv-2.4.9中新建install和build文件夹,并创建toolchain.cmake文件。

    cd opencv-2.4.9/ mkdir build mkdir install touch toolchain.cmake gedit toolchain.cmake

    复制如下内容到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++)

    这类指定了cmake的处理器信息还有交叉编译工具等。

    4、进入build文件夹,关联toolchain.cmake 并配置OpenCV的安装目录:

    cmake -D CMAKE_TOOLCHAIN_FILE=toolchain.cmake -D CMAKE_INSTALL_PREFIX=/home/xhb/Study/OpenCV/opencv_zed/opencv-2.4.9/install ../

    CMAKE_INSTALL_PREFIX为安装目录,这个要根据自己的目录的路径更改。

    5、生成Makefile文件。
    如果没有安装要先安装cmake-curses-gui:

    sudo apt-get install cmake-curses-gui

    输入指令,配置cmake:

    ccmake ./

    配置时我们只需要把所有with开头的都选为OFF(除了WITH_V4L为ON,这个指的是linux的v4l(video for linux)组件);
    c键,是configure,保存配置;q键,退出;操作不做赘述,都有说明。

    6、编译安装:

    make -j4 make install

    最后会在之前建立的install文件夹下生成zedboard上的opencv库。

    7、制作opencv镜像:
    进入到最初建立的目录下,我们要在这个目录下生成镜像:

    cd /home/xhb/Study/OpenCV/opencv_zed

    镜像的名字是opencv_lib.img,其大小为80M:

    dd if=/dev/zero of=opencv_lib.img bs=1M count=80

    将镜像格式化为ext2格式:

    mkfs.ext2 -F opencv_lib.img

    增加写权限:

    chmod go+w opencv_lib.img

    挂载这个镜像,需要使用管理员权限:

    sudo mount opencv_lib.img -o loop /mnt

    拷贝编译生成的opencv库到挂载的镜像中,路径要根据自己的来修改:

    sudo cp -rf /home/xhb/Study/OpenCV/opencv_zed/opencv-2.4.9/install/* /mnt

    去掉写权限:

    sudo chmod go-w opencv_lib.img

    取消挂载:

    sudo umount /mnt

    这个镜像文件已经制作好了,后面直接使用。

    8、编写测试程序并编译:
    测试源码为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 imagesIplImage* 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; }

    对它进行交叉编译:

    arm-xilinx-linux-gnueabi-g++ -I /home/xhb/Study/OpenCV/opencv_zed/opencv-2.4.9/install/include -I /home/xhb/Study/OpenCV/opencv_zed/opencv-2.4.9/install/include/opencv -L /home/xhb/Study/OpenCV/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

    由于没有配置默认的opencv环境变量,所以我们编译时手动指定了用到的库。
    由于只是测试,不做其他配置,那些一大串的路径根据自己的路径更改。

    编译后会产生edge_detection.o文件。
    现在我们的目录下应该有这几个文件:

    9、把edge_detection.o、opencv_lib.img、以及lena.bmp(随便下张图片都行)拷贝到u盘中。

    为了方便管理我新建了一个文件夹存放这些文件,只要找得到就行。

    10、将官方的sd卡启动文件拷贝到sd卡中,zedboard从sd卡启动。
    u盘通过USB转OTG线连接到zedboard上;
    从设备管理器中找到串口端口号;
    使用putty连接zedboard,串口波特率是115200;

    启动zedboard,等待一下,命令行出现:

    输入指令:

    fdisk -l


    我们从中可以看到有两个设备,3980MB的是我们的sd卡,1967MB的就是U盘了。
    下面可以找到它的设备号为/dev/sda4。

    挂载u盘:

    mount /dev/sda4 /mnt

    先找到我们存放镜像的目录:

    把生成的opencv镜像文件挂载到/usr/lib文件夹中:

    cd /usr mkdir lib mount /mnt/zed_opencv_test/opencv_lib.img /usr/lib

    运行可执行文件,读入lena.bmp,进行边缘检测,输出到out.bmp。

    ./edge_detection.o lena.bmp out.bmp

    运行成功。

    由于没有图形界面,我们把u盘拔出,到电脑里看下out.bmp。

    移植成功!

    总结

    以上是生活随笔为你收集整理的Zedboard学习(八):zedboard移植opencv的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。