哈哈哈~
咚咚咚~
移植OpenCV其实并不是很难,官方释放的结合cmake工具的脚本能够实现基本功能的编译,对于交叉编译仅仅需要弄清安装路径和编译器,不和本地OpenCV弄混,理论上来讲就没问题了。由于本次项目需要利用OpenCV的视频读写模块,这给交叉编译增添了许多前期工作。
好,废话不多说,下面请看具体的过程。在此非常感谢CSDN这个平台。
主机开发环境:Ubuntu 14.04 64 位
交叉编译工具链版本:arm-none-linux-gnueabi-4.5.1
CMake版本:CMake 3.2.2
CMake-gui: 版本与CMake相同
目标主机:TI-Am3354(cortex-a8)armv7架构
OpenCV版本:3.2.0
依赖库版本:
libz: zlib1211.zip
libx264: x264-master.zip
libxvid: xvidcore_1.3.3.orig.tar.gz
ffmpeg: ffmpeg-4.2.tar.bz2
(Ps:以上库未贴链接,如果下载有困难可联系我哦,wx:lilianaismine
注明身份哦,很期待与你成为朋友来共同探讨解决相关嵌入式相关问题哦。)
重点来了
重点来了
重点来了
(重要的事情说三遍)
分清本地编译安装和交叉编译移植安装时路径是不同的,弄混安装路径搞瘫自己的开发环境小编不负责哦~?,不过有些问题可以补救的,小编还是很愿意帮你解决的。
目标主机安装目录构建
我们首先在开发主机构建一个临时安装环境,便于交叉编译过程中依赖库的搜索以及方便最后向目标主机转移安装,还有最重要的一点就是防止与开发主机环境弄混。
cd /opt
mkdir arm
小编的开发环境所需的文件及目录一般习惯放在 /opt 目录下,本次也是在该目录下 /arm 目录为目标主机临时安装目录。一切准备就绪就可以开始下一步了。
将前文提到所依赖的库和OpenCV-3.2.0源码放在 /opt 目录下,并解压到该目录下。
首先是对依赖库的交叉编译,因为OpenCV依赖这些库,所以首先需要对这些依赖库的交叉编译并安装到临时安装目录/opt/arm
。
第一座大山~
交叉编译libz:
cd /opt/zlib-1.2.11 #终端切换到zlib-1.2.11源码目录
./configure --prefix=/opt/arm --shared #prefix参数指定了临时安装目录
配置完后会生成Makefile文件,需要对Makefile文件进行修改,适配交叉编译工具链。
gedit Makefile #用编辑器打开Makefile文件并进行以下对应部分的修改
CC = arm-linux-gcc #交叉编译工具链
AR = arm-linux-ar rc
RANLIB = arm-linux-ranlib
LDSHARED = arm-linux-gcc -shared -wl, -soname,libz.so.1,--version-script,zlib.map
修改完后,保存,下一步进行编译和安装。
make #如果没有出现错误,可进行下一步安装,出错的话,结合log文件修正问题
make install #安装到临时目录/opt/arm里,此时会生成相应的目录{$dir}/include,lib,share
到此,对libz的交叉编译已经是完成了,如果不出问题,恭喜你,离成功还有百分之90的路要走。加油吧,少年!不要沮丧哦,其实我不告诉你,你根本不知道你距离终点还有多远~!
开始攻克第二座大山喽~
交叉编译libx264
cd /opt/x264 #开门见山,终端切换到ffmpeg-4.2源码目录
CC=arm-linux-gcc ./configure --enable-shared --disable-asm --prefix=/opt/arm/ --host=arm-linux
铛铛铛~,没有错误的话,我们终于登上了第二个山头。来吧下一步开始,需要等待一段时间哦哦哦。
make #如果不出错,下一步就是安装喽,恭喜恭喜~
make install #安装到/opt/arm目录里。
开始攻克第三座大山喽~
交叉编译libxvid
cd /opt/xvidcore-1.3.3 #山呢?哦哦哦这里,终端切换到xvidcore-1.3.3源码目录
很好,该依赖库已经给做了很多编译脚本上的事情,所以呢,我们还需要切换到编译脚本的目录,那么开始吧,不要在卖关子了~
cd build/generic #切换到编译脚本所在目录
./configure --prefix=/opt/arm --host=arm-linux --disable-assembly
#果然编译脚本会包含arm-linux的可选项,是不是看到一大堆的check通过有一种很爽的感觉,反正我是个强迫症有这种感觉,好啦下一步啦
嗨,第三个山头来了,别爽过头了。下一步马上开始。
make #如果不出错,下一步就是安装喽,恭喜恭喜~
make install #安装到/opt/arm目录里。
啪啪啪,此处应该有掌声,最后一个依赖库,也是重中之重!
交叉编译FFmpeg
cd /opt/ffmpeg-4.2 #别害怕,这小事一桩。终端切换到ffmpeg-4.2源码目录
困了不?停下来吧,喝杯咖啡☕️再来干~
z z Z…
好啦,继续~。刚才我们已经把终端切换到源码目录了,下面开始吧。
./configure --prefix=/opt/arm --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-cflags=-I/opt/arm/include --extra-ldflags=-L/opt/arm/lib
hiahiahia~,是不是没有错误,但是时间也过去了很久了,刚才故意卖个关子,其实是提醒你一下别掉坑里去,如果你按照小编的过程一路很顺畅,那么下面要小心喽,趁着咖啡的热乎劲,come on!
make #如果不出错,下一步就是安装喽,恭喜恭喜~
make install #安装到/opt/arm目录里。
下面,开始交叉编译OpenCV。
熟悉cmake的各位大大都知道,在用cmake编译之前首先是构建工具链cmake文件,这个就不用我多说咯哦~其实我也是在CSDN学的嘛!下面直接给出操作过程。
cd /opt/opencv-3.2.0
mkdir arm-build #构建cmake编译目录,存放编译相关内容
目录构建好了,为了能够在配置的时候识别到我们以上交叉编译出来的依赖库,需要在源码根目录创建toolchain.cmake
文件,文件内容如下:
set( CMAKE_SYSTEM_NAME Linux )
set( CMAKE_SYSTEM_PROCESSOR arm )
set( CMAKE_C_COMPILER arm-linux-gcc )
set( CMAKE_CXX_COMPILER arm-linux-g++ )
set( CMAKE_FIND_ROOT_PATH "/opt/arm/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 )
#最后这四个参数非常重要哦,如果设置不对,可能编译完成后,仍然找不到哦。
进入到编译{$opencv-3.2.0}arm-build
目录,并执行一下内容。
export PKG_CONFIG_PATH=/opt/arm:$PKG_CONFIG_PATH #
cmake -D CMAKE_TOOLCHAIN_FILE=../toolchain.cmake ../ #注意空格和“.”的个数哦。
完成之后输出信息,在FFMPEG对应的部分都显示YES,恭喜你,直接跳到下面用cmake-gui的部分,继续操作。
另外,对于FFMPEG部分,其中子核心部分为YES,而FFMPEG为NO,这里我们需要解决这个问题,不然脚本会认为我们FFMPEG未成功的,如果不解决这个问题,编译完后,OpenCV还是没有视频读写模块。
FFMPEG: NO
avcodec: YES (ver 58.54.100)
avformat: YES (ver 58.29.100)
avutil: YES (ver 56.31.100)
swscale: YES (ver 5.5.100)
avresample: NO
怎么解决呢?哈哈哈哈~想知道吗?不告诉你!当然不会了,小编接下来就贴出读代码解决问题的思路,其实面对这个问题,我们一看肯定会很疑惑,为什么子模块都成功,而FFMPEG不通过呢。这其实也是OpenCV编译脚本逻辑是包含了对FFmpeg模块的预测试,但是,交叉编译一般情况下在开发主机上并不能直接运行,所以,问题出在了对FFMPEG模块的测试未通过。针对这个问题,读代码过程就不在赘述了,直接贴出解决方案。
将下面这行内容加入到{$opencv-3.2.0}cmake/checks/ffmpeg_test.cpp
第八行,并保存。
#define __STDC_CONSTANT_MACROS
停停停~!!!这里还有一个问题解决,直接附上解决方法,千万别问小编为什么!
对{$opencv-3.2.0}/modules/videoio/src/cap_ffmpeg_impl.hpp
文件最顶端添加如下内容:
#define AV_CODEC_FLAG_GLOBAL_HEADER (1 << 22)
#define CODEC_FLAG_GLOBAL_HEADER AV_CODEC_FLAG_GLOBAL_HEADER
#define AVFMT_RAWPICTURE 0x0020
保存。
然后再执行以下内容:
cd /opt/opencv-3.2.0/arm-build #切换到编译目录
cmake -D CMAKE_TOOLCHAIN_FILE=../toolchain.cmake ../
再次检查输出信息的FFMPEG部分,该问题解决,并显示如下内容:
FFMPEG: YES
avcodec: YES (ver 58.54.100)
avformat: YES (ver 58.29.100)
avutil: YES (ver 56.31.100)
swscale: YES (ver 5.5.100)
avresample: NO
好啦,cmake-gui赶紧出现吧,这个多人性化啊,直接通过UI界面对可选配置项操作。
来吧!知道你更希望有界面的软件操作!小编更喜欢命令行,因为眼睛不好用~哈哈哈,吹吹牛,别在意啊。
来个分割线
知道你们这么好的东西都安装了,也会使用,所以我就不告诉你怎么安装和使用了。
首先,第一个界面如下图并按照图片中选择然后点击next。
第二个界面,交叉工具链信息配置,配置内容如下图所示:
然后点击finish。cmake-gui会自动load刚才配置的信息。
去掉WITH_CUDA并勾选BUILD_JPEG和WITH_PNG。
然后点击左下角configure按钮。
如果仍然有红色标识条目,需要多次点击configure,待完全通过。点击左下角generate按钮,生成最终Makefile文件。提示框会打印generating done
。
现在距离终点还有百分之10的任务喽,先停下来缓一缓!
好啦好啦!这次就不用休息了。
下面终端切换到编译目录并开始编译并安装吧!
cd /opt/opencv-3.2.0/arm-build
make && make install
最终我们会安装在编译目录下的install目录里。随后我们把install目录里的目录及文件分别拷贝到/opt/arm对应的目录里,并将/opt/arm/lib转移到目标板的/lib目录下。编写一个测试demo测试一下吧。!!!
小编水平有限,如有疏忽见谅!望指正!
同时也期待各位同仁交流学习,本人wx:lilianaismine
。