当前位置: 首页 > news >正文

改进后的 OpenCV 5.x + GStreamer + Python 3.12 编译流程(适用于 Orange Pi / ARM64)

主要用opencv读取hdmiin接口数据,原配的opencv-python不支持GStreamer所以要重新编译,安装miniconda后


📦 1. 安装系统依赖(一次即可)
sudo apt update
sudo apt install -y build-essential cmake git pkg-config \libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev \libgtk-3-dev libjpeg-dev libpng-dev libtiff-dev \libavcodec-dev libavformat-dev libswscale-dev \libv4l-dev libxvidcore-dev libx264-dev \python3-dev python3-numpy

🐍 2. 创建 Conda 环境(建议已完成)
conda create -n py312_gst python=3.12 -y
conda activate py312_gst
pip install numpy

🔽 3. 下载 OpenCV 源码(保留 5.x 分支)
git clone https://github.com/opencv/opencv.git
cd opencv
git checkout 5.x
cd ..git clone https://github.com/opencv/opencv_contrib.git
cd opencv_contrib
git checkout 5.x
cd ..

⚙️ 4. 配置 CMake 构建(更新后的完整命令)
mkdir build_opencv && cd build_opencvcmake ../opencv \-D CMAKE_BUILD_TYPE=Release \-D CMAKE_INSTALL_PREFIX=~/opencv-gst-install \-D OPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules \-D WITH_GSTREAMER=ON \-D WITH_GTK=ON \-D WITH_FFMPEG=ON \-D BUILD_opencv_highgui=ON \-D WITH_V4L=ON \-D WITH_OPENGL=OFF \-D BUILD_EXAMPLES=OFF \-D BUILD_opencv_python3=ON \-D OPENCV_ENABLE_NONFREE=ON \-D PYTHON3_EXECUTABLE=$(which python) \-D PYTHON3_INCLUDE_DIR=$(python -c "from sysconfig import get_paths; print(get_paths()['include'])") \-D PYTHON3_LIBRARY=$(python -c "import sysconfig, sys; print(sysconfig.get_config_var('LIBDIR') + '/libpython' + sys.version[:3] + '.so')") \-D PYTHON3_PACKAGES_PATH=$(python -c "import site; print(site.getsitepackages()[0])")

✅ 本配置已适配你的 ARM64/OrangePi 环境,使用系统 GStreamer 开发包,确保与 OpenCV 动态链接。


🧱 5. 编译与安装
make -j$(nproc)
make install

🐍 6. 拷贝 Python 模块到当前环境(或设置 PYTHONPATH)
cp ~/opencv-gst-install/lib/python3*/site-packages/cv2/python-3.12/cv2*.so $(python -c "import site; print(site.getsitepackages()[0])")

或使用:

export PYTHONPATH=~/opencv-gst-install/lib/python3.12/site-packages:$PYTHONPATH

✅ 7. 验证 GStreamer 支持
python -c "import cv2; print( cv2.getBuildInformation() )"

一键生成whl安装包

下面是一个完整的脚本,可以从你已经安装好的 OpenCV 目录 /home/orangepi/opencv-gst-install/ 中提取 Python 模块 cv2 和所有 .so 动态库,打包成一个离线 .whl 安装包,方便在其他 ARM64 机器上直接使用。


✅ 一键生成 OpenCV .whl 安装包脚本

保存为:build_opencv_whl.sh

#!/bin/bash
set -e# 变量设置
INSTALL_DIR="/home/orangepi/opencv-gst-install"
BUILD_DIR="$HOME/opencv_whl_build"
PYTHON_VERSION="3.12"
PYTHON_TAG="cp312"
ARCH="aarch64"
CV2_SO_PATH="$(find $HOME/build_opencv -name "cv2*.so" | head -n 1)"if [ ! -f "$CV2_SO_PATH" ]; thenecho "❌ 找不到 cv2.so 文件,确保你已经完成 OpenCV 编译"exit 1
fi# 清理旧目录
rm -rf "$BUILD_DIR"
mkdir -p "$BUILD_DIR/opencv_python_custom/cv2"# 拷贝 cv2.so
cp "$CV2_SO_PATH" "$BUILD_DIR/opencv_python_custom/cv2/"# 拷贝所有 .so 动态库
cp "$INSTALL_DIR/lib/"libopencv_*.so* "$BUILD_DIR/opencv_python_custom/cv2/"# 创建空的 __init__.py
touch "$BUILD_DIR/opencv_python_custom/cv2/__init__.py"# 生成 setup.py
cat > "$BUILD_DIR/setup.py" <<EOF
from setuptools import setup
from setuptools.dist import Distributionclass BinaryDistribution(Distribution):def has_ext_modules(self):return Truesetup(name='opencv_python_gstreamer',version='5.0.0',packages=['cv2'],package_dir={'cv2': 'opencv_python_custom/cv2'},package_data={'cv2': ['*.so*']},include_package_data=True,zip_safe=False,distclass=BinaryDistribution,
)
EOF# 打包 whl
cd "$BUILD_DIR"
python setup.py bdist_wheelecho "✅ 构建完成!whl 文件位置:"
find dist/ -name "*.whl"

✅ 使用说明

  1. 确保你已经安装了 Python setuptools 和 wheel:

    conda activate py312_gst
    pip install setuptools wheel
    
  2. 运行脚本:

    chmod +x build_opencv_whl.sh
    ./build_opencv_whl.sh
    
  3. 会生成类似:

    dist/opencv_python_gstreamer-5.0.0-py3-none-any.whl
    

✅ 在其它机器上部署:

在另一台机器上安装:

pip install ./opencv_python_gstreamer-5.0.0-py3-none-any.whl

注意:此 .whl 实际不是 pure Python,因此建议手动加上 --force-reinstall 以避免安装冲突。


是否还需要我为你加一段自动检测缺失依赖(如 GTK, GStreamer)的代码?

http://www.lryc.cn/news/586896.html

相关文章:

  • 3.7 ASPICE的问题解决与改进过程
  • Linux-网络管理
  • iTestin 自动化录制工具
  • Kimi K2深度解析:开源万亿参数大模型,复杂场景能力强悍,为AI Agent而生!
  • Vision Kit之文档扫描
  • 【PyMuPDF】PDF图片处理过程内存优化分析
  • 论文Review 3DGSSLAM GauS-SLAM: Dense RGB-D SLAM with Gaussian Surfels
  • kettle从入门到精通 第102课 ETL之kettle xxl-job调度kettle的两种方式
  • 归并排序递归法和非递归法的简单简单介绍
  • 三种网络类型
  • X00211-基于残差edge-graph注意力机制的深度强化学习优化车辆路径问题
  • RedisJSON 技术揭秘(五)`JSON.ARRPOP` 原子弹出 修改数组的终极手段
  • 基于Java Web的销售管理系统设计系统
  • 操作系统--用户态和内核态
  • MongoDB对接SpringBoot【大数据存储】
  • ref 和 reactive
  • https交互原理
  • [Subtitle Edit] 字幕格式处理 | .Net依赖管理(NuGet)
  • Python----OpenCV(图像分割——彩色图像分割,GrabCut算法分割图像)
  • LeetCode--44.通配符匹配
  • Mybatis 两级缓存可能导致的问题
  • Java4种设计模式详解(单例模式、工厂模式、适配器模式、代理模式)
  • 笔记/sklearn中的数据划分方法
  • 赛力斯6月新能源汽车销量46086辆,同比增长4.44%
  • JavaScript加强篇——第九章 正则表达式高级应用(终)
  • Linux编程:6、进程通信-信号量与共享内存
  • OpenLayers 入门指南【二】:坐标系与投影转换
  • linux进程信号II
  • Node.js特训专栏-实战进阶:16. RBAC权限模型设计
  • 基于YOLOv7的改进模型:集成Swin Transformer和ASFF模块