红联Linux门户
Linux帮助

在Fedora22平台下将opencv移植到S3C6410

发布时间:2015-09-30 15:45:15来源:linux网站作者:good123_2014

经过两天的努力终于在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