经过两天的努力终于在Fedora22平台上将Opencv(包括Opencv-3.0.0和Opencv-2.2.0)移植到arm开发板上,我没用qt进行显示,只是应用库。
下面我把编译Opencv要用的库及环境罗列一下。在网上都很容易下载,实在找不到可以给我留言。在下载这些库及应用程序之前用命令 uname -a 查一下自己宿主机的版本号及其他详细信息,具体你可以man uname 查看。
比如我的宿主机如下:
[root@localhost exampleopencv]# uname -a
Linux localhost.localdomain 4.0.4-301.fc22.x86_64 #1 SMP Thu May 21 13:10:33 UTC 2015 x86_64 x86_64 x86_64GNU/Linux
库及应用程序
libz: zlib-1.2.8.tar.gz
libjpeg: jpegsrc.v7
libpng: libpng-1.5.10
libyasm: yasm-1.2.0.tar.gz
opencv: opencv-2.2.0 或者 opencv-3.0.0
libx264: x264-snapshot-20120608-2245.tar.bz2
libxvid: xvidcore-1.3.3.tar.gz
lffmpeg: ffmpeg-2.8.tar.bz2
cmake: cmake-3.3.2-linux-X86_64.tar.gz
下面就把下载下来的库或应用程序进行解压,tar xfj xxx.tar.bz2; tar xzf xxx.tar.gz; unzip xxx.zip,解压完后进行交叉编译。
1、libz的交叉编译:
# ./configure --prefix=/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi --shared
修改makefile
CC=arm-linux-gcc
AR=arm-linux-ar
RANLIB=arm-linux-ranlib
DSHARED=arm-linux-gcc -shared -wl, -soname,libz.so.1,--version-script,zllib.map
#make
#make install
在编译这个库时中途出现错误,错误大概就是缺少.so文件,可以通过 dnf whatprovides xxx.so ,然后通过dnf search 查询软件库有没的下载,要下载怎样的。通过dnf install xxx进行安装。反正不要急,慢慢把错误搞定。
2、libjpeg的交叉编译:
#./configure --host=arm-linux --prefix=/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi --enable-shared --enable-static
#make install
3、libpng的交叉编译
#./configure --host=arm-linux --prefix=/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi --enable-shared --enable-static
#make
#make install
4、yasm的交叉编译:
#./configure --host=arm-linux --prefix=/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi --enable-shared --enable-static
#make
#make install
5、libx264的交叉编译:
#CC=arm-linux-gcc ./configure --enable-shared --host=arm-linux --disable-asm --prefix=/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi
#make
#make install
6、libxvid的交叉编译:
#cd build/generic
#./configure --prefix=/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi --host=arm-linux --disable-assembly
#make
#make install
7、ffmpeg的交叉编译:
#./configure --prefix=/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi --enable-shared --disable-static --enable-gpl --enable-cross-compile --arch=arm --disable-stripping --target-os=linux --enable-libx264 --enable-libxvid --cc=arm-linux-gcc --enable-swscale
#make
#make install
到此opencv所依赖的环境都安装完了,下面就对opencv进行编译了,下面要用到cmake工具(CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。只是 CMake 的组态档取名为 CmakeLists.txt。Cmake 并不直接建构出最终的软件,而是产生标准的建构档(如 Unix 的 Makefile 或 Windows Visual C++ 的 projects/workspaces),然后再依一般的建构方式使用。),最近opencv版本都自带了cmake工具,不过自带的cmake没有,可视化界面。要自己去cmake官网下载cmake,在.bin文件下有一个cmake-gui可执行文件。
不过我没用可视化界面进行编译,在这里也遇到比较麻烦的事。 运行cmake-gui(./cmake-gui)是没能出现图像化界面,只出现一副灰色框。最后在一个英文论坛上看到,这是Fedora22 的一个bug,你不能在root账号下运行该软件,退出到普通用户界面下运行,出现图形界面,但就是不能编译通过。如果各位有解决的可以给我留言。
使用命令来进行编译的,这里我对opencv进行了相应的裁剪。opencv的GUI部分都是基于GTK的,arm上不被支持,要进行裁剪。
我用Cmake的配置如下:cmake的参数可是应用cmake help查看。(这里先在/usr/local/下mkdir opencv-arm文件夹)
cd opencv
mkdir release
cd release没有这三步会进行报错,在/home/6410找不到相应文件,
cmake -DCMAKE_SYSTEM_NAME=arm-linux -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local/opencv-arm -D CMAKE_C_COMPILER=arm-linux-gcc -D CMAKE_CXX_COMPILER=arm-linux-g++ -D CMAKE_EXE_LINKER_FLAGS="-lpthread -lrt" -D WITH_TIFF=OFF ..
make
在进行编译的时候碰到一下几处错误:
编译opencv-3.0.0时,大约37%时,出现
../../lib/libopencv_core.so.3.0.0: undefined reference to `parallel_pthreads_set_threads_num(int)'
../../lib/libopencv_core.so.3.0.0: undefined reference to `parallel_pthreads_get_threads_num()'
../../lib/libopencv_core.so.3.0.0: undefined reference to `parallel_for_pthreads(cv::Range const&, cv::ParallelLoopBody const&, double)'
的错误,通过下面的方法即可解决。
修改modules/core/src/parallel.cpp,添加7处删除5处(+表示要添加,-表示要删除)
132 namespace cv
133 {
134 ParallelLoopBody::~ParallelLoopBody() {}
135 +#if defined HAVE_PTHREADS && HAVE_PTHREADS
136 + void parallel_for_pthreads(const cv::Range& range, const cv::ParallelLoopBody& body, double nstripes);
137 + size_t parallel_pthreads_get_threads_num();
138 + void parallel_pthreads_set_threads_num(int num);
139 +#endif
140 }
141
142 +
143 namespace
144 {
145 #ifdef CV_PARALLEL_FRAMEWORK .
307 }
308
309 #elif defined HAVE_PTHREADS
- void parallel_for_pthreads(const Range& range, const ParallelLoopBody& body, double nstripes);
310 +
311 parallel_for_pthreads(range, body, nstripes);
312
313 #else .
367
368 #elif defined HAVE_PTHREADS
369
- size_t parallel_pthreads_get_threads_num();
-
370 return parallel_pthreads_get_threads_num();
371
372 #else
428
429 #elif defined HAVE_PTHREADS
430
- void parallel_pthreads_set_threads_num(int num);
-
431 parallel_pthreads_set_threads_num(threads);
432
433 #endif
在编译opencv-2.2.0时,在79%出错,OpenCV-2.2.0/modules/ml/src/gbt.cpp:474: error: 'expl' was not declared in this scope;修改gdb.cpp,注释掉#if android 和#endlf,继续。接着96%时。出现错误,/lib/libopencv_features2d.so: undefined reference to `cv::SIFT::SIFT(double, bool, bool, int, int, int, int)'解决方法:在/opt/OpenCV2.2.0/modules/features2d/src/sift.cpp下 #ifdef __arm__
#define ARM_NO_SIFT#endif 注释掉#define ARM_NO_SIFT.错误消除,好了,安全到达100%。
make install
接下就是交叉编译应用程序,把刚刚编译好的/include和/lib下的文件拷贝到交叉编译器环境下,也可以在Makefile写这样的操作。将/lib下的动态链接库拷贝到开发板的/lib目录下。
arm-linux-g++ -o test text.cpp -I /usr/local/opencv-arm/include -L /usr/local/opencv-arm/lib -lopencv_core -lopencv_highgui -lpthread -lrt
最后就将编译好的二进文件传到目标板,如果运行成功,表示你一直成功。
Fedora22下移植opencv-2.4.10:http://www.linuxdiyf.com/linux/14270.html
在Fedora22中安装OpenCV3.0.0:http://www.linuxdiyf.com/linux/12610.html
Ubuntu14.04安装OpenCV3.0:http://www.linuxdiyf.com/linux/13854.html
Ubuntu14.04下安装OpenCV 3.0.RC1:http://www.linuxdiyf.com/linux/13355.html
[RedHat AS5]三星S3C6410(ARM1176)平台Android资源获取与编译:http://www.linuxdiyf.com/linux/8863.html