rv1126_rv1109移植opencv with ffmpeg for rtsp

目录

一、编译环境和源码包

二、前期准备

三、源码包的交叉编译

1.zlib交叉编译

2.libx264交叉编译

3.libxvidcore交叉编译

4.ffmpeg交叉编译

5.opencv交叉编译

四、针对ffmpeg始终为NO的解决方法

五、测试代码

六、注意事项


一、编译环境和源码包

1. 宿主机:Ubuntu18.04 x64

2. 目标平台:rv1126_rv1109,arm

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

4. 依赖关系:

opencv(3.4.12)

        |--------zlib(1.2.11)

        |--------ffmpeg(4.1.3)

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

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

二、前期准备

配置开发机环境变量:

(1)sudo su

(2)vim /etc/profile

在最后一行加上以下命令

export PATH=/home/xx/work/rkSDk/rv1126_rv1109_v2.2.2/buildroot/output/rockchip_rv1126_rv1109/host/bin:$PATH

export OPENCVDIR=/opt/arm_opencv

export PATH=$OPENCVDIR/rk_opencv_depend/bin:$PATH

export LD_LIBRARY_PATH=$OPENCVDIR/rk_opencv_depend/lib:$LD_LIBRARY_PATH

export PATH=$OPENCVDIR/install/bin:$PATH

export LD_LIBRARY_PATH=$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

2.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

RANLIB=arm-linux-gnueabihf-ranlib

(3)make

(4)make install

 //make install-lib-static 编译成静态库

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交叉编译

  1. 编写启动脚本autoffmpegconfig.sh
    #!/bin/bash
    ./configure --prefix=$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/opt/arm_opencv/rk_opencv_depend/lib \
    --extra-cflags=-I/opt/arm_opencv/rk_opencv_depend/include \
    --ar=arm-linux-gnueabihf-ar \
    --ranlib=arm-linux-gnueabihf-ranlib
  2. ./autoffmpegconfig.sh
  3. make
  4. 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 "/opt/arm_opencv/rk_opencv_depend")
    set(FFMPEG_INCLUDE_DIR "/opt/arm_opencv/rk_opencv_depend/include")
    set(FFMPEG_LIB_DIR "/opt/arm_opencv/rk_opencv_depend/lib")
    set(CMAKE_C_FLAGS "-Wl,-rpath-link=/opt/arm_opencv/rk_opencv_depend/lib")
    set(CMAKE_CXX_FLAGS "-Wl,-rpath-link=/opt/arm_opencv/rk_opencv_depend/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)
  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.7m \
    -D PYTHON3_INCLUDE_DIR=/usr/include/python3.7m \
    -D PYTHON3_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython3.7m.so \
    -D PYTHON3_PACKAGES_PATH=/usr/lib/python3/dist-packages \
    -D PYTHON_DEFAULT_EXECUTABLE=/usr/bin/python3.7m \
    -D CMAKE_BUILD_TYPE=Release \
    -D PKG_CONFIG_FOUND=ON \
    -D CMAKE_INSTALL_PREFIX=/opt/arm_opencv/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 ..
  5. export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/opt/arm_opencv/rk_opencv_depend/lib/pkgconfig
  6. ./autoopencvconfig.sh

     当FFMPEG项为YES时继续执行以下命令

      7. make

      8. 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 /opt/arm_opencv/rk_opencv_depend/include)

  set(FFMPEG_LIBRARY_DIRS /opt/arm_opencv/rk_opencv_depend/lib)

  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 <iostream>

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;
}

六、注意事项

        板端的目录结构和电脑端的目录结构需要保持一致

  • 2
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
CMake是一个跨平台的开源构建工具,可用于自动化管理项目的编译过程。FFmpeg是一个开源的音视频处理,可以用来处理多种格式的音视频文件。而最后的下载的文件opencv_ffmpeg_64.dll是OpenCV所需的FFmpeg动态链接。 当我们在使用CMake构建一个项目时,可能会用到FFmpeg来进行音视频处理。其中,OpenCV是一个广泛使用的计算机视觉,它也能够使用FFmpeg进行音视频的编解码与处理。而opencv_ffmpeg_64.dll是OpenCV所需的FFmpeg依赖,这个在运行OpenCV相关功能时需要被加载。 如果在使用CMake构建一个依赖于OpenCVFFmpeg的项目时,若缺少opencv_ffmpeg_64.dll文件,可以通过下载获得该文件。可以通过在网上搜索opencv_ffmpeg_64.dll文件的下载链接,并将其下载到本地。下载完成后,将该文件放置在项目中指定的位置,一般来说是与其他的动态链接(.dll文件)放在一起的。然后重新进行CMake构建,以确保项目能够正确加载该文件。 需要注意的是,下载的文件必须与你的系统和项目的架构相匹配。例如,如果你的系统是64位的,那么你需要下载64位的opencv_ffmpeg_64.dll文件,而不是32位的。如果下载的文件与你的系统不匹配,可能会导致项目构建失败或运行时错误。 总结来说,下载opencv_ffmpeg_64.dll文件是为了满足OpenCV在进行音视频处理时所依赖的FFmpeg的加载需求。在使用CMake构建项目时,下载并正确放置该文件,可以确保项目能够正确运行。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值