【Linux】RK3588编译安装 GStreamer 支持的 opencv-python

 一、背景

    之前使用 opencv-python 录制摄像头视频一直存在一个问题,录出的视频文件体积太大,主要问题在于没法控制码率,录制工业相机1小时视频,体积最大能到10G+,码率飙到 20000kbps+,实在恐怖。当时搜遍全网也没找到解决方法,最常见的在 cv2.VideoCapture() 中设置 bitrate 参数也是行不通。

    opencv 的 cv2.VideoWriter() 并没有直接提供参数来设置视频的码率。码率通常是编解码器的属性,而 cv2.VideoWriter() 的设计比较简单,没有暴露这些细节。但可以通过指定合适的编解码器和调整视频的分辨率和帧率来间接影响视频的码率。如果需要更细粒度的控制,建议使用更专业的视频处理库,比如将 GStreamer 管道与 OpenCV 结合,这样可以设置视频的更多属性,包括码率。GStreamer 跟 ffmpeg 一样,也是一个多媒体框架,可以实现采集,编码,解码,渲染,滤镜等媒体解决方案,且支持跨平台实现。

    无奈 opencv 默认关闭了 GStreamer 功能,当时也就没再深究,虽然视频体积大但也就凑合用了。直到最近,趁着手头工作不多,决定抽出一部分时间好好搞一下 opencv,通过源码编译的方式开启 GStreamer 支持,尝试使用 GStreamer 的方式录制视频,设置码率。本文先着重介绍一下如何开启 opencv 的 GStreamer 支持。

二、编译安装

2.1 准备工作

本部分主要参考 [1]

2.1.1 工具

gcc、x264xvidcorezlibffmpeg、opencv

2.1.2 工作目录

将所有工具解压到同一个目录下

同时新建一个文件夹用于存放后面编译好的文件 

mkdir {builddir}

2.1.3 安装插件

sudo apt install make cmake cmake-gui pkg-config

2.1.4 创建虚拟环境

    可以安装 anaconda 创建虚拟环境,或使用系统 python 创建(具体方法可参考上篇文章),由于本人要在原有 conda 虚拟环境中使用 opencv ,所以就直接使用原有 conda 环境。

2.2 编译组件

2.2.1 配置 gcc

sudo vi /etc/profile
export PATH=$PATH:/path/to/your/gcc/bin
source /etc/profile

配置完成后输入

aarch64-linux-gnu-gcc -v

 输出如下内容表示配置成功

2.2.2 编译 zlib

(1)进入目录,进行编译配置

cd /path/to/your/zlib/dir
./configure --prefix=/path/to/your/{builddir}

(2)修改编译文件

vi Makefile

 (3)修改内容

CC=aarch64-linux-gnu-gcc
LDSHARED=aarch64-linux-gnu-gcc -shared -Wl,-soname,libz.so.1,--version-script,zlib.map
AR=aarch64-linux-gnu-ar
RANLIB=aarch64-linux-gnu-ranlib

<think>我们正在RK3588开发板上使用Miniconda创建的虚拟环境rk_env,目标是安装支持GStreamerOpenCV,并确保在Python环境中可以运行。由于RK3588是ARM架构(aarch64),我们需要注意交叉编译或寻找预编译包,但通常我们可以从源码编译OpenCV以适应特定环境。根据引用[1]和引用[3],我们知道:-OpenCVPython绑定需要对应Python版本(这里我们使用rk_env中的Python,可能是Python3)。-需要确保编译时启用了GStreamer支持(引用[3]提到,必须保证OpenCV编译支持gstreamer,否则输出部分会报错)。由于我们是在开发板上直接编译(或者使用预编译的包,但支持GStreamer的预编译包可能不易获得),通常需要从源码编译。但考虑到在开发板上编译OpenCV可能耗时较长(几个小时),我们需要准备足够的资源。步骤概述:1.激活conda虚拟环境rk_env,并安装必要的编译工具和依赖项。2.下载OpenCV源码。3.配置CMake,确保启用Python绑定、GStreamer以及可能的CUDA(如果需要)等。4.编译安装OpenCV。5.验证安装,特别是GStreamer支持。详细步骤:###1.准备环境和依赖激活conda环境:```bashcondaactivaterk_env```安装编译所需的工具和依赖库:```bashsudoapt-getupdatesudoapt-getinstall-ybuild-essentialcmakegitpkg-config#安装图像和视频编解码库sudoapt-getinstall-ylibjpeg-devlibpng-devlibtiff-devsudoapt-getinstall-ylibavcodec-devlibavformat-devlibswscale-devlibv4l-devsudoapt-getinstall-ylibxvidcore-devlibx264-dev#安装GTK(用于imshow,可选)和GStreamersudoapt-getinstall-ylibgtk-3-devsudoapt-getinstall-ylibgstreamer1.0-devlibgstreamer-plugins-base1.0-dev#安装Python开发头文件(conda环境中已包含,但为了其他依赖)#注意:conda环境中的Python可能已经带有开发头文件,如果没有,需要安装python-dev#但是conda环境下,我们使用conda的Python,所以不需要系统Python的头文件,但需要确保环境中有Python.h。如果conda环境没有,可以安装:condainstallpython-dev#对于Python3,可能是python3-dev,但在conda中可能是另一个包名。实际上,conda的Python包通常已经包含头文件。#如果conda环境中没有,可以尝试:#condainstallinclude#这个包可能不存在,实际上conda的python包已经包含头文件。#或者安装:condainstall-canacondapython重新安装python可能会覆盖,所以不建议。我们直接检查是否有/include目录在conda环境路径下。#安装numpy,因为OpenCVPython绑定需要condainstallnumpy```###2.下载OpenCV源码建议选择较新的稳定版本,例如4.5.5或4.6.0。这里以4.5.5为例:```bashcd~gitclonehttps://github.com/opencv/opencv.gitcdopencvgitcheckout4.5.5```如果需要opencv_contrib模块(包含额外功能),也一并下载:```bashcd~gitclonehttps://github.com/opencv/opencv_contrib.gitcdopencv_contribgitcheckout4.5.5```###3.配置CMake在opencv目录下创建build目录并进入:```bashcd~/opencvmkdirbuildcdbuild```配置CMake,注意指定Python解释器和库路径(使用conda环境中的Python),以及启用GStreamer:```bashcmake-DCMAKE_BUILD_TYPE=RELEASE\-DCMAKE_INSTALL_PREFIX=/usr/local\-DOPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules\-DPYTHON3_EXECUTABLE=$(whichpython)\-DPYTHON3_INCLUDE_DIR=$(python-c"fromdistutils.sysconfigimportget_python_inc;print(get_python_inc())")\-DPYTHON3_LIBRARY=$(python-c"importos;fromdistutils.sysconfigimportget_config_var;print(os.path.join(get_config_var('LIBDIR'),get_config_var('LDLIBRARY')))")\-DPYTHON3_NUMPY_INCLUDE_DIRS=$(python-c"importnumpy;print(numpy.get_include())")\-DPYTHON3_PACKAGES_PATH=$(python-c"fromdistutils.sysconfigimportget_python_lib;print(get_python_lib())")\-DWITH_GSTREAMER=ON\-DBUILD_opencv_python3=ON\-DBUILD_opencv_python2=OFF\-DBUILD_EXAMPLES=OFF\-DBUILD_TESTS=OFF\-DBUILD_PERF_TESTS=OFF\..```注意:由于我们在conda环境中,`PYTHON3_EXECUTABLE`应该指向conda环境中的python。上面的命令中,我们使用`$(whichpython)`来获取当前激活的conda环境中的python路径。但是,在ARM架构上,可能会遇到一些库的缺失,需要根据错误信息安装相应的依赖。另外,如果需要使用CUDA(RK3588有GPU),可以加上CUDA的选项,但OpenCV对CUDA的支持可能需要额外的配置,而且RK3588的GPU是Mali,驱动可能有所不同。这里我们暂时不考虑CUDA,因为主要目标是GStreamer。###4.编译安装使用make进行编译(根据开发板的处理器核心数,使用-j参数指定并行数,例如4核:-j4):```bashmake-j4#根据实际核心数调整```如果编译成功,进行安装:```bashsudomakeinstall```注意:安装目录为`/usr/local`,但我们希望安装到conda环境中?其实上面的配置中,我们指定了`PYTHON3_PACKAGES_PATH`,所以编译出来的Python模块(cv2.so)会安装到conda环境的site-packages中。另外,我们可以使用`-DCMAKE_INSTALL_PREFIX=/path/to/conda/env`来指定安装前缀到conda环境,但是通常conda环境中,我们只需要将生成的cv2.so放入site-packages即可。而上面的配置已经通过`PYTHON3_PACKAGES_PATH`指定了安装位置,所以会直接安装到conda环境。但是,OpenCV的库文件(动态库)会被安装到`/usr/local/lib`,为了让程序在运行时能够找到这些库,需要将`/usr/local/lib`添加到库搜索路径中(见引用[2]):```bashsudosh-c'echo"/usr/local/lib">/etc/ld.so.conf.d/opencv.conf'sudoldconfig```或者在conda环境中设置环境变量(不推荐,因为涉及到系统级库):在conda环境的激活脚本中添加:```bashexportLD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH```但是,更推荐使用系统级别的配置(ldconfig)方法。###5.验证安装在conda环境中运行python,导入cv2并检查GStreamer支持:```pythonimportcv2print(cv2.getBuildInformation())#查看构建信息,搜索GStreamer,应该为YES```也可以检查视频写入时使用GStreamer后端(可选):```pythonprint(cv2.videoio_registry.getBackendName(cv2.CAP_GSTREAMER))```或者检查是否有GStreamer相关的后端:```pythonbackends=[bforbindir(cv2.videoio_registry)ifb.startswith('CAP_GSTREAMER')]ifbackends:print("GStreamer支持已启用")```注意:如果运行程序时出现找不到库的情况,请确保运行了`sudoldconfig`。###替代方案:使用预编译的包?在ARM平台上,预编译OpenCV包可能很难找到,尤其是支持GStreamer的。因此,从源码编译通常是唯一选择。另外,Rockchip官方可能提供了针对RK3588优化的OpenCV,建议先查看Rockchip的GitHub或Wiki。如果有,可以直接使用他们的包,避免长时间编译。总结:在RK3588编译支持GStreamerOpenCV需要耐心,但按照上述步骤应该可以完成。注意配置CMake时确保GStreamer为ON,并且正确指向conda环境的Python路径。§§相关问题§§1.如何减少OpenCVRK3588上的编译时间?2.如果编译过程中出现错误,如何调试?3.如何验证安装OpenCV是否支持硬件编解码?4.如何在RK3588上配置GStreamer管道以用于OpenCV视频处理?</think> 根据您的需求,在RK3588开发板的Miniconda环境中安装支持GStreamerOpenCV,以下是完整解决方案: ### 环境准备步骤 1. **激活Miniconda环境** ```bash conda activate rk_env ``` 2. **安装系统依赖** ```bash sudo apt-get update sudo apt-get install -y \ build-essential cmake git libgtk-3-dev \ libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev \ gstreamer1.0-plugins-good gstreamer1.0-plugins-bad \ libavcodec-dev libavformat-dev libswscale-dev ``` 3. **安装Python依赖** ```bash conda install -y numpy scipy matplotlib pip install testresources ``` ### OpenCV源码编译 ```bash # 下载源码 git clone --depth 1 --branch 4.8.0 https://github.com/opencv/opencv.git cd opencv mkdir build && cd build # 配置CMake(关键步骤) cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/usr/local \ -D WITH_GSTREAMER=ON \ -D GSTREAMER_INCLUDE_DIRS=$(pkg-config --cflags-only-I gstreamer-1.0 | sed 's/-I//g') \ -D PYTHON3_EXECUTABLE=$(which python) \ -D PYTHON3_INCLUDE_DIR=$(python -c "from distutils.sysconfig import get_python_inc; print(get_python_inc())") \ -D PYTHON3_PACKAGES_PATH=$(python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())") \ .. # 编译安装 make -j$(nproc) sudo make install ``` ### 环境验证 1. **配置动态链接库** ```bash sudo sh -c 'echo "/usr/local/lib" > /etc/ld.so.conf.d/opencv.conf' sudo ldconfig ``` 2. **Python环境验证** ```python import cv2 print(f"OpenCV版本: {cv2.__version__}") print("GStreamer支持:", "YES" if 'GSTREAMER: YES' in cv2.getBuildInformation() else "NO") ``` ### GStreamer功能测试 ```python import cv2 # 创建GStreamer管道 pipeline = "appsrc ! videoconvert ! x264enc ! rtph264pay ! udpsink host=127.0.0.1 port=5000" out = cv2.VideoWriter(pipeline, cv2.CAP_GSTREAMER, 0, 30, (640,480)) # 验证输出 if out.isOpened(): print("GStreamer管道已激活") out.release() else: print("错误: 检查GStreamer配置[^3]") ``` > **关键提示** > 1. 必须确认CMake输出包含 `GStreamer: YES`[^3] > 2. RK3588需要启用NEON优化,在CMake中添加 `-D ENABLE_NEON=ON` > 3. 如遇视频编码问题,添加 `-D WITH_GTK=ON -D WITH_FFMPEG=ON`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值