【Xilinx-Petalinux学习】-04-OpenCV的移植

交叉编译PC平台 VMware12, CentOS 6.5 32 bit

在VMware中安装CentOS,用户名:xilinx-arm-opencv 密码:root

至于这里为什么用CentOS,而不是Ubuntu,是因为CentOS的内核可以支持V4L,而Ubuntu因为内核版本较高,已经没有了V4L的支持,只有V4L2。

总之为了方便还是再安装一个CentOS的虚拟机吧。

step1: 安装包、工具下载

首先下载各种依赖库源文件和工具。提到的都是我用到的版本,已经验证过,都是可以互相配合可用的。

OpenCV依赖库:

zlib-1.2.7.tar.gz

jpegsrc.v9b.tar.gz

libpng-1.5.14.tar.gz

last_stable_x264.tar.bz2 (x264-snapshot-20161127-2245-stable)

xvidcore-1.3.2.tar.gz

tiff-4.0.7.tar.gz

ffmpeg-0.10.16.tar.bz2

到时候这些依赖库需要按照上面的顺序安装。

交叉编译工具:

xilinx-2011.09-50-arm-xilinx-linux-gnueabi.bin

可百度去搜索下载,也可以用下面位大侠共享的网盘。网址:http://pan.baidu.com/share/link?shareid=2118817891&uk=2047711911&fid=131808308022716

还可以从网上下载较新版本的源码,但我还没有搞懂怎么去用。网址:https://www.xilinx.com/guest_resources/member/mb_gnu/xilinx-2015.05-17-arm-xilinx-linux-gnueabi.src.tar.bz2

OpenCV:

opencv-2.4.9

从官网下载Linux 32 bit版本的源码就可以了

step2: 交叉编译工具的安装

首先安装交叉编译工具需要用到的一些依赖库:

$ su -
yum update
yum install glibc-devel.i686
yum install gtk2-devel.i686
yum install libcanberra.i686
yum install libcanberra-gtk2.i686
yum install PackageKit-gtk-module.i686
yum install GConf2.i686
yum install ncurses-libs.i686
yum install xulrunner.i686

再来安装交叉编译工具。

复制 xilinx-2011.09-50-arm-xilinx-linux-gnueabi.bin 安装包到Linux中,运行:

./xilinx-2011.09-50-arm-xilinx-linux-gnueabi.bin

就会弹出类似Windows安装软件一样的界面,一直点Next直到安装成功。

接着添加环境变量,运行命令:

gedit ~/.bashrc
#在文件最后加入下面几行文本
export ARCH=arm
export CROSS_COMPILE=arm-xilinx-linux-gnueabi-
export PATH=/root/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/bin/:$PATH
#保存并退出#source
source ~/.bashrc

这样,我们就能够直接调用 arm-xilinx-linux-gnueabi-gcc指令了。

假如需要更新版本,卸载当前版本的话,运行:

/root/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/uninstall/Uninstall_Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/Uninstall_Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux

step3: 交叉编译OpenCV需要的依赖库

先创建用来保存依赖库和OpenCV库的文件夹,执行命令:

#新建安装目录
mkdir -p /usr/local/arm/opencv-lib
mkdir -p /usr/local/arm/opencv-arm
#添加环境变量
export ZYNQ_CV_INSTALL=/usr/local/arm/opencv-lib
export CC=arm-xilinx-linux-gnueabi-gcc

解压所有的依赖库源代码,然后分别进入各个源码的文件夹进行交叉编译。一定要按照顺序安装,因为它们之间也有依赖关系。

zlib安装

./configure --prefix=$ZYNQ_CV_INSTALL --shared
make
make install

jpeg安装

./configure --prefix=$ZYNQ_CV_INSTALL --host=arm-xilinx-linux-gnueabi --enable-shared
make
make install

libpng安装

./configure --prefix=$ZYNQ_CV_INSTALL --host=arm-xilinx-linux-gnueabi --enable-arm-neon --enable-shared --with-pkgconfigdir=$ZYNQ_CV_INSTALL/lib/pkgconfig LDFLAGS=-L$ZYNQ_CV_INSTALL/lib CPPFLAGS=-I$ZYNQ_CV_INSTALL/include
make
make install

x264安装

./configure --host=arm-linux --cross-prefix=arm-xilinx-linux-gnueabi- --enable-shared  --disable-asm --prefix=$ZYNQ_CV_INSTALL
make
make install

xvidcore安装

cd build/generic/
./configure --prefix=$ZYNQ_CV_INSTALL --host=arm-xilinx-linux-gnueabi  --disable-assembly
make
make install

tiff安装

./configure --prefix=$ZYNQ_CV_INSTALL --host=arm-xilinx-linux-gnueabi --enable-shared LDFLAGS=-L$ZYNQ_CV_INSTALL/lib CFLAGS=-I$ZYNQ_CV_INSTALL/include
make
make install

ffmpeg安装

./configure --prefix=$ZYNQ_CV_INSTALL --enable-shared --disable-static --enable-gpl --enable-cross-compile --arch=arm --disable-stripping --target-os=linux --enable-libx264 --enable-libxvid --cc=arm-xilinx-linux-gnueabi-gcc --enable-swscale --extra-cflags=-I$ZYNQ_CV_INSTALL/include --extra-ldflags=-L$ZYNQ_CV_INSTALL/lib --disable-asm
make
make install

为了在编译OpenCV时确保ffmpeg的正常链接,需要添加PKG_CONFIG_PATH环境变量

gedit /etc/bashrc
#在文件最后添加如下内容
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$ZYNQ_CV_INSTALL/lib/pkgconfig
export PKG_CONFIG_PATH
#保存并退出
#source
source /etc/bashrc

这些我都试了很多遍了,就按照上面的方法配置、编译和安装即可,就不去详细的说明各个配置参数的意义了。

step4: 交叉编译OpenCV 2.4.9

安装cmake:

yum install cmake
yum install cmake-gui

解压OpenCV 2.4.9源码,进行配置:

#进入文件夹
cd opencv-2.4.9
#建立并进入编译文件夹
mkdir build
cd build

#创建文件
gedit toolchain.cmake
#修改文件,在其中加入如下内容:
###########user defined#############
set( CMAKE_SYSTEM_NAME Linux )
set( CMAKE_SYSTEM_PROCESSOR arm )
set( CMAKE_C_COMPILER arm-xilinx-linux-gnueabi-gcc )
set( CMAKE_CXX_COMPILER arm-xilinx-linux-gnueabi-g++ )
###########user defined#############
set( CMAKE_FIND_ROOT_PATH "/usr/local/arm/opencv-lib" )
set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER )
set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )
set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )
######################################
#保存并退出

#添加LDFLAGS环境变量
export LDFLAGS=-Wl,-rpath-link,/usr/local/arm/opencv-lib

#在CentOS中,使OpenCV支持V4L
cp /usr/include/linux/videodev.h /root/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/arm-xilinx-linux-gnueabi/libc/usr/include/linux/

#cmake
cmake -D CMAKE_TOOLCHAIN_FILE=toolchain.cmake -D CMAKE_INSTALL_PREFIX=/usr/local/arm/opencv-arm ../

#cmake配置
cmake-gui

接着就打开了cmake-gui的配置界面,在里面可以配置opencv的编译选项。

在cmake GUI中,勾选 Grouped 和 Advanced 选项框,核对以下信息:

1. 源码与安装目录。需要跟下面一模一样

Where is the source code: /home/xilinx-arm-opencv/PetaLinux/package/opencv/opencv-2.4.9

Where to build the binaries: /home/xilinx-arm-opencv/PetaLinux/package/opencv/opencv-2.4.9/build

2. CMAKE项。需要跟下面一模一样

CMAKE_INSTALL_PREFIX : /usr/local/arm/opencv-arm

CMAKE_EXE_LINKER_FLAGS : -Wl,-rpath-link,/usr/local/arm/opencv-lib

CMAKE_C_COMPILER : /root/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/bin/arm-xilinx-linux-gnueabi-gcc

CMAKE_CXX_COMPILER : /root/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/bin/arm-xilinx-linux-gnueabi-g++

3.WITH项。只勾选如下选项,其他都不勾选

WITH_FFMPEG

WITH_JASPER

WITH_JPEG

WITH_OPENEXR

WITH_PNG

WITH_TIFF

WITH_V4L

界面如下图:

配置完成后点击Configure按钮,会打印出如下信息:(特别需要注意标红的LOG信息与我的是否相同!)

General configuration for OpenCV 2.4.9 =====================================
  Version control:               unknown

Platform:
    Host:                        Linux 2.6.32-431.el6.i686 i686
    Target:                      Linux arm
    CMake:                       2.8.12.2
    CMake generator:             Unix Makefiles
    CMake build tool:            /usr/bin/gmake
    Configuration:               Release

C/C++:
    Built as dynamic libs?:      YES
    C++ Compiler:                /root/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/bin/arm-xilinx-linux-gnueabi-g++  (ver 4.6.1)
    C++ flags (Release):         -fsigned-char -W -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -O3 -DNDEBUG  -DNDEBUG
    C++ flags (Debug):           -fsigned-char -W -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -g  -O0 -DDEBUG -D_DEBUG
    C Compiler:                  /root/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/bin/arm-xilinx-linux-gnueabi-gcc
    C flags (Release):           -fsigned-char -W -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -O3 -DNDEBUG  -DNDEBUG
    C flags (Debug):             -fsigned-char -W -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -g  -O0 -DDEBUG -D_DEBUG
    Linker flags (Release):      -Wl,-rpath-link,/usr/local/arm/opencv-lib
    Linker flags (Debug):        -Wl,-rpath-link,/usr/local/arm/opencv-lib
    Precompiled headers:         YES

OpenCV modules:
    To be built:                 core flann imgproc highgui features2d calib3d ml video legacy objdetect photo gpu nonfree contrib stitching superres ts videostab
    Disabled:                    world
    Disabled by dependency:      -
    Unavailable:                 androidcamera dynamicuda java ocl python viz

GUI:
    QT:                          NO
    GTK+ 2.x:                    NO
    GThread :                    NO
    GtkGlExt:                    NO
    OpenGL support:              NO
    VTK support:                 NO

Media I/O:
    ZLib:                        /usr/local/arm/opencv-lib/lib/libz.so (ver 1.2.7)
    JPEG:                        /usr/local/arm/opencv-lib/lib/libjpeg.so (ver 90)
    PNG:                         /usr/local/arm/opencv-lib/lib/libpng.so (ver 1.5.14)
    TIFF:                        /usr/local/arm/opencv-lib/lib/libtiff.so (ver 42 - 4.0.7)
    JPEG 2000:                   build (ver 1.900.1)
    OpenEXR:                     build (ver 1.7.1)

Video I/O:
    DC1394 1.x:                  NO
    DC1394 2.x:                  NO
    FFMPEG:                      YES
      codec:                     YES (ver 53.61.100)
      format:                    YES (ver 53.32.100)
      util:                      YES (ver 51.35.100)
      swscale:                   YES (ver 2.1.100)
      gentoo-style:              YES
    GStreamer:                   NO
    OpenNI:                      NO
    OpenNI PrimeSensor Modules:  NO
    PvAPI:                       NO
    GigEVisionSDK:               NO
    UniCap:                      NO
    UniCap ucil:                 NO
    V4L/V4L2:                    YES/YES
    XIMEA:                       NO
    Xine:                        NO

Other third-party libraries:
    Use IPP:                     NO
    Use Eigen:                   NO
    Use TBB:                     NO
    Use OpenMP:                  NO
    Use GCD                      NO
    Use Concurrency              NO
    Use C=:                      NO
    Use Cuda:                    NO
    Use OpenCL:                  NO

Python:
    Interpreter:                 /usr/bin/python2 (ver 2.6.6)

Java:
    ant:                         NO
    JNI:                         NO
    Java tests:                  NO

Documentation:
    Build Documentation:         NO
    Sphinx:                      NO
    PdfLaTeX compiler:           NO

Tests and samples:
    Tests:                       YES
    Performance tests:           YES
    C/C++ Examples:              NO

  Install path:                  /usr/local/arm/opencv-arm

cvconfig.h is in:              /home/xilinx-arm-opencv/PetaLinux/package/opencv/opencv-2.4.9/build
-----------------------------------------------------------------

Configuring done

再点击Generate按钮,即完成了makefile文件的配置。关闭cmake gui界面。

最后编译并安装opencv:

#编译前需要将交叉编译好的依赖库连接或复制到交叉编译工具中去
#否则会在opencv编译时出现类似undefined reference to `[email protected]_0‘的错误
cp -r /usr/local/arm/opencv-lib/lib/* /root/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/arm-xilinx-linux-gnueabi/libc/usr/lib/

#编译并安装
make
make install

最终,我们完成了OpenCV的交叉编译,并得到了两个文件夹的文件,分别是:

#opencv依赖库
/usr/local/arm/opencv-lib
#opencv库
/usr/local/arm/opencv-arm

通过它们,就可以编译和运行我们Zynq板的PetaLInux中运行opencv程序了。

下一次再记录如何使用我们编译好的库文件。

时间: 2024-10-27 07:20:07

【Xilinx-Petalinux学习】-04-OpenCV的移植的相关文章

[原]零基础学习SDL开发之移植SDL2.0到Android

在[原]SDL开发教程我们知道了如何在pc下使用SDL进行开发,在android上面是否一样可以使用呢?答案是肯定的. 下面我们进行移植SDL到Android,这里都是基于SDL最新版进行移植的,在Eclipse中编译. 开发环境:Ubuntu 14.04 64位,Eclipse + CDT + ADT,NDK 一.到官网下载http://www.libsdl.org/hg.php 下载2.0的源码也可以通过hg来clone最新的源码 hg clone http://hg.libsdl.org/

Thinkphp学习04

原文:Thinkphp学习04 一.ThinkPHP 3 的输出      (重点) a.通过 echo 等PHP原生的输出方式在页面中输出 b.通过display方法输出   想分配变量可以使用assign方法 c.修改左右定界符   休要修改配置文件中的配置项   'TMPL_L_DELIM'=>'<{', //修改左定界符   'TMPL_R_DELIM'=>'}>', //修改右定界符 二.ThinkPHP 3 的模型使用  (重点)  需要在方法中通过new Model(

Java虚拟机JVM学习04 类的初始化

Java虚拟机JVM学习04 类的初始化 类的初始化 在初始化阶段,Java虚拟机执行类的初始化语句,为类的静态变量赋予初始值. 在程序中,静态变量的初始化有两种途径: 1.在静态变量的声明处进行初始化: 2.在静态代码块中进行初始化. 没有经过显式初始化的静态变量将原有的值. 静态变量的声明语句,以及静态代码块都被看做类的初始化语句,Java虚拟机会按照初始化语句在类文件中的先后顺序来依次执行它们. 类的初始化步骤 1.假如这个类还没有被加载和连接,那就先进行加载和连接. 2.假如类存在直接的

Opencv程序移植时问题及解决,移植成功啦,哈哈

Opencv移植方法:http://blog.csdn.net/b5w2p0/article/details/8976665 我用的是Cmake,最终成功,把路径下生成的so文件拷到开发板的  /lib文件下. 在这之前也可能要移植ffmpge:http://blog.csdn.net/b5w2p0/article/details/38455071 遇到问题多看文章,多试几次最终一定会成功. 现在就可以编译程序啦: <span style="font-size:18px;">

设计模式学习04—建造者模式

一.动机与定义 创建对象时,我们知道可以使用工厂方式来创建,使调用者和具体实现解耦,但是有一种情况,当要创建的多个对象之间重复性较大,只有创建步骤.组装顺序或者内部构件不同时,工厂模式就需要进一步的演化了,如我们去KFC,有很多种套餐,比如套餐1(薯条+可乐+汉堡),套餐2(鸡肉卷+薯条+可乐),这个套餐就是我们要获取的复杂对象,那么程序如何创建出这种对象呢. 我们看到套餐的内容很多是一样的,那么我们是不是可以考虑将创建单个食品(如鸡肉卷.可乐等)方法提取出来,使用单独一个类协调这些食品的组合比

Xilinx SDDoc 加载opencv库

Xilinx SDSoc 加载opencv库需要下载两个文件 xfopencv 和 Revision Platform 1.xfopencv : github地址 https://github.com/Xilinx/xfopencv 2.revision platform : https://www.xilinx.com/member/forms/download/design-license-xef.html?akdm=1&filename=zcu102-rv-ss-2017-4.zip p

JVM学习04:类的文件结构

JVM学习04:类的文件结构 写在前面:本系列分享主要参考资料是  周志明老师的<深入理解Java虚拟机>第二版. 类的文件结构知识要点Xmind梳理 原文地址:https://www.cnblogs.com/wobuchifanqie/p/10786296.html

爬虫学习 04.Python网络爬虫之requests模块(1)

爬虫学习 04.Python网络爬虫之requests模块(1) 引入 Requests 唯一的一个非转基因的 Python HTTP 库,人类可以安全享用. 警告:非专业使用其他 HTTP 库会导致危险的副作用,包括:安全缺陷症.冗余代码症.重新发明轮子症.啃文档症.抑郁.头疼.甚至死亡. 今日概要 基于requests的get请求 基于requests模块的post请求 基于requests模块ajax的get请求 基于requests模块ajax的post请求 综合项目练习:爬取国家药品监

OpenCV ARM移植(交叉编译opencv)

 部分内容来自下面2编文章: http://www.cnblogs.com/emouse/archive/2013/04/01/2993842.html http://blog.csdn.net/satanhbl/article/details/25734887 arm-oe-linux-gnueabi-gcc编译opencv3.1.0 Cmake的安装 OpenCV 2.2以后版本需要使用Cmake生成makefile文件,因此需要先安装cmake. ubuntu下安装cmake比较简单,