背景:在rv1126开发板中实现视频图像处理等操作,因此需要用到opencv。rv1126使用的是buildroot系统,故需要在主机中交叉编译opencv+ffmpeg+x264,再移植到rv1126中。
折腾了两周失败过无数次,终于成功了。以下记录本人成功安装的方式,希望对大家有所帮助
目录
一、环境及安装包版本介绍:
由于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
- 下载地址:https://opencv.org/releases/ 选择sources

解压:
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 - 博客园
2975






