我使用的是ubuntu12.04
一:建立交叉编译环境的建立
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查看设置是否成功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 ./
特别注意 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里就会发现库库文件
然后执行
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
#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;
}