rainysky陪你一起在zedboard上移植qt+opencv(六):在zedboard上运行Opencv

和在pc机上一样,建立 文件夹/opt/zedboard/opencv_zed,复制文件进来,解压缩:建立两个文件夹 build、 install,如下图

在这里和pc不太一样了,需要设置编译环境,在opencv-2.4.4下面新建一个文件,文件名为toolchain.cmake,里面的内容为:
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(CMAKE_C_COMPILER /root/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/bin/arm-xilinx-linux-gnueabi-gcc)
set(CMAKE_CXX_COMPILER /root/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/bin/arm-xilinx-linux-gnueabi-g++)

进入build文件里面,输入一下命令进行配置:cmake -D CMAKE_TOOLCHAIN_FILE=toolchain.cmake -D CMAKE_INSTALL_PREFIX=/opt/zedboard/opencv_zed/opencv-2.4.4/install ../

其中CMAKE_INSTALL_PREFIX,代表的是安装的路径,最好是新建一个新文件夹好保存,另外需要注意的是,最后的是 ../ 小心不要少敲一个点,否则会错的哦。

ccmake ./ 进行配置,配置的内容是所有的以WITH开头的选项全部选成OFF,(除了WITH_V4L 选为ON)因为这些需要第三方库支持的,要是选择这些的话就需要安装第三方库了。

按c配置,按g生成并保存

配置完成后就输入make开始编译,编译完成后就是make install安装啦。安装完成后在install的文件夹里就是运行库啦。
新建一个专门写程序的文件夹 mkdir /opt/zedboard/opencv_zed/code
在里面新建一个测试程序:
vim 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\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;
}
复制一个lena图像进来,最好是一个.jpg格式和一个.bmp格式(作对比),并输入下面的命令进行交叉编译
arm-xilinx-linux-gnueabi-g++ -I /opt/zedboard/opencv_zed/opencv-2.4.4/install/include -I/opt/zedboard/opencv_zed/opencv-2.4.4/install/include/opencv -L/opt/zedboard/opencv_zed/opencv-2.4.4/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

如果要是想在zedboard板卡上面运行,还需要将opencv交叉编译运行的库复制到板卡里面,和qt一样,需要制作镜像,opencv的话只需要将lib这个文件里面的内容做成镜像就可以了(如果用这个镜像运行的话,会出现一个问题,就是在运行的时候找不到stdc++.so这个库,因此需要先将这个库copy到/opt/zedboard/opencv_zed/opencv-2.4.4/install/lib,源文件在交叉编译器里面,总的命令为:

cp /root/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/arm-xilinx-linux-gnueabi/libc/usr/lib/libstdc++.so* /opt/zedboard/opencv_zed/opencv-2.4.4/install/lib)。挂载到zedboard的/usr/lib 这个文件夹下面即可运行了:

制作镜像过程:


至此就将opencv的库移植好了,只需要挂载到板卡里面就OK啦

来源:rainysky的博客