rv1126_rv1109移植opencv and ffmpeg

一、编译环境和源码包

  1. 宿主机:Ubuntu18.04 x64(vpm)

  2. 目标平台:rv1126_rv1109,arm

  3. 交叉编译工具链:arm-linux-gnueabihf

  4. 依赖关系:

opencv(3.4.3) (opencv版本不能太高(选择4.0以下),否则交叉编译无法编译过去)

|--------zlib(1.2.13)

|--------ffmpeg(4.4.2)

|--------libx264 (20181217 (2245-stable))

|--------libxvidcore(1.3.3)

二、前期准备

首先,在opencv所在文件夹(/home/vpm/tjh/rv1126/opencv/opencv-3.4.3)下创建rk_opencv_depend文件夹

cd /home/vpm/tjh/rv1126/opencv/opencv-3.4.3

mkdir rk_opencv_depend

其次,配置开发机环境变量:

(1)sudo su

(2)vim /etc/profile

在最后一行加上以下命令

export PATH=/opt/rockchip/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin:$PATH (添加工具链路径)

export OPENCVDIR=/home/vpm/tjh/rv1126/opencv/opencv-3.4.3 (设置opencv文件夹所在路径)

export PATH= O P E N C V D I R / r k o p e n c v d e p e n d / b i n : OPENCVDIR/rk_opencv_depend/bin: OPENCVDIR/rkopencvdepend/bin:PATH

export LD_LIBRARY_PATH= O P E N C V D I R / r k o p e n c v d e p e n d / l i b : OPENCVDIR/rk_opencv_depend/lib: OPENCVDIR/rkopencvdepend/lib:LD_LIBRARY_PATH

export PATH= O P E N C V D I R / i n s t a l l / b i n : OPENCVDIR/install/bin: OPENCVDIR/install/bin:PATH

export LD_LIBRARY_PATH= O P E N C V D I R / i n s t a l l / l i b : OPENCVDIR/install/lib: OPENCVDIR/install/lib:LD_LIBRARY_PATH

(3)source /etc/profile

(4)arm+tab, 如果能够自动补齐出arm-linux-gnueabihf-*则说明环境变量设置成功

三、源码包的交叉编译

1.zlib交叉编译
(1)./configure --prefix=$OPENCVDIR/rk_opencv_depend //指定安装目录

(2)对Makefile文件进行修改,修改内容如下:

CC=arm-linux-gnueabihf-gcc

LDSHARED=arm-linux-gnueabihf-gcc -shared -Wl,-soname,libz.so.1,–version-script,zlib.map

AR=arm-linux-gnueabihf-ar

RANLIB=arm-linux-gnueabihf-ranlib

(3)make

(4)make install

  1. libx264交叉编译
    (1)./configure --prefix=$OPENCVDIR/rk_opencv_depend --enable-shared --disable-asm --host=arm-linux

(2)打开config.mak进行修改:

CC=arm-linux-gnueabihf-gcc

LD=arm-linux-gnueabihf-gcc -o (末尾需要添加空格,否则会出问题)

LDSHARED=arm-linux-gnueabihf-gcc -shared -Wl,-soname,libz.so.1,–version-script,zlib.map

AR=arm-linux-gnueabihf-ar rc (末尾需要添加空格,否则会出问题)

RANLIB=arm-linux-gnueabihf-ranlib

(3)make

(4)make install

3.libxvidcore交叉编译
(1)cd xvidcore-1.3.3/build/generic

(2)

CC=arm-linux-gnueabihf-gcc ./configure --prefix=$OPENCVDIR/rk_opencv_depend --host=arm-linux --disable-assembly

(3)make

(4)make install

4.ffmpeg交叉编译
编写启动脚本autoffmpegconfig.sh,内容如下:

#!/bin/bash
./configure --prefix= O P E N C V D I R / r k o p e n c v d e p e n d − − d i s a b l e − a s m − − d i s a b l e − x 86 a s m − − e n a b l e − p r o t o c o l = t c p − − e n a b l e − n e t w o r k − − e n a b l e − p r o t o c o l = u d p − − e n a b l e − d e m u x e r = r t s p − − e n a b l e − d e m u x e r = r t p − − d i s a b l e − d o c − − e n a b l e − s h a r e d − − e n a b l e − g p l − − e n a b l e − c r o s s − c o m p i l e − − a r c h = a r m − − d i s a b l e − s t r i p p i n g − − t a r g e t − o s = l i n u x − − e n a b l e − l i b x 264 − − e n a b l e − l i b x v i d − − e n a b l e − a v r e s a m p l e − − e n a b l e − g p l − − e n a b l e − s m a l l − − d i s a b l e − f f p r o b e − − d i s a b l e − f f p l a y − − d i s a b l e − d e b u g − − c c = a r m − l i n u x − g n u e a b i h f − g c c − − e n a b l e − s w s c a l e − − e x t r a − l d f l a g s = − L OPENCVDIR/rk_opencv_depend --disable-asm --disable-x86asm --enable-protocol=tcp --enable-network --enable-protocol=udp --enable-demuxer=rtsp --enable-demuxer=rtp --disable-doc --enable-shared --enable-gpl --enable-cross-compile --arch=arm --disable-stripping --target-os=linux --enable-libx264 --enable-libxvid --enable-avresample --enable-gpl --enable-small --disable-ffprobe --disable-ffplay --disable-debug --cc=arm-linux-gnueabihf-gcc --enable-swscale --extra-ldflags=-L OPENCVDIR/rkopencvdependdisableasmdisablex86asmenableprotocol=tcpenablenetworkenableprotocol=udpenabledemuxer=rtspenabledemuxer=rtpdisabledocenablesharedenablegplenablecrosscompilearch=armdisablestrippingtargetos=linuxenablelibx264enablelibxvidenableavresampleenablegplenablesmalldisableffprobedisableffplaydisabledebugcc=armlinuxgnueabihfgccenableswscaleextraldflags=LOPENCVDIR/rk_opencv_depend/lib --extra-cflags=-I$OPENCVDIR/rk_opencv_depend/include --ar=arm-linux-gnueabihf-ar --ranlib=arm-linux-gnueabihf-ranlib

./autoffmpegconfig.sh

make clean
make
make install

5.opencv交叉编译
1.mkdir release
2.cd release
3.编写cmake文件toolchain.cmake

###########user defined#############
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc)
set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++)
set(OPENCV_ENABLE_PKG_CONFIG ON)

###########user defined#############
set(CMAKE_FIND_ROOT_PATH “/home/vpm/tjh/rv1126/opencv/opencv-3.4.3/rk_opencv_depend”)#这个地方需调整rk_opencv_depend路径
set(FFMPEG_INCLUDE_DIR “/home/vpm/tjh/rv1126/opencv/opencv-3.4.3/rk_opencv_depend/include”)#这个地方需调整rk_opencv_depend路径
set(FFMPEG_LIB_DIR “/home/vpm/tjh/rv1126/opencv/opencv-3.4.3/rk_opencv_depend/lib”)#这个地方需调整rk_opencv_depend路径
set(CMAKE_C_FLAGS “-Wl,-rpath-link=/home/vpm/tjh/rv1126/opencv/opencv-3.4.3/rk_opencv_depend/lib”)#这个地方需调整rk_opencv_depend路径
set(CMAKE_CXX_FLAGS “-Wl,-rpath-link=/home/vpm/tjh/rv1126/opencv/opencv-3.4.3/rk_opencv_depend/lib”)#这个地方需调整rk_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)

4.编写启动脚本autoopencvconfig.sh

#!/bin/bash
cmake -D CMAKE_TOOLCHAIN_FILE=toolchain.cmake -D BUILD_opencv_python3=yes -D BUILD_opencv_python2=no -D PYTHON3_EXECUTABLE=/usr/bin/python3.5m -D PYTHON3_INCLUDE_DIR=/usr/include/python3.5m -D PYTHON3_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython3.5m.so -D PYTHON3_PACKAGES_PATH=/usr/lib/python3/dist-packages -D PYTHON_DEFAULT_EXECUTABLE=/usr/bin/python3.5m -D CMAKE_BUILD_TYPE=Release -D PKG_CONFIG_FOUND=ON -D CMAKE_INSTALL_PREFIX= O P E N C V D I R / i n s t a l l − D B U I L D Z L I B = O N − D B U I L D J P E G = O N − D B U I L D P N G = O N − D B U I L D T I F F = O N − D E N A B L E C X X 11 = O N − D W I T H F F M P E G = O N − D W I T H O P E N C L = O N − D W I T H G T K = O F F − D W I T H O P E N G L = O N − D W I T H O P E N M P = O N − D W I T H P N G = O N − D O P E N C V E N A B L E N O N F R E E = Y E S − D O P E N C V E X T R A M O D U L E S P A T H = OPENCVDIR/install -D BUILD_ZLIB=ON -D BUILD_JPEG=ON -D BUILD_PNG=ON -D BUILD_TIFF=ON -D ENABLE_CXX11=ON -D WITH_FFMPEG=ON -D WITH_OPENCL=ON -D WITH_GTK=OFF -D WITH_OPENGL=ON -D WITH_OPENMP=ON -D WITH_PNG=ON -D OPENCV_ENABLE_NONFREE=YES -D OPENCV_EXTRA_MODULES_PATH= OPENCVDIR/installDBUILDZLIB=ONDBUILDJPEG=ONDBUILDPNG=ONDBUILDTIFF=ONDENABLECXX11=ONDWITHFFMPEG=ONDWITHOPENCL=ONDWITHGTK=OFFDWITHOPENGL=ONDWITHOPENMP=ONDWITHPNG=ONDOPENCVENABLENONFREE=YESDOPENCVEXTRAMODULESPATH=OPENCVDIR/opencv_contrib-3.4.3/modules/ … (红色文字为加入contrib模块,目前contrib模块在此平台编译还有问题,先不加)

  1. export PKG_CONFIG_PATH= P K G C O N F I G P A T H : PKG_CONFIG_PATH: PKGCONFIGPATH:OPENCVDIR/rk_opencv_depend/lib/pkgconfig

6…/autoopencvconfig.sh (执行脚本会存在问题" does not exist.source directory "/home/vpm/tjh/rv1126/opencv/opencv-3.4.3/release/…,将脚本里面的语句拿出来直接执行即可)
当FFMPEG项为YES时继续执行以下命令:

  1. make

  2. make install

四、针对ffmpeg始终为NO的解决方法
1.修改cmake/OpenCVFindLibsVideo.cmake,找到关于ffmpeg的段落进行如下修改

— FFMPEG —

ocv_clear_vars(HAVE_FFMPEG)

if(WITH_FFMPEG) # try FFmpeg autodetection

if(OPENCV_FFMPEG_USE_FIND_PACKAGE)

if(OPENCV_FFMPEG_USE_FIND_PACKAGE STREQUAL “1” OR OPENCV_FFMPEG_USE_FIND_PACKAGE STREQUAL “ON”)

set(OPENCV_FFMPEG_USE_FIND_PACKAGE “FFMPEG”)

endif()

find_package(${OPENCV_FFMPEG_USE_FIND_PACKAGE}) # Required components: AVCODEC AVFORMAT AVUTIL SWSCALE

if(FFMPEG_FOUND OR FFmpeg_FOUND)

set(HAVE_FFMPEG TRUE)

else()

message(STATUS “Can’t find FFmpeg via find_package(${OPENCV_FFMPEG_USE_FIND_PACKAGE})”)

endif()

elseif(WIN32 AND NOT ARM AND NOT OPENCV_FFMPEG_SKIP_DOWNLOAD)

include(“${OpenCV_SOURCE_DIR}/3rdparty/ffmpeg/ffmpeg.cmake”)

download_win_ffmpeg(FFMPEG_CMAKE_SCRIPT)

if(FFMPEG_CMAKE_SCRIPT)

set(HAVE_FFMPEG TRUE)

set(HAVE_FFMPEG_WRAPPER 1)

include(“${FFMPEG_CMAKE_SCRIPT}”)

endif()

elseif(PKG_CONFIG_FOUND)

set(HAVE_FFMPEG TRUE)

ocv_check_modules(FFMPEG libavcodec libavformat libavutil libswscale)

ocv_check_modules(FFMPEG_libavresample libavresample)

if(FFMPEG_libavresample_FOUND)

ocv_append_build_options(FFMPEG FFMPEG_libavresample)

endif()

else()

message(STATUS “Can’t find ffmpeg - ‘pkg-config’ utility is missing”)

endif()

endif()

if(HAVE_FFMPEG

AND NOT HAVE_FFMPEG_WRAPPER

)

set(HAVE_FFMPEG TRUE)

set(FFMPEG_INCLUDE_DIRS /home/vpm/tjh/rv1126/opencv/opencv-3.4.3/rk_opencv_depend/include) #这个地方需调整rk_opencv_depend路径

set(FFMPEG_LIBRARY_DIRS /home/vpm/tjh/rv1126/opencv/opencv-3.4.3/rk_opencv_depend/lib) #这个地方需调整rk_opencv_depend路径

set(FFMPEG_LIBRARIES avcodec avformat avutil swscale z)

message(STATUS “FFMPEG_INCLUDE_DIR: ${FFMPEG_INCLUDE_DIRS}”)

message(STATUS “FFMPEG_LIBRARY_DIRS: ${FFMPEG_LIBRARY_DIRS}”)

message(STATUS “FFMPEG_LIBRARIES: ${FFMPEG_LIBRARIES}”)

try_compile(__VALID_FFMPEG

“${OpenCV_BINARY_DIR}”

“${OpenCV_SOURCE_DIR}/cmake/checks/ffmpeg_test.cpp”

CMAKE_FLAGS “-DINCLUDE_DIRECTORIES:STRING=${FFMPEG_INCLUDE_DIRS}”

“-DLINK_DIRECTORIES:STRING=${FFMPEG_LIBRARY_DIRS}”

“-DLINK_LIBRARIES:STRING=${FFMPEG_LIBRARIES}”

OUTPUT_VARIABLE TRY_OUT

)

if(False)

#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()

endif()

2.修改CMakeVars.txt,找到关于FFMPEG_INCLUDE_DIR=的段落进行修改

FFMPEG_INCLUDE_DIR=/opt/arm_opencv/rk_opencv_depend/include

FFMPEG_INCLUDE_DIRS=/opt/arm_opencv/rk_opencv_depend/include
五、测试代码
#include <opencv2/core/core.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include

using namespace std;
using namespace cv;

int main()
{
string video_address = “rtsp://admin:admin@192.168.8.189”;
Mat frame;
VideoCapture cap;
int ret;

ret = cap.open(video_address, cv::CAP_FFMPEG);
if (ret == 0){
cerr << “ERROR! Unable to open camera!\n”;
return -1;
}
cout << "successfully opened camera ! " << endl;

cap.read(frame);
if (!frame.empty()){
cout << “pic size:” << frame.channels() << “" << frame.cols << "” << frame.rows << endl;
}

string image_address = “./new_image.jpg”;
imwrite(image_address, frame);
cap.release();

return 0;
}
六、注意事项
板端的目录结构和电脑端的目录结构尽量保持一致

原文链接:https://blog.csdn.net/m0_56851289/article/details/125302004

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
敬告:该系列的课程在抓紧录制更新中,敬请大家关注。敬告:本课程项目仅供学习参考,请不要直接商用,概不负责任何法律责任。 该系列的课程涉及:FFmpeg,WebRTC,SRS,Nginx,Darwin,Live555,等。包括:音视频、流媒体、直播、Android、视频监控28181、等。 我将带领大家一起来学习使用FFmpeg开发视频监控项目,并动手操练。具体内容包括: 一、视频监控的架构和流程二、FFmpeg4.3+SDL2+Qt5开发环境的搭建三、FFmpeg的SDK编程回顾总结并操练四、SDL2.0的编程回顾总结并操练五、颜色空间转换RGB和YUV的原理与实战六、Qt5+FFmpeg本地摄像头采集预览实战七、代码封装:摄像头h264/5编码并存储八、Qt5+FFmpeg单路网络摄像头采集预览九、Qt5+FFmpeg单路网络摄像头采集预览录制会看十、onvif与GB/T-28181的简介  音视频与流媒体是一门很复杂的技术,涉及的概念、原理、理论非常多,很多初学者不学 基础理论,而是直接做项目,往往会看到c/c++的代码时一头雾水,不知道代码到底是什么意思,这是为什么呢?   因为没有学习音视频和流媒体的基础理论,就比如学习英语,不学习基本单词,而是天天听英语新闻,总也听不懂。 所以呢,一定要认真学习基础理论,然后再学习播放器、转码器、非编、流媒体直播、视频监控、等等。   梅老师从事音视频与流媒体行业18年;曾在永新视博、中科大洋、百度、美国Harris广播事业部等公司就职,经验丰富;曾亲手主导广电直播全套项目,精通h.264/h.265/aac,曾亲自参与百度app上的网页播放器等实战产品。  目前全身心自主创业,主要聚焦音视频+流媒体行业,精通音视频加密、流媒体在线转码快编等热门产品。  

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值