opencv交叉编译静态库,支持ffmpeg、libjpeg,实现取流及写入jpeg文件

一、准备工作
1、虚拟机+交叉编译链
2、在虚拟机目录下创建工作目录,注意不要选择windows共享目录,比如这里选择:
/home/cxyazhou/work
3、虚拟机安装cmake cmake-gui pkg-config,直接apt install即可
4、源码下载,需要x264、ffmpeg、libjpeg-turbo、opencv四个工程的源码,将其放在/home/cxyazhou/work目录下,如下:
x264-master.tar.bz2 FFmpeg-n4.3.6.zip libjpeg-turbo-2.1.91.tar.gz opencv-4.7.0.zip
下载源码
5、创建install目录
mkdir /home/cxyazhou/work/opencv
二、编译x264
1、解压源码并且进入源码目录
2、编译动态库,目的是编译ffmpeg使用,命令如下:
#./configure --prefix=/home/cxyazhou/work/opencv --host=arm-linux --cross-prefix=arm-himix200-linux- --disable-asm --enable-shared
#make -j6
#make install
3、编译静态库,目的是最后我们的应用程序链接使用,命令如下:
#./configure --prefix=/home/cxyazhou/work/opencv --host=arm-linux --cross-prefix=arm-himix200-linux- --disable-asm
#make clean;make -j6
#make install
注意:静态库编译时,make install只会拷贝bin下的文件到install目录,所以这里需要手动拷贝头文件、静态库到install目录,基于上面已经编译了动态库,会自动拷贝头文件,这里我们只要拷贝静态库到install的lib目录就可以:
#cp libx264.a /home/cxyazhou/work/opencv/lib/
三、编译ffmpeg
1、解压源码并且进入源码目录
2、编译静态库,命令如下:
#./configure --cross-prefix=arm-himix200-linux- --enable-cross-compile --target-os=linux --cc=arm-himix200-linux-gcc --arch=arm64 --prefix=/home/cxyazhou/work/opencv --enable-ffmpeg --disable-armv5te --disable-armv6 --disable-armv6t2 --disable-asm --enable-swscale --enable-avresample --enable-gpl --enable-libx264 --extra-cflags=-I/home/cxyazhou/work/opencv/include --extra-ldflags=-L/home/cxyazhou/work/opencv/lib
#make -j6
#make install
3、编译动态库记录(这里只是暂时记录动态库使用的问题,可跳过)
#./configure --cross-prefix=arm-himix200-linux- --enable-cross-compile --target-os=linux --cc=arm-himix200-linux-gcc --arch=arm64 --prefix=/home/cxyazhou/work/opencv --enable-ffmpeg --disable-armv5te --disable-armv6 --disable-armv6t2 --disable-asm --enable-swscale --enable-avresample --enable-gpl --enable-libx264 --extra-cflags=-I/home/cxyazhou/work/opencv/include --extra-ldflags=-L/home/cxyazhou/work/opencv/lib --enable-shared
#make -j6
#make install
问题:如果使用动态库,后面编译opencv的时候ffmpeg选项始终为no,首先是cmake测试ffmpeg是否可以成功编译时,返回不成功,打印如下:WARNING: Can’t build ffmpeg test code。然后使用cmake给的编译参数,我们自己去测试是否可以编译成功,结果也是不成功,原因是:ffmpeg的多个动态库有互相依赖,所以编译时找不到一些符号。解决办法:增加编译参数:-Wl,-rpath-link=/home/cxyazhou/work/opencv/lib。这样的话,我们自己编译就可以通过。所以如果想让cmake测试通过,也需要增加此参数,如何增加暂时未研究。也可以直接修改cmake使其通过ffmpeg的验证,请看后续内容。
四、编译libjpeg-turbo
1、解压源码并且进入源码目录
2、运行cmake-gui
(1)、配置源码目录:/home/cxyazhou/work/libjpeg-turbo-2.1.91
(2)、编译目录:/home/cxyazhou/work/libjpeg-turbo-2.1.91_build
(3)、配置编译链
在这里插入图片描述
在这里插入图片描述
(4)、CMAKE_INSTALL_PRIFIX选择:/home/cxyazhou/work/opencv
(5)、BUILD_SHARED_LIBS去掉
(6)、点击Configure
(7)、点击Generate,然后退出
3、进入build目录,进行编译
#cd /home/cxyazhou/work/libjpeg-turbo-2.1.91_build
#make -j6
#make install
五、编译opencv
1、解压源码并且进入源码目录
2、设置pkg环境变量,目的是cmake编译opencv时,可以找到对应的依赖库,命令如下:
#export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/home/cxyazhou/work/opencv/lib/pkgconfig/
3、运行cmake-gui
(1)、配置源码目录:/home/cxyazhou/work/opencv-4.7.0
(2)、编译目录:/home/cxyazhou/work/opencv-4.7.0_build
(3)、配置编译链
在这里插入图片描述
在这里插入图片描述
(4)、CMAKE_INSTALL_PRIFIX选择:/home/cxyazhou/work/opencv
(5)、BUILD_SHARED_LIBS去掉
(6)、BUILD_ZLIB加上
(7)、添加 OPENCV_ENABLE_PKG_CONFIG 并设置为true
在这里插入图片描述

(8)、去掉不需要的模块
(9)、点击Configure
(10)、检测ffmpeg选项是否为yes,否则强制解决 ffmpeg选项始终为no 的问题,直接修改cmake文件,使其通过!

vi cmake/OpenCVFindLibsVideo.cmake
#if(NOT __VALID_FFMPEG)
#message(FATAL_ERROR "FFMPEG: test check build log:\n${TRY_OUT}")
#message(STATUS "WARNING: Can't build ffmpeg test code")
#   set(HAVE_FFMPEG FALSE)
# else()
ocv_append_build_options(VIDEOIO FFMPEG)
# endif()

或者

vi modules/videoio/cmake/detect_ffmpeg.cmake
  if(NOT __VALID_FFMPEG)
    # message(FATAL_ERROR "FFMPEG: test check build log:\n${TRY_OUT}")
    message(STATUS "WARNING: Can't build ffmpeg test code")
    #set(HAVE_FFMPEG FALSE)
  endif()

(11)、点击Generate,然后退出
4、进入build目录,进行编译
#cd /home/cxyazhou/work/opencv-4.7.0_build
#make -j6
#make install
六、库整理
1、删除x264动态库
2、ffmpeg、x264、libjpeg-turbo、opencv(含依赖库)头文件、静态库分模块存放
七、编译不通过解决备注:
1、liblibpng.a找不到符号:undefined reference to `png_do_expand_palette_rgb8_neon‘
打开opencv源码目录,编辑文件 vim 3rdparty/libpng/pngpriv.h
第130行注释掉, 修改为131行

 130 /* #  if (defined(__ARM_NEON__) || defined(__ARM_NEON)) && \ */
 131 # if defined(PNG_ARM_NEON) && (defined(__ARM_NEON__) || defined(__ARM_NEON)) && \
 132    defined(PNG_ALIGNED_MEMORY_SUPPORTED)
 133 #     define PNG_ARM_NEON_OPT 2
 134 #  else
 135 #     define PNG_ARM_NEON_OPT 0
 136 #  endif
 137 #endif

2、某些编译链不支持C++的某些特性,可以选择低版本源码编译。
3、libjpeg-turbo报错,在报错位置添加aarch64
vi libjpeg-turbo-2.1.91/CMakeLists.txt
set(CMAKE_SYSTEM_PROCESSOR “aarch64”)

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员阿周

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值