rv1126 交叉编译opencv+ffmpeg+x264与简单demo测试

背景:在rv1126开发板中实现视频图像处理等操作,因此需要用到opencv。rv1126使用的是buildroot系统,故需要在主机中交叉编译opencv+ffmpeg+x264,再移植到rv1126中。

折腾了两周失败过无数次,终于成功了。以下记录本人成功安装的方式,希望对大家有所帮助

目录

一、环境及安装包版本介绍:

二、安装包下载与配置

(1) 交叉编译工具

(2) cmake安装

(3) x264安装

(4) ffmpeg安装

(5) opencv安装

(6) 测试验证

三、一些报错问题


一、环境及安装包版本介绍:

由于opencv需要读取视频文件的能力,因此需要一些视频依赖包(ffmpeg+x264)。环境及包参考以下:

ubuntu22.04 + cmake:3.22.1 + opencv:4.5.3 + ffmpeg:4.1.3 + x264 + 交叉编译工具:arm-linux-gnueabihf

二、安装包下载与配置

(1) 交叉编译工具

购买开发板时厂家一般会提供资料包,实在没有也可以通过以下方式安装

  • 解压:
 xz -d gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf.tar.xz
 tar -xvf gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf.tar 
  • 设置环境变量:
sudo vi ~/.bashrc           //编辑bash
export PATH=/home/xxxx/install/rv1126/gcc/linux-x86/arm/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin:$PATH    //将此行添加到bash的最后,注意路径要改成自己的
source ~/.bashrc           //重新执行刚修改的bash文件,使之立即生效
  • 查看是否安装成功:arm-linux-gnueabihf-g++ --version

(2) cmake安装

sudo apt-get install cmake

(3) x264安装

  • 下载
git clone https://code.videolan.org/videolan/x264.git
cd x264
  • 配置编译参数
#!/bin/bash
 
# 设置工具链路径
TOOLCHAIN_PATH=/home/xxxx/install/rv1126/gcc/linux-x86/arm/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf
GCC_COMPILER=${TOOLCHAIN_PATH}/bin/arm-linux-gnueabihf
 
# 设置x264安装路径
X264_INSTALL_DIR=/home/xxxx/install/arm1126/x264
 
# 配置交叉编译选项,直接指定 C 和 C++ 编译器
./configure --prefix=${X264_INSTALL_DIR} \
            --cross-prefix=${GCC_COMPILER}- \
            --cc=${GCC_COMPILER}-gcc \
            --cxx=${GCC_COMPILER}-g++ \
            --host=arm-linux \
            --enable-cross-compile \
            --enable-shared \
            --disable-static \
            --enable-pic \
            --extra-cflags="-g -I${TOOLCHAIN_PATH}/include" \
            --extra-ldflags="-L${TOOLCHAIN_PATH}/lib"
 
 

配置后显示:

  • 开始编译安装
make
make install
  • 查询是否安装成功,是否是arm架构
 
cd /home/xxxx/install/arm1126/x264/lib(x264保存目录)
#验证得到的x264架构
file libx264.so.164 
 

(4) ffmpeg安装

  • 下载
wget https://ffmpeg.org/releases/ffmpeg-4.1.3.tar.bz2
tar -xjf ffmpeg-4.1.3.tar.bz2
cd ffmpeg-4.1.3
  • 编译参数配置
#!/bin/bash
 
# 设置工具链路径
TOOLCHAIN_PATH=/home/xxxx/install/rv1126/gcc/linux-x86/arm/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf
GCC_COMPILER=${TOOLCHAIN_PATH}/bin/arm-linux-gnueabihf
##链接到之前安装的x264
X264_INSTALL_DIR=/home/xxxx/install/arm1126/x264
# 设置FFmpeg安装路径
FFMPEG_INSTALL_DIR=/home/xxxx/install/arm1126/ffmpeg-4.1.3/arm_ffmpeg
  
# 配置交叉编译选项,直接指定 C 和 C++ 编译器
./configure --prefix=${FFMPEG_INSTALL_DIR} \
            --cc=${GCC_COMPILER}-gcc \
            --cxx=${GCC_COMPILER}-g++ \
            --target-os=linux \
            --arch=arm \
            --enable-cross-compile \
            --enable-shared \
            --disable-static \
            --disable-debug \
            --disable-doc \
            --enable-gpl \
            --enable-libx264 \
            --enable-pic \
            --extra-cflags="-I${X264_INSTALL_DIR}/include -I${TOOLCHAIN_PATH}/include" \
            --extra-ldflags="-L${X264_INSTALL_DIR}/lib -L${TOOLCHAIN_PATH}/lib" \
            --strip=${GCC_COMPILER}-strip
  • 编译安装,验证ffmpeg架构
###编译安装
make
make install
###验证ffmpeg架构
cd /home/xxxx/install/ffmpeg-4.1.3/arm_ffmpeg/lib
file libavcodec.so.58.35.100

(5) opencv安装

需要下载opencv-4.5.3 + opencv_contrib-4.5.3

解压:

unzip opencv-4.5.3.zip
cd opencv-4.5.3

在opencv-4.5.3文件夹中下载对应版本的opencv_contrib-4.5.3(暂时不清楚啥原因,直接使用opencv-4.5.3中的modules编译会报错,添加了opencv_contrib-4.5.3,使用里面的modules进行编译则成功了),下载链接:https://github.com/opencv/opencv_contrib/tree/4.5.3

解压:

unzip opencv_contrib-4.5.3.zip
  • 配置编译参数(注意:BUILD_opencv_highgui=OFF是不能使用cv::imshow()、cv::waitKey()以及cv::destroyAllWindows()函数的)

vi test.sh 后添加以下内容

#!/bin/bash
 
set -e 
# 清理并创建构建目录
rm -rf build
mkdir build
cd build
 
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/home/xxxx/install/arm1126/ffmpeg-4.1.3/arm_ffmpeg/lib/pkgconfig
 
# 配置交叉编译选项
cmake -DCMAKE_BUILD_TYPE=RELEASE \
      -DCMAKE_SYSTEM_NAME=Linux \
      -DCMAKE_SYSTEM_PROCESSOR=arm \
      -DCMAKE_C_COMPILER=arm-linux-gnueabihf-gcc \
      -DCMAKE_CXX_COMPILER=arm-linux-gnueabihf-g++ \
      -DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM=NEVER \
      -DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=ONLY \
      -DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=ONLY \
      -DBUILD_SHARED_LIBS=ON \
      -DWITH_FFMPEG=ON \
      -DFFMPEG_INCLUDE_DIRS=/home/xxxx/install/arm1126/ffmpeg-4.1.3/arm_ffmpeg/include \
      -DWITH_1394=OFF \
      -DWITH_GTK=OFF \
      -DWITH_FREETYPE=OFF \
      -DWITH_HARFBUZZ=OFF \
      -DBUILD_opencv_freetype=OFF \
      -DBUILD_opencv_highgui=OFF \
      -DOPENCV_EXTRA_MODULES_PATH=/home/xxxx/install/arm1126/opencv-4.5.3/opencv_contrib-4.5.3/modules \
      -DCMAKE_INSTALL_PREFIX=/home/xxxx/install/arm1126/opencv-4.5.3/arm_opencv \
      ../

sh test.sh后显示ffmpeg支持为NO,测试后发现该情况下是无法读取视频文件的(不过看到有些博主说是可以的,暂时不清楚原由)

解决ffmpeg为NO问题,需要修改文件:opencv-4.5.3/modules/videoio/cmake/detect_ffmpeg.cmake。将以下内容注释掉,重新sh test.sh即可

原因:ffmpeg是否为yes的判断条件除了WITH_FFMPEG=ON外还有HAVE_FFMPEG

  • 编译安装
cd build
make            
make install

(6) 代码测试验证

  • 测试代码test.cpp:
#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;

int main() {
    cv::VideoCapture cap;
    cap.open("/userdata/test/test.mp4"); // rv1126中视频文件地址
    //cap.open("/dev/video45"); //rv1126中usb摄像头编号

    if (!cap.isOpened()) {
        std::cerr << "ERROR: 摄像头无法打开" << std::endl;
        return -1;
    }
    cv::Mat image;
    while (true) {
        cap >> image; // 从摄像头读取新的帧
        if (image.empty()) {
            std::cerr << "ERROR: 帧为空" << std::endl;
            break;
        }         
        cout<<"wh:"<<image.cols<<","<<image.rows<<endl;

    // 释放资源
    }
    cap.release();
    writer.release();
    return 0;    
}
  • CMakeLists.txt内容:
CMAKE_MINIMUM_REQUIRED(VERSION 2.8) #指定CMake编译最低要求版本

PROJECT(demo) #给项目命名

set(CMAKE_SYSTEM_NAME Linux)

# 设置opencv以及ffmpeg路径
SET(OpenCV_LIBS  /home/xxxx/install/arm1126/opencv-4.5.3/arm_opencv/lib)
SET(OpenCV_INCLUDE_DIRS /xxxx/gdcx/install/arm1126/opencv-4.5.3/arm_opencv/include/opencv4/) 
SET(FFMPEG_LIBS /home/xxxx/install/arm1126/ffmpeg-4.1.3/arm_ffmpeg/lib)
SET(FFMPEG_INCLUDE_DIRS /home/xxxx/install/arm1126/ffmpeg-4.1.3/arm_ffmpeg/include)

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -s -O3")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -s -O3")

#指定头文件目录
INCLUDE_DIRECTORIES(${OpenCV_INCLUDE_DIRS})

ADD_EXECUTABLE(demo test.cpp)

# 设置lib绝对路径库链接
link_directories(${OpenCV_LIBS})
link_directories(${FFMPEG_LIBS})
target_link_libraries(demo /home/xxxx/install/arm1126/ffmpeg-4.1.3/arm_ffmpeg/lib/libavcodec.so.58
                           /home/xxxx/install/arm1126/ffmpeg-4.1.3/arm_ffmpeg/lib/libavformat.so.58
                           /home/xxxx/install/arm1126/ffmpeg-4.1.3/arm_ffmpeg/lib/libswresample.so.3
                           /home/xxxx/install/arm1126/ffmpeg-4.1.3/arm_ffmpeg/lib/libavutil.so.56
                           /home/xxxx/install/arm1126/ffmpeg-4.1.3/arm_ffmpeg/lib/libswscale.so.5
                           /home/xxxx/install/arm1126/x264/lib/libx264.so.164
                           /home/xxxx/install/arm1126/opencv-4.5.3/arm_opencv/lib/libopencv_core.so
                           /home/xxxx/install/arm1126/opencv-4.5.3/arm_opencv/lib/libopencv_imgproc.so
                           /home/xxxx/install/arm1126/opencv-4.5.3/arm_opencv/lib/libopencv_imgcodecs.so
                           /home/xxxx/install/arm1126/opencv-4.5.3/arm_opencv/lib/libopencv_videoio.so.4.5.3
)
  • 交叉编译
mkdir build
cd build
cmake  -D CMAKE_CXX_COMPILER=arm-linux-gnueabihf-g++  -D CMAKE_C_COMPILER=arm-linux-gnueabihf-gcc ..
make
  • 将生成的可执行文件demo以及依赖的动态库全部拷贝到rv1126中既可(我个人是把ffmpeg、x264以及opencv,交叉编译生成的lib文件夹下所有的动态库都拷贝到1126中)

之后执行./demo输出wh:xxxx字样即可



三、一些报错问题

  • 编译opencv时出现报错not found (try using -rpath or -rpath-link),相应目录以下文件都是存在的但显示not foud
arm-linux-gnueabihf/bin/ld: warning: libswresample.so.3, 
needed by /home/xxxx/install/arm1126/ffmpeg-4.1.3/arm_ffmpeg/lib/libavcodec.so, 
not found (try using -rpath or -rpath-link)
arm-linux-gnueabihf/bin/ld: warning: libx264.so.164, 
needed by /home/xxxx/install/arm1126/ffmpeg-4.1.3/arm_ffmpeg/lib/libavcodec.so, 
not found (try using -rpath or -rpath-link)

(参考csdn其它伙伴)尝试在CMakeLists.txt中添加ffmpeg以及x264的lib文件路径如下,但不成功;

(参考github opencv issue)尝试将ffmpeg以及x264的lib中文件复制到编译链所在空间gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr该路径下,但不成功;

将找不到的.so文件的绝对路径添加到cmakelists.txt中,还是不成功。。。。。。

还有一堆忘了的失败尝试

最终是将BUILD_opencv_highgui=ON改为OFF,并且下载opencv_contrib-4.5.3使用其modules进行编译如上正文所述,才编译成功。(虽然还是不理解为什么)

  • 虽然编译opencv通过了,但后期编译test.cpp文件时还是出现了类似的错误。这个好解决,将找不到的.so文件的绝对路径添加到cmakelists.txt中即可

参考链接:感谢两位大佬

RV1126编译opencv+ffmpeg+x264_rv1126 opencv ffmpeg-优快云博客

瑞芯微-交叉编译环境搭建-opencv环境搭建(基于RV1109-1126)-(基于ubuntu18.04) - tangjunjun - 博客园

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值