环境:arm开发板是 ok6410,主机是Ubuntu10.04
1,准备工作:交叉编译工具用光盘自带的arm-linux-4.4.1.tar.gz,解压到/usr/local/arm目录下(将/usr/local/arm/bin加入环境变量);下载opencv2.2的源码;安装cmake build-essential;安装必要的库: libgtk2.0-dev libavcodec-dev libavformat-dev libswscale-dev libjpeg62-dev libtiff4-dev libjasper-dev
2,用到的主要目录说明:
交叉编译工具链所在 /usr/local/arm
编译好的opencv库所在 /usr/local/opencv-arm
安装opencv的目录 /usr/local/arm-linux
opencv源码所在 ~/tiaozhansai/OpenCV-2.2.0
3,在终端运行sudo cmake-gui
选择源代码目录:/home/xin/tiaozhansai/OpenCV-2.2.0
选择Build目录:/usr/local/opencv-arm/
点击Configure,保持generator为Unix Makefiles,选择Specify options for cross-compiling,点击Next,
Operating System填写arm-linux
C Compilers填写/usr/local/arm/4.4.1/bin/arm-linux-gcc
C++ Compilers填写/usr/local/arm/4.4.1/bin/arm-linux-g++
程序库的Target Root填写/usr/local/arm/4.4.1/
然后点击Finish。
修改默认配置,默认安装目录为/usr/local,为便于查找生成的库文件,把CMAKE_INSTALL_PREFIX变量改为/usr/local/arm-linux ,点击Generate生成Makefile。
4,在/usr/local/opencv-arm目录下$sudo make
(1),80%报错:
。。。。/home/xin/tiaozhansai/OpenCV-2.2.0/modules/ml/src/gbt.cpp:474: error: 'expl' was not declared in this scope
//#endif
错误消除。
(2),83%报错:
Linking CXX executable ../../bin/opencv_createsamples
../../lib/libopencv_core.so: undefined reference to `clock_gettime'
../../lib/libopencv_highgui.so: undefined reference to `_TIFFerrorHandler'
../../lib/libopencv_highgui.so: undefined reference to `_TIFFrealloc'
../../lib/libopencv_core.so: undefined reference to `pthread_key_create
解决方法:修改CMakeCache.txt,CMAKE_EXE_LINKER_FLAGS原来为空,加上-lpthread -lrt,重新编译,错误消除
(3),83%报错:
Linking CXX executable ../../bin/opencv_createsamples
../../lib/libopencv_highgui.so: undefined reference to `_TIFFerrorHandler'
../../lib/libopencv_highgui.so: undefined reference to `_TIFFrealloc'
../../lib/libopencv_highgui.so: undefined reference to `_TIFFmalloc'
../../lib/libopencv_highgui.so: undefined reference to `_TIFFmemcpy'
../../lib/libopencv_highgui.so: undefined reference to `TIFFOpen'
../../lib/libopencv_highgui.so: undefined reference to `_TIFFfree'
../../lib/libopencv_highgui.so: undefined reference to `_TIFFwarningHandler'
../../lib/libopencv_highgui.so: undefined reference to `_TIFFmemcmp'
../../lib/libopencv_highgui.so: undefined reference to `_TIFFmemset'
解决方法:修改CMakeCache.txt,WITH_TIFF:BOOL=ON,改成OFF(不再对TIFF图像格式支持。这里我前面已经装过libtiff4-dev,但是编译报错,我不明白是为什么),重新编译,错误消除。
(4),96%报错:
CMakeFiles/opencv_test.dir/src/highguitest.obj: In function `CV_HighGuiTest::run(int)':
highguitest.cpp:(.text._ZN14CV_HighGuiTest3runEi+0x18): warning: the use of `tmpnam' is dangerous, better use `mkstemp'
../../lib/libopencv_features2d.so: undefined reference to `cv::SIFT::SIFT(double, bool, bool, int, int, int, int)'
解决方法:在OpenCV2.2.0/modules/features2d/src/sift.cpp下
#ifdef __arm__
#define ARM_NO_SIFT
#endif
注释掉#define ARM_NO_SIFT.错误消除,
成功!
$sudo make install
5,opencv库复制到ok6410,并测试
(1)借用某个博客上的测试程序,来测试编译的是否成功。
新建test.cpp:
// 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);
return 0;
}
编译test.cpp:$ arm-linux-g++ -I/usr/local/arm-linux/include/opencv/ -L/usr/local/arm-linux/lib/ -lcv -lcxcore -lhighgui -lpthread -lrt -o test test.cpp
报错:/usr/local/arm/4.4.1/bin/../lib/gcc/arm-none-linux-gnueabi/4.4.1/../../../../arm-none-linux-gnueabi/bin/ld: cannot find -lcv
google之,发现这个问题是找不到libcv.so这个动态库。
通过find命令发现在/usr/local/arm-linux/lib/下面确实没有这个库,而且这个目录下的库都是libopencv*形式的,我猜测是不是opencv2.2相比2.1作了不少改动,网上调研发现确实时这样的,opencv2.2重新组织库结构,用较详细,更小的模块来取代cxcore, cv, cvaux, highgui 和 ml库.
于是,试着把命令改成:$ arm-linux-g++ -I/usr/local/arm-linux/include/opencv/ -L/usr/local/arm-linux/lib/ -lopencv_core -lopencv_highgui -lpthread -lrt -o test test.cpp
结果还是报上面的错误,这次我注意到它是在。。。/arm-none-linux-gnueabi/。。这个目录下找动态库的,也就是说,尽管我指定了头文件,库文件的搜索路径,但是它没有去我指定的路径下找。于是我把/usr/local/opencv-arm/include/opencv/下的头文件和/usr/local/opencv-arm/lib下的动态库全都拷贝到/usr/local/arm/4.4.1/arm-none-linux-gnueabi下面对应的目录下,然后再编译:
$ arm-linux-g++ -lopencv_core -lopencv_highgui -lpthread -lrt -o test test.cpp
成功!
(2)将库文件s 和 编译好的测试程序test 拷贝到开发板测试
用sd卡拷贝,遇到问题:
cp: cannot create '../../lib/libopencv_calib3d.so': Read-only file system
cp: cannot create '../../lib/libopencv_contrib.so': Read-only file system
cp: cannot create '../../lib/libopencv_core.so': Read-only file system
这个跟cramfs文件系统是只读的文件系统相关,烧写yaffs文件系统即可解决这个问题。
1,准备工作:交叉编译工具用光盘自带的arm-linux-4.4.1.tar.gz,解压到/usr/local/arm目录下(将/usr/local/arm/bin加入环境变量);下载opencv2.2的源码;安装cmake build-essential;安装必要的库: libgtk2.0-dev libavcodec-dev libavformat-dev libswscale-dev libjpeg62-dev libtiff4-dev libjasper-dev
2,用到的主要目录说明:
交叉编译工具链所在 /usr/local/arm
编译好的opencv库所在 /usr/local/opencv-arm
安装opencv的目录 /usr/local/arm-linux
opencv源码所在 ~/tiaozhansai/OpenCV-2.2.0
3,在终端运行sudo cmake-gui
选择源代码目录:/home/xin/tiaozhansai/OpenCV-2.2.0
选择Build目录:/usr/local/opencv-arm/
点击Configure,保持generator为Unix Makefiles,选择Specify options for cross-compiling,点击Next,
Operating System填写arm-linux
C Compilers填写/usr/local/arm/4.4.1/bin/arm-linux-gcc
C++ Compilers填写/usr/local/arm/4.4.1/bin/arm-linux-g++
程序库的Target Root填写/usr/local/arm/4.4.1/
然后点击Finish。
修改默认配置,默认安装目录为/usr/local,为便于查找生成的库文件,把CMAKE_INSTALL_PREFIX变量改为/usr/local/arm-linux ,点击Generate生成Makefile。
4,在/usr/local/opencv-arm目录下$sudo make
(1),80%报错:
。。。。/home/xin/tiaozhansai/OpenCV-2.2.0/modules/ml/src/gbt.cpp:474: error: 'expl' was not declared in this scope
修改gbt.cpp中14行,16行:注释掉
//#if ANDROID
#define expl(x) exp(x)//#endif
错误消除。
(2),83%报错:
Linking CXX executable ../../bin/opencv_createsamples
../../lib/libopencv_core.so: undefined reference to `clock_gettime'
../../lib/libopencv_highgui.so: undefined reference to `_TIFFerrorHandler'
../../lib/libopencv_highgui.so: undefined reference to `_TIFFrealloc'
../../lib/libopencv_core.so: undefined reference to `pthread_key_create
解决方法:修改CMakeCache.txt,CMAKE_EXE_LINKER_FLAGS原来为空,加上-lpthread -lrt,重新编译,错误消除
(3),83%报错:
Linking CXX executable ../../bin/opencv_createsamples
../../lib/libopencv_highgui.so: undefined reference to `_TIFFerrorHandler'
../../lib/libopencv_highgui.so: undefined reference to `_TIFFrealloc'
../../lib/libopencv_highgui.so: undefined reference to `_TIFFmalloc'
../../lib/libopencv_highgui.so: undefined reference to `_TIFFmemcpy'
../../lib/libopencv_highgui.so: undefined reference to `TIFFOpen'
../../lib/libopencv_highgui.so: undefined reference to `_TIFFfree'
../../lib/libopencv_highgui.so: undefined reference to `_TIFFwarningHandler'
../../lib/libopencv_highgui.so: undefined reference to `_TIFFmemcmp'
../../lib/libopencv_highgui.so: undefined reference to `_TIFFmemset'
解决方法:修改CMakeCache.txt,WITH_TIFF:BOOL=ON,改成OFF(不再对TIFF图像格式支持。这里我前面已经装过libtiff4-dev,但是编译报错,我不明白是为什么),重新编译,错误消除。
(4),96%报错:
CMakeFiles/opencv_test.dir/src/highguitest.obj: In function `CV_HighGuiTest::run(int)':
highguitest.cpp:(.text._ZN14CV_HighGuiTest3runEi+0x18): warning: the use of `tmpnam' is dangerous, better use `mkstemp'
../../lib/libopencv_features2d.so: undefined reference to `cv::SIFT::SIFT(double, bool, bool, int, int, int, int)'
解决方法:在OpenCV2.2.0/modules/features2d/src/sift.cpp下
#ifdef __arm__
#define ARM_NO_SIFT
#endif
注释掉#define ARM_NO_SIFT.错误消除,
成功!
$sudo make install
5,opencv库复制到ok6410,并测试
(1)借用某个博客上的测试程序,来测试编译的是否成功。
新建test.cpp:
// 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);
return 0;
}
编译test.cpp:$ arm-linux-g++ -I/usr/local/arm-linux/include/opencv/ -L/usr/local/arm-linux/lib/ -lcv -lcxcore -lhighgui -lpthread -lrt -o test test.cpp
报错:/usr/local/arm/4.4.1/bin/../lib/gcc/arm-none-linux-gnueabi/4.4.1/../../../../arm-none-linux-gnueabi/bin/ld: cannot find -lcv
google之,发现这个问题是找不到libcv.so这个动态库。
通过find命令发现在/usr/local/arm-linux/lib/下面确实没有这个库,而且这个目录下的库都是libopencv*形式的,我猜测是不是opencv2.2相比2.1作了不少改动,网上调研发现确实时这样的,opencv2.2重新组织库结构,用较详细,更小的模块来取代cxcore, cv, cvaux, highgui 和 ml库.
于是,试着把命令改成:$ arm-linux-g++ -I/usr/local/arm-linux/include/opencv/ -L/usr/local/arm-linux/lib/ -lopencv_core -lopencv_highgui -lpthread -lrt -o test test.cpp
结果还是报上面的错误,这次我注意到它是在。。。/arm-none-linux-gnueabi/。。这个目录下找动态库的,也就是说,尽管我指定了头文件,库文件的搜索路径,但是它没有去我指定的路径下找。于是我把/usr/local/opencv-arm/include/opencv/下的头文件和/usr/local/opencv-arm/lib下的动态库全都拷贝到/usr/local/arm/4.4.1/arm-none-linux-gnueabi下面对应的目录下,然后再编译:
$ arm-linux-g++ -lopencv_core -lopencv_highgui -lpthread -lrt -o test test.cpp
成功!
(2)将库文件s 和 编译好的测试程序test 拷贝到开发板测试
用sd卡拷贝,遇到问题:
cp: cannot create '../../lib/libopencv_calib3d.so': Read-only file system
cp: cannot create '../../lib/libopencv_contrib.so': Read-only file system
cp: cannot create '../../lib/libopencv_core.so': Read-only file system
这个跟cramfs文件系统是只读的文件系统相关,烧写yaffs文件系统即可解决这个问题。