Ubuntu 14.04 LTS下使用arm-linux-gcc交叉编译OpenCV 2.4.9

Ubuntu 14.04 LTS下使用arm-linux-gcc交叉编译OpenCV 2.4.9

当前两个手头有两个项目都是都需要在ARM板中使用OpenCV,所以交叉编译必不可少。两三天里一直查阅各种资料,最后终于把交叉编译走通了…… 参考地址: http://blog.csdn.net/zdyueguanyun/article/details/51322295 http://blog.csdn.net/luotuo44/article/details/8958990 十分感谢上述参考地址的教学,有很重大的指导意义。但中间确实也存在着类似于命令行缺少空格之类的错误,所以笔者准备把自己的交叉编译过程详细写下来,尽量让读者们少走弯路~

笔者操作环境:

  • PC操作系统:Ubuntu 14.04 LTS
  • OpenCV 2.4.9
  • 编译器:arm-linux-gcc 4.3.2
  • CMake版本:2.8.12

注: 1、本文所有操作都需要以root权限进行操作。 2、笔者使用的所有压缩包下载地址都已分享,且笔者也将其全部打包分享在百度云,百度云下载地址如下。 链接: https://pan.baidu.com/s/1pKVbCkr 密码: qugb

一、安装依赖项

首先,我们需要安装几项与视频解码相关的依赖项。如果没有安装这些依赖项,在对OpenCV的make时,会出现如下结果: FFMPEG: NO -- codec: NO -- format: NO -- util: NO -- swscale: NO -- gentoo-style: NO

首先本文的操作全部在root权限下进行,所以第一步先获得root权限:

sudo su

安装依赖项的指令如下:

apt-get install libavcodec-dev libavformat-dev libswscale-dev

二、ARM编译器的安装:

笔者的arm-linux-gcc 4.3.2下载地址如下: http://download.csdn.net/detail/xinhuameng/2642452 直接将arm-linux-gcc-4.3.2.tgz解压在根目录/下:

tar -zxvf arm-linux-gcc-4.3.2.tgz -C /

进入/root/.bashrc,使用vim或gedit对其进行操作:

gedit /root/.bashrc

/root/.bashrc最下方添加环境变量: export PATH=$PATH:/usr/local/arm/4.3.2/bin export OPENCV_DEPEND=/usr/local/arm/opencv-depend export OPENCV_INSTALL=/usr/local/arm/opencv-install 如图所示:

其中,/usr/local/arm/4.3.2/bin是arm编译器的路径; /usr/local/arm/opencv-depend是OpenCV依赖库安装路径; /usr/local/arm/opencv-install是OpenCV安装路径。

此时输入指令或重启电脑,使新的环境变量生效。输入指令如下:

source /root/.bashrc

检验环境变量生效的方法是:在root权限下,终端中输入arm,然后按Tab键,出现图示如下:

只要终端显示出arm-linux-gcc-4.3.2, arm-none-linux-gnueabi-g++, arm-none-linux-gnueabi-gcc, arm-none-linux-gnueabi-gcc-4.3.2,就说明arm编译器已经配置成功了。

三、安装依赖库

OpenCV交叉编译之前,首先需要对依赖库进行交叉编译。因为OpenCV依赖于很多库函数,如果在编译OpenCV之前没有编译依赖项,就会导致编译后的OpenCV无法使用。 OpenCV交叉编译时各个库的依赖关系如下所示:

  • OpenCV
    • zlib
    • jpeg
    • libpng
      • zlib
    • tiff
      • zlib
    • ffmpeg
      • x264
      • xvidcore

笔者使用的依赖库如下所示:

  • zlib-1.2.11
  • jpegsrc.v9b
  • libpng-1.6.29
  • yasm-1.3.0
  • x264-snapshot-20170415-2245
  • xvidcore_1.3.3.orig
  • ffmpeg-2.8.11

笔者已经将上述依赖库放置在笔者的云盘中,且下载地址已经在上文分享。另外下载上述依赖库源码的网址如下:

**注:后面所有的交叉编译操作,都需要进入依赖库解压的地址进行操作。 如笔者将上述所有源码解压到了路径/home/grq/src/下,且该路径下有如下源码包: zlib-1.2.11 jpeg-9b libpng-1.6.29 yasm-1.3.0 x264-snapshot-20170415-2245 xvidcore-1.3.3 ffmpeg-2.8.11 zlib为例,此时如果笔者想对zlib进行交叉编译,则需要进入到zlib的路径:

cd /home/grq/src/zlib-1.2.11

随后进行相应的操作。

其余依赖库的交叉编译都需要进行这一步骤,后续不再赘述。

1、zlib的交叉编译:

./configure --prefix=$OPENCV_DEPEND

之后,对Makefile文件进行修改,修改内容如下: CC=arm-linux-gcc AR=arm-linux-ar RANLIB=arm-linux-ranlib LDSHARED=arm-linux-gcc -shared-Wl,-soname,libz.so.1,--version-script,zlib.map 修改之后,如图所示:

之后执行命令:

make
make install

2、libjpeg的交叉编译:

./configure --host=arm-linux --prefix=$OPENCV_DEPEND --enable-shared --enable-static
make
make install

3、libpng的交叉编译:

./configure --host=arm-linux --prefix=$OPENCV_DEPEND --enable-shared --enable-static
make
make install

4、yasm的交叉编译:

CC=arm-linux-gcc ./configure --enable-shared --host=arm-linux --disable-asm --prefix=$OPENCV_DEPEND
make
make install

5、libx264的交叉编译:

CC=arm-linux-gcc ./configure --enable-shared --host=arm-linux --disable-asm --prefix=$OPENCV_DEPEND
make
make install

6、libxvid的交叉编译:

进入libxvid的目录后,再行进入其子目录中:

cd ./build/generic

然后输入命令:

./configure --prefix=$OPENCV_DEPEND --host=arm-linux --disable-assembly
make
make install

7、ffmpeg的交叉编译:

./configure --prefix=$OPENCV_DEPEND --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 --extra-ldflags=-L$OPENCV_DEPEND/lib --extra-cflags=-I$OPENCV_DEPEND/include

注:按照该流程安装时,下载ffmpeg 2.8版本,不要下载最新的ffmpeg 3.3版本!否则可能会像笔者编译OpenCV至21%时,显示make错误;

至此,依赖库编译安装完成。

8、OpenCV依赖库复制到ARM编译器路径下

此时,需要将路径/usr/local/arm/opencv-depend下的lib和include中所有文件分别拷贝到路径/usr/local/arm/4.3.2/arm-non-linux-gnueabi/下的lib和include下。命令如下:

cp -r /usr/local/arm/opencv-depend/include/ /usr/local/arm/4.3.2/arm-none-linux-gnueabi/
cp -r /usr/local/arm/opencv-depend/lib/ /usr/local/arm/4.3.2/arm-none-linux-gnueabi/

如果没有进行该步骤,在后面对OpenCV进行make操作时,会出现如下错误:

四、OpenCV的交叉编译

1、获取OpenCV源码

笔者这里使用的是OpenCV 2.4.9版本,可以在官网上下载。 官网下载地址:http://opencv.org/releases.html

2、设置工具链toolchain.cmake

下载并解压OpenCV后,进入OpenCV 2.4.9的路径,并新建文件夹build:

cd opencv-2.4.9
mkdir build
cd ./build

在build文件夹中,用vim或gedit新建文件toolchain.cmake

gedit toolchain.cmake

toolchain.cmake文件中填入如下内容:

###########user defined#############
set( CMAKE_SYSTEM_NAME Linux )
set( CMAKE_SYSTEM_PROCESSOR arm )
set( CMAKE_C_COMPILER arm-none-linux-gnueabi-gcc )
set( CMAKE_CXX_COMPILER arm-none-linux-gnueabi-g++ )
###########user defined#############
set( CMAKE_FIND_ROOT_PATH "/usr/local/arm/opencv-depend" )
set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER )
set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
######################################

保存文件后,执行如下命令:

cmake -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake ../

3、对OpenCV进行cmake配置

后面就会需要对OpenCV进行cmake操作,如果PC机没有安装cmake,则需要输入指令:

apt-get install cmake cmake-qt-gui

依旧在build路径下,打开cmake的界面程序,即输入指令:

cmake-gui

设置源代码地址为/opencv-2.4.9,构建地址为/opencv-2.4.9/build,并对如下选项进行修改:

  • CMAKE_INSTALL_PREFIX(安装目录),默认为/opencv-2.4.9/build/install,改为/usr/local/arm/opencv-install
  • 去掉 WITH_CUDA
  • 去掉 WITH_GTK
  • 去掉 WITH_1394
  • 去掉 WITH_GSTREAMER
  • 去掉 WITH_LIBV4L
  • 去掉 WITH_TIFF
  • 去掉 BUILD_OPENEXR
  • 去掉 WITH_OPENEXR
  • 去掉 BUILD_opencv_ocl
  • 去掉 WITH_OPENCL

OpenCV修改项众多,可以利用cmake-gui的搜索功能简化操作。修改界面如图所示:

将上述操作进行完毕后,先按下Configure,然后按下Generate。

此时修改在/opencv-2.4.9/build文件夹中的CMakeCache.txt: CMAKE_EXE_LINKER_FLAGS选项本来为空,此时在后面加上:-lpthread -lrt 效果如图所示:

4、编译OpenCV

/opencv-2.4.9/build路径下执行命令:

make
make install

等待较长时间后,OpenCV的交叉编译就完成了。

五、交叉编译后的OpenCV移植到ARM上

1、配置pkg-config

参考地址:http://blog.csdn.net/luotuo44/article/details/24836901 大家应该都知道用第三方库,就少不了要使用到第三方的头文件和库文件。我们在编译、链接的时候,必须要指定这些头文件和库文件的位置。 对于一个比较大第三方库,其头文件和库文件的数量是比较多的。如果我们一个个手动地写,那将是相当麻烦的。所以,pkg-config就应运而生了。pkg-config能够把这些头文件和库文件的位置指出来,给编译器使用。 平常都是这样用pkg-config的:

gcc main.c `pkg-config --cflags --libs gtk+-2.0` -o main

上面的编译命令中,`pkg-config --cflags --libs gtk+-2.0`的作用就如前面所说的,把gtk的头文件路径和库文件列出来,让编译去获取。–cflags和–libs分别指定头文件和库文件。 PS:命令中的`不是引号,而是数字1左边那个键位的那个符号。

在前面的OpenCV配置过程中,pkg-config便已经生成。生成地址为/usr/local/arm/opencv-install/lib/pkgconfig/opencv.pc

2、配置shell

用vim或gedit编辑文件/etc/bash.bashrc

gedit /tec/bash.bashrc

在最后一行加入: PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/arm/opencv-install/lib/pkgconfig export PKG_CONFIG_PATH 效果如图所示:

然后输入指令:

source /etc/bash.bashrc

这样就更新了这一条配置信息,不需要再重新启动了。

3、测试使用

创建并编辑一个test.cpp文件:

#include <cv.h>
#include <highgui.h>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
    IplImage* image = cvLoadImage("/root/Desktop/miska.jpg");
    if(image == NULL)
    {
        cout<<"loud image fail"<<endl;
    return -1;
    }

    cvNamedWindow("src", 1);
    cvShowImage("src", image);
    cvWaitKey();

    cvDestroyWindow("src");
    cvReleaseImage(&image);

    return 0;
}

保存退出后,输入如下编译指令:

arm-linux-g++ `pkg-config --cflags --libs opencv` test.cpp -lpthread -lrt -o test

再注:命令中的`不是引号,而是数字1左边那个键位的那个符号。

以后编译arm板的OpenCV代码时,要使用上面的编译指令。其中` 符号不是逗号,而是1 左边的那个符号。而把编译好的程序放到arm板时,在运行时,还要把/usr/local/arm/opencv-install/lib目录下的所有.so文件都拷贝到arm的/usr/lib或者/lib目录下。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏信安之路

Bypass 360主机卫士SQL注入防御(多姿势)

在服务器客户端领域,曾经出现过一款 360 主机卫士,目前已停止更新和维护,官网都打不开了,但服务器中依然经常可以看到它的身影。

740
来自专栏HTML5学堂

PHP中POST和GET的区别

HTML5学堂:在JavaScript当中,存在“get和post方法的区别”这一辨析知识。其实get和post是向服务器端请求/提交数据的两种方式。对于PHP...

2785
来自专栏java一日一条

JVM 开发者必看:傻瓜式编译 OpenJDK 7

LZ经过一个星期断断续续的研究,终于成功的搞定了JDK的成功编译与调试。尽管网络上的教程也有不少,包括源码中也有自带的编译步骤说明,但真正自己动手的话,还是会遇...

582
来自专栏运维小白

原QQ坦白说之解密教程

背景:之前在QQ上突然有人发坦白说给我,第一感觉就是谁恶搞我,想找到是谁,是谁在恶作剧 ? ---- QQ坦白说之解密教程 一、模拟手机QQ 首先使用谷歌...

3199
来自专栏乐百川的学习频道

做一个自动配置JDK环境变量的Powershell脚本

本来想把这篇的内容包括在我的Powershell系列文章之内的,后来写完之后才想起来,这时候我已经复制粘贴到简书、CSDN和SegmentFault三个地方了。...

2065
来自专栏安恒网络空间安全讲武堂

Python编写渗透工具学习笔记二 | 0x02利用FTP与web批量抓肉鸡

0x02利用FTP与web批量抓肉鸡 脚本要实现的目标和思路: 先尝试匿名登录ftp,当匿名登录失败时再尝试用用户/密码爆破登录,登录成功后,脚本会搜索ftp中...

7206
来自专栏bboysoul

ubuntu安装Metasploit Framework(最简单)

这个其实我以前说过ubuntu安装metasploit,就是在github上clone下来安装,但是那种方式安装的话会碰到很多依赖的问题,不方便安装,下面我推荐...

1634
来自专栏何昭霖的专栏

sql server不用安装 sql 管理工具开启 sa

今天无意间发现腾讯云镜像有 windows server2016,追求新系统的我,马上就重装了云服务器。重装完后发现,配置太低,远程桌面都变得不是很顺畅,于是装...

1090
来自专栏技术点滴

告别S! S! H! 秒杀终端工具——FastLogin快捷登录安装步骤功能测试卸载功能介绍

题记:自从接触到“跳板机”的概念后,一直就被烦不胜烦的机器名,ip地址,用户名,密码折腾的死去活来,心说能有个小精灵随时帮我输入那些重复的登录信息就好了。我见过...

701
来自专栏自由而无用的灵魂的碎碎念

将windows server 2016改造为像windows 10一样适合个人使用的系统

Windows server 2016 RTM已流出,具体可以搜索wzor大神泄露的,英文版本是0911的。现根据我安装后整理的如何配置使个人更适合使用。

1154

扫码关注云+社区