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

2019-07-13 03:32发布

首先本文主要内容是将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/cchmod +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的镜像,具体可以根据实际链接库总的大小来设置countmkfs.ext2 -F cv_lib.imgchmod go+w cv_lib.imgmount cv_lib.img -o loop /mntcp /opt/zedboard/opencv_zed/opencv-2.4.9/install/* /mntchmod go-w cv_lib.imgumount /mnt我们会发现多出一个cv_lib.img文件,这是需要拷贝到zedboard上的库文件。测试代码我们采用陆佳华书上的edge_detection.cpp/*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 "); 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 "); // 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 /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 /mntcd /usrmkdir lib再将库文件挂载到/usr/lib下, mount /mnt/cv_lib.img /usr/lib查看 /usr/lib 是否多出一些库, 如没有,多试几次上面的命令 下面开始执行,进入到/mnt目录下: ./edge_detection.o lena.bmp lena_edge.bmp如果出现successful 就说明编译成功,边缘图像生成了。