因为很久之前写的,不记得参考了哪些文献,如果涉及到版权问题,请联系本人
1、安装cmake
sudo apt-get install cmake-gui
将opencv2.3.1源码拷贝到/root文件夹下重命名为 OpenCV-2.3.1-arm(为了防止和pc版本的opencv重复),新建文件夹为OpenCV-2.3.1-arm-build
在命令行下执行cmake-gui
选择源代码目录/root/OpenCV-2.3.1-arm
选择Build目录:/root/ OpenCV-2.3.1-arm-build
点击Configure,保持generator为UnixMakefiles,选择Specify optionsfor cross-compiling,点击Next,
Operating System填写arm-linux
C Compilers选择 /opt/opt/FriendlyARM/toolschain/4.5.1/bin/arm-linux-gcc
C++ Compilers选择 /opt/opt/FriendlyARM/toolschain/4.5.1//bin/arm-linux-g++
程序库的TargetRoot选择 /opt/opt/FriendlyARM/toolschain/4.5.1
然后点击Finish。
在/usr/local目录下新建文件夹opencv-arm
修改红色界面下CMAKE_INSTALL_PREFIX为/usr/local/opencv-arm,原默认安装目录为/usr/local,先点一下左下角的configure,然后再点generate.生成Makefile。
到这里,cmake的工作做完了。
在命令行下进入/root/ OpenCV-2.3.1-arm-build执行
#make
但是,肯定会出错。
必然会遇到的错误如下:
/home/yr/OpenCV-2.3.1/modules/flann/include/opencv2/flann/dist.h:In function 'T cvflann::abs(T) [with T = long double]':
/home/yr/OpenCV-2.3.1/modules/flann/include/opencv2/flann/dist.h:63:error: 'fabsl' was not declared in this scope
make[2]: ***[modules/flann/CMakeFiles/opencv_flann_pch_dephelp.dir/opencv_flann_pch_dephelp.obj]Error 1
make[1]: *** [modules/flann/CMakeFiles/opencv_flann_pch_dephelp.dir/all] Error2
make: *** [all] Error 2
解决方法:
修改OpenCV-2.3.1-arm/modules/flann/include/opencv2/flann/dist.h文件第63行的源码:{return fabsl(x); }改为{ return fabs(x);}
其实就是删了个l这个字母。
然后再
make
当然,还有非常大概率遇到一下错误:
Linking CXXexecutable ../../bin/opencv_test_calib3d
../../lib/libopencv_core.so: undefined reference to `pthread_key_create'
../../lib/libopencv_core.so: undefined reference to `pthread_getspecific'
../../lib/libopencv_ts.so: undefined reference to `pthread_key_delete'
../../lib/libopencv_core.so: undefined reference to `pthread_once'
../../lib/libopencv_core.so: undefined reference to `clock_gettime'
../../lib/libopencv_core.so: undefined reference to `pthread_setspecific'
collect2: ld returned 1 exit status
make[2]: *** [bin/opencv_test_calib3d] Error 1
make[1]: *** [modules/calib3d/CMakeFiles/opencv_test_calib3d.dir/all] Error 2
make: *** [all] Error 2
解决方法:
修改opencv_arm目录下的CMakeCache.txt,CMAKE_EXE_LINKER_FLAGS原来为空,加上-lpthread-lrt,如下图:
注意:每次错误产生,经修改后,只要再次执行make命令就接着编译,
编译成功后,执行
sudo make intall
就会安装opencv。
将opencv安装到
/usr/local/opencv-arm 这个位置。
将/usr/local/opencv-arm/include文件夹下的所有内容拷贝到/opt/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/include下
将/usr/local/opencv-arm/lib文件夹下所有内容拷贝到/opt/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/lib下
将/usr/local/lib/pkgconfig文件夹内的opencv.pc复制一份重命名为opencv-arm将其中内容修改为:
第三行:prefix=/usr/local/opencv-arm
倒数第二行末添加 -lpthread -lrt
添加QT-ARM的环境配置
1 sudo gedit /opt/Qt4.7/mkspecs/default /qmake.conf
2 在文件末尾添加:
INCLUDEPATH += /usr/local/opencv-arm/include/opencv
LIBS +=/usr/local/opencv-arm/lib/libopencv_calib3d.so \
/usr/local/opencv-arm/lib/libopencv_contrib.so\
/usr/local/opencv-arm/lib/libopencv_core.so \
/usr/local/opencv-arm/lib/libopencv_features2d.so\
/usr/local/opencv-arm/lib/libopencv_flann.so \
/usr/local/opencv-arm/lib/libopencv_gpu.so \
/usr/local/opencv-arm/lib/libopencv_highgui.so \
/usr/local/opencv-arm/lib/libopencv_imgproc.so \
/usr/local/opencv-arm/lib/libopencv_legacy.so \
/usr/local/opencv-arm/lib/libopencv_ml.so \
/usr/local/opencv-arm/lib/libopencv_objdetect.so \
/usr/local/opencv-arm/lib/libopencv_ts.so \
/usr/local/opencv-arm/lib/libopencv_video.so:
添加后就可以直接利用makefile交叉编译整个工程
步骤为:进入工程所在文件夹
make clean ,删除.pro 和makeifle.
qmake -project
qmake xxx.pro
/opt/Qt4.7/bin/qmake
export PATH=/opt/FriendlyARM/toolchain/4.5.1/bin:$PATH
make
将可执行文件复制到/www目录下,用命令ldd 文件名来查看动态链接库是否能找到
单文件命令行交叉编译
拷贝交叉编译过的opencv的lib文件夹下的所有文件到开发板根目录的lib文件夹和
cp /sdcard/lib/* /lib
cp / sdcard/lib/* /usr/local/opencv-arm/lib/
(因为在opencv交叉编译工具链里设置了默认链接库带有opencv所以在用此工具连交叉编译出的程序即使不需要opencv可能也要此步,解决方案为:去除交叉编译工具链中的默认opencv库的设置,然后每次编译opencv程序时在.pro文件中手工添加,因为我懒,所以直接把所有的opencv库放在板子里一劳永逸,如果不开发opencv程序可以不做此步)
编辑test.cpp为
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
int main()
{
CvCapture* capture = NULL;
IplImage* frame = NULL;
if(!(capture = cvCaptureFromCAM(-1)))
{
fprintf(stderr, "Can not open camera./n");
return -1;
}
cvNamedWindow("video", 1);
while(frame = cvQueryFrame( capture ) )
{
cvShowImage("video", frame);
}
cvDestroyWindow("video");
cvReleaseCapture(&capture);
return0;
}
进入其所在目录,执行命令 arm-linux-gcc`pkg-config --cflags --libs opencv-arm` -Wno-psabi test.cpp -o test 生成可执行文件