在Fedora22平台下将opencv移植到S3C6410

经过两天的努力终于在Fedora22平台上将Opencv(包括Opencv-3.0.0和Opencv-2.2.0)移植到arm开发板上,我没用qt进行显示,只是应用库。

下面我把编译Opencv要用的库及环境罗列一下。在网上都很容易下载,实在找不到可以给我留言。在下载这些库及应用程序之前用命令 uname -a  查一下自己宿主机的版本号及其他详细信息,具体你可以man uname 查看。

   比如我的宿主机如下:

     [root@localhost exampleopencv]# uname -a

     Linux localhost.localdomain4.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

  这是库文件的下载地址 http://download.csdn.net/detail/good123_2014/9348415 下面就把下载下来的库或应用程序进行解压,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
   最后就将编译好的二进文件传到目标板,如果运行成功,表示你一直成功。


  make
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值