在Conda环境中从源代码编译OpenCV(支持CUDA和GStreamer)

以下是完整的方案步骤,包括必要的依赖库安装过程:

1. 安装Miniconda(如果尚未安装)

# 下载Miniconda安装脚本
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh# 安装Miniconda
bash Miniconda3-latest-Linux-x86_64.sh# 初始化conda
conda init bash# 重启终端或执行
source ~/.bashrc

2. 创建并激活Conda环境

# 创建环境
conda create -n  opencvcuda python=3.9 -y
conda activate opencvcuda # 安装编译工具和依赖
#conda install cmake ninja git -y(这个没有做)
conda install  ffmpeg gstreamer gst-plugins-base gst-plugins-good -y
conda install numpy -y

3. 安装系统级依赖

# 安装编译OpenCV所需的系统库
sudo apt-get update
sudo apt-get install -y build-essential
sudo apt-get install -y libgtk-3-dev libjpeg-dev libpng-dev libtiff-dev libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install -y libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
sudo apt-get install -y libxvidcore-dev libx264-dev libatlas-base-dev gfortran
sudo apt-get install -y libtbb2 libtbb-dev libdc1394-22-dev(这个包似乎没有)

添加:export GST_PLUGIN_PATH=/usr/lib/x86_64-linux-gnu/gstreamer-1.0:$GST_PLUGIN_PATH到环境变量中。

4. 下载OpenCV源代码

# 创建工作目录
mkdir -p ~/opencv_build && cd ~/opencv_build# 下载OpenCV和OpenCV_contrib
wget -O opencv.zip https://github.com/opencv/opencv/archive/4.8.0.zip
wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.8.0.zip# 解压
unzip opencv.zip
unzip opencv_contrib.zip# 重命名目录(为什么要重命名呢,不需要也行)
mv opencv-4.8.0 opencv
mv opencv_contrib-4.8.0 opencv_contrib

5. 配置CMake

# 创建构建目录
mkdir -p build && cd build
#install_path=install
# 配置CMake(根据你的CUDA版本和GPU架构调整)
cmake -G "Unix Makefiles" \-D CMAKE_BUILD_TYPE=RELEASE \-D CMAKE_INSTALL_PREFIX=$CONDA_PREFIX \-D WITH_CUDA=ON \-D WITH_CUDNN=ON \-D OPENCV_DNN_CUDA=ON \-D CUDA_ARCH_BIN="7.5;8.0;8.6;8.9" \-D WITH_GSTREAMER=ON \-D WITH_LIBV4L=ON \-D BUILD_opencv_python2=OFF \-D BUILD_opencv_python3=ON \-D PYTHON3_EXECUTABLE=$(which python) \-D PYTHON3_INCLUDE_DIR=$(python -c "from distutils.sysconfig import get_python_inc; print(get_python_inc())") \-D PYTHON3_NUMPY_INCLUDE_DIRS=$(python -c "import numpy; print(numpy.get_include())") \-D OPENCV_EXTRA_MODULES_PATH=../opencv_contrib-4.8.0/modules \-D INSTALL_PYTHON_EXAMPLES=OFF \-D INSTALL_C_EXAMPLES=OFF \-D BUILD_EXAMPLES=OFF \../opencv-4.8.0 #这里是上面对应的mv opencv-4.8.0 opencv 重命名后的路径# 编译(使用CPU核心数加速)
make -j$(nproc)
# 安装到指定路径(根据脚本中的install_path变量)
make install  

注意CUDA_ARCH_BIN参数应根据你的GPU架构调整。常见值:

  • RTX 40系列:8.9
  • RTX 30系列:8.6
  • RTX 20系列:7.5
  • GTX 10系列:6.1
  • Tesla V100:7.0
  • 自动检测:使用-D CUDA_ARCH_BIN=Auto(需要NVCC)

6. 编译并安装

# 使用cmake编译
make-j$(nproc)# 安装到Conda环境
make install

生成好的opencv库以及对应的文件将会报存在创建的环境对应的目录下
在这里插入图片描述

7. 验证安装

# 激活环境(如果尚未激活)
conda activate opencvcuda# 验证OpenCV版本和功能
python -c "
import cv2
print(f'OpenCV version: {cv2.__version__}')# 检查CUDA支持
cuda_available = cv2.cuda.getCudaEnabledDeviceCount() > 0
print(f'CUDA support: {"✅ Yes" if cuda_available else "❌ No"}')# 检查GStreamer支持
try:cap = cv2.VideoCapture('videotestsrc ! video/x-raw, format=BGRx ! videoconvert ! appsink', cv2.CAP_GSTREAMER)gstreamer_available = cap.isOpened()cap.release()print(f'GStreamer support: {"✅ Yes" if gstreamer_available else "❌ No"}')
except:print('❌ GStreamer check failed')
"

运行结果为:
在这里插入图片描述

8. 使用GStreamer硬解码和CUDA加速的示例

import cv2
import numpy as npdef main():video_path = "2018_0412_115801_006.MP4"# 根据实际视频编码调整parse插件(示例为H.264) 硬解码不行,提示无法找到nvv4l2decoder,应该是jetson平台的'''gstreamer_pipeline = (f"filesrc location={video_path} ! ""qtdemux ! ""h264parse ! "  "nvv4l2decoder ! ""nvvidconv ! ""video/x-raw, format=BGRx ! ""videoconvert ! ""appsink")'''#x86平台用Nvidia nvcodec 插件组的核心组件nvh264dec,专为GPU硬件解码优化gstreamer_pipeline = (f"filesrc location={video_path} ! ""qtdemux ! ""h264parse ! "  "nvh264dec ! " "videoconvert ! ""video/x-raw,format=BGR !""appsink")# 简化后的CPU解码管道(替换原pipeline)软解码能用'''gstreamer_pipeline = (f"filesrc location={video_path} ! qtdemux ! h264parse ! avdec_h264 ! "  # 使用CPU解码器avdec_h264"videoconvert ! video/x-raw,format=BGR ! appsink")'''print(gstreamer_pipeline)cap = cv2.VideoCapture(gstreamer_pipeline, cv2.CAP_GSTREAMER)if not cap.isOpened():print("Error opening video stream")return# 移除未使用的gpu_bgr变量if cv2.cuda.getCudaEnabledDeviceCount() > 0:gpu_frame = cv2.cuda_GpuMat()gpu_gray = cv2.cuda_GpuMat()  # 仅保留需要的变量while True:ret, frame = cap.read()if not ret:breakif cv2.cuda.getCudaEnabledDeviceCount() > 0:try:gpu_frame.upload(frame)gpu_gray = cv2.cuda.cvtColor(gpu_frame, cv2.COLOR_BGR2GRAY)gray = gpu_gray.download()except Exception as e:print(f"GPU处理失败: {str(e)}")# 可回退到CPU处理gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)else:gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)cv2.imshow("CUDA + GStreamer Demo", gray)if cv2.waitKey(1) & 0xFF == 27:breakcap.release()cv2.destroyAllWindows()if __name__ == "__main__":main()

启动的时候显卡情况:
在这里插入图片描述

在这里,我尝试了使用nvv4l2decoder来进行硬解码,但是我始终无法正确使用它,只能用nvv4l2decoder适合在jetson平台下使用的理由说服自己,有能用成功的请留言告知,后面更换为nvh264dec进行硬解码,这个能成功。

常见问题及解决方法

  1. CMake找不到CUDA

    • 确保系统已安装CUDA:nvcc --version
    • 设置CUDA路径:export CUDA_HOME=/usr/local/cuda
    • 在CMake配置中添加:-D CUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda
  2. GStreamer错误

    • 安装更多GStreamer插件:sudo apt-get install gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly
    • 检查环境变量:export GST_PLUGIN_PATH=/usr/lib/x86_64-linux-gnu/gstreamer-1.0/
  3. 编译失败

    • 清除构建目录并重新开始:rm -rf build && mkdir build && cd build
    • 检查CMake输出日志,查找缺失的依赖
  4. Python导入错误

    • 确保OpenCV已正确安装到Conda环境:ls $CONDA_PREFIX/lib/python3.8/site-packages/cv2
    • 尝试重新激活环境:conda deactivate && conda activate opencv-gpu
  5. cmake过程中需要下载东西

    • 编译过程中wechat_qrcode: Downloading detect.caffemodel from https://raw.githubusercontent.com/WeChatCV/opencv_3rdparty/a8b69ccc738421293254aec5ddb38bd523503252/detect.caffemodel 这个地方卡住了,",“multiMedia”:[],“parsedQuery”:["编译过程中wechat_qrcode: Downloading detect.caffemodel from ",{“type”:“web_page”,“url”:“https://raw.githubusercontent.com/WeChatCV/opencv_3rdparty/a8b69ccc738421293254aec5ddb38bd523503252/detect.caffemodel”,“unlinkText”:“取消链接”},"这个地方卡住了,可以手动下载放到构建的缓存目录中,路径为:
    • /opencv_build/build/downloads/wechat_qrcode/
  6. import cv2报错

>>> import cv2Traceback (most recent call last):File "<stdin>", line 1, in <module>File "/home/a/anaconda3/envs/opencvcuda/lib/python3.9/site-packages/cv2/__init__.py", line 181, in <module>bootstrap()File "/home/a/anaconda3/envs/opencvcuda/lib/python3.9/site-packages/cv2/__init__.py", line 153, in bootstrapnative_module = importlib.import_module("cv2")File "/home/a/anaconda3/envs/opencvcuda/lib/python3.9/importlib/__init__.py", line 127, in import_modulereturn _bootstrap._gcd_import(name[level:], package, level)ImportError: /home/a/anaconda3/envs/opencvcuda/lib/libstdc++.so.6: version `GLIBCXX_3.4.30' not found (required by /home/a/anaconda3/envs/opencvcuda/lib/libopencv_gapi.so.408)

原因:conda环境中的 libstdc++.so.6 (来自 libstdcxx-ng 包)版本过低,无法满足OpenCV编译库 libopencv_gapi.so.408 对 GLIBCXX_3.4.30 的依赖。
最好的解决方法是更新 libstdcxx-ng 包,比如:conda install libstdcxx-ng=13.2.0,但是我的环境无法获取到这个版本,只能获取到11.2的,当然你也可以升级conda,我选择的方式是到Anaconda.org查找目标版本,下载后手动安装:conda install /path/to/downloaded/libstdcxx-ng-13.2.0-hc0a3c3a_8.conda
7. 验证过程中:对于 libgstgtk.so 的 Wayland 错误:

sudo apt-get install gstreamer1.0-gl libwayland-dev

对于 libgstqmlgl.so 的 Qt 错误:

sudo apt-get install qtwayland5 libqt5waylandclient5-dev

通过以上步骤,你可以在Conda环境中成功编译并使用支持CUDA和GStreamer的OpenCV版本,同时保持与系统环境的隔离。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/87550.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/87550.shtml
英文地址,请注明出处:http://en.pswp.cn/web/87550.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java面试宝典:多线程一

1. run() vs start() 陷阱题 下面程序的运行结果 public static void main(String[] args) {Thread t = new Thread(

【CSS-14-基础样式表Base.css】如何编写高质量的Base.css:前端样式重置与基础规范指南

在前端开发中&#xff0c;Base.css&#xff08;也称为重置样式表或基础样式表&#xff09;是整个项目样式的基石。它负责消除浏览器默认样式的差异&#xff0c;建立统一的样式基准&#xff0c;为后续开发提供一致的起点。一个精心设计的Base.css能够显著提高开发效率&#xff0…

探索Python数据科学工具链NumPyPandas与Scikit-learn

NumPy&#xff1a;数值计算的基石 NumPy是Python中用于科学计算的核心库&#xff0c;它提供了一个强大的N维数组对象&#xff0c;以及大量的数学函数库&#xff0c;能够高效地进行向量和矩阵运算。对于数据科学家而言&#xff0c;掌握NumPy是进行数据处理和算法实现的基础。 创…

八股学习(三)---MySQL

一、MySQL中的回表是什么&#xff1f;我的回答&#xff1a;MySQL回表指的是在查询使用非聚簇索引也就是二级索引时&#xff0c;叶子节点只存储了索引列的值和主键Id&#xff0c;若要查询其他字段&#xff0c;就要根据主键去聚簇索引查询完整的数据。这个过程就是回表。比如用na…

NeighborGeo:基于邻居的IP地理定位(一)

NeighborGeo:基于neighbors的IP地理定位 X. Wang, D. Zhao, X. Liu, Z. Zhang, T. Zhao, NeighborGeo: IP geolocation based on neighbors, Comput. Netw. 257 (2025) 110896, Abstract IP地址定位在网络安全、电子商务、社交媒体等领域至关重要。当前主流的图神经网络方法…

MySQL 8.0:窗口函数

一、基础知识 定义 窗口函数&#xff08;Window Function&#xff09;对查询结果集的子集&#xff08;“窗口”&#xff09;进行计算&#xff0c;保留原始行而非聚合为单行&#xff0c;适合复杂分析&#xff08;如排名、累积和&#xff09;。 基本语法&#xff1a; 函数名() OV…

AI 深度学习面试题学习

1.神经网络 1.1各个激活函数的优缺点? 1.2为什么ReLU常用于神经网络的激活函数? 1.在前向传播和反向传播过程中,ReLU相比于Sigmoid等激活函数计算量小; 2.避免梯度消失问题。对于深层网络,Sigmoid函数反向传播时,很容易就会出现梯度消失问题(在Sigmoid接近饱和区时,变换…

遇到该问题:kex_exchange_identification: read: Connection reset`的解决办法

kex_exchange_identification: read: Connection reset 是一个非常常见的 SSH 连接错误。它表明在 SSH 客户端和服务器建立安全连接的初始阶段&#xff08;密钥交换&#xff0c;Key Exchange&#xff09;&#xff0c;连接就被对方&#xff08;服务器&#xff09;强制关闭了。 …

(论文蒸馏)语言模型中的多模态思维链推理

&#xff08;论文总结&#xff09;语言模型中的多模态思维链推理 论文名称研究背景动机主要贡献研究细节两阶段框架实验结果促进收敛性摆脱人工标注错误分析与未来前景 论文名称 Multimodal Chain-of-Thought Reasoning in Language Models http://arxiv.org/abs/2302.00923 …

React Native 接入 eCharts

React Native 图表接入指南 概述 本文档详细介绍了在React Native项目中接入ECharts图表的完整步骤&#xff0c;包括依赖安装、组件配置、数据获取、图表渲染等各个环节。 目录 1. 环境准备2. 依赖安装3. 图表组件创建4. 数据获取Hook5. 图表配置6. 组件集成7. 国际化支持8…

基于C#的OPCServer应用开发,引用WtOPCSvr.dll

操作流程&#xff1a; 1.引入WtOPCSvr.dll文件 2.注册服务&#xff1a;使用UpdateRegistry方法注册&#xff0c;注意关闭应用时使用UnregisterServer取消注册。 3.初始化服务&#xff1a;使用InitWTOPCsvr初始化 4.使用CreateTag方法&#xff0c;创建标签 5.读写参数使用下面三…

Java类加载器getResource行为简单分析

今天尝试集成一个第三方SDK&#xff0c;在IDE里运行正常&#xff0c;放到服务器上却遇到了NPE&#xff0c;反编译一看&#xff0c;原来在这一行&#xff1a;String path Test.class.getClassLoader().getResource("").getPath(); // Test.class.getClassLoader().ge…

【CodeTop】每日练习 2025.7.4

Leetcode 1143. 最长公共子序列 动态规划解决&#xff0c;比较当前位置目标和实际字符串的字母&#xff0c;再根据不同情况计算接下来的情形。 class Solution {public int longestCommonSubsequence(String text1, String text2) {char[] t1 text1.toCharArray();char[] t2…

ES6从入门到精通:Promise与异步

Promise 基础概念Promise 是 JavaScript 中处理异步操作的一种对象&#xff0c;代表一个异步操作的最终完成或失败及其结果值。它有三种状态&#xff1a;Pending&#xff08;进行中&#xff09;、Fulfilled&#xff08;已成功&#xff09;、Rejected&#xff08;已失败&#xf…

数据结构:二维数组(2D Arrays)

目录 什么是二维数组&#xff1f; 二维数组的声明方式 方式 1&#xff1a;静态二维数组 方式 2&#xff1a;数组指针数组&#xff08;数组中存放的是指针&#xff09; 方式 3&#xff1a;双指针 二级堆分配 &#x1f4a1; 补充建议 如何用“第一性原理”去推导出 C 中…

HAProxy 和 Nginx的区别

HAProxy 和 Nginx 都是优秀的负载均衡工具&#xff0c;但它们在设计目标、适用场景和功能特性上有显著区别。以下是两者的详细对比&#xff1a;1. 核心定位特性HAProxyNginx主要角色专业的负载均衡器/代理Web 服务器 反向代理/负载均衡设计初衷高性能流量分发高并发 HTTP 服务…

基于Java+SpringBoot的健身房管理系统

源码编号&#xff1a;S586源码名称&#xff1a;基于SpringBoot的健身房管理系统用户类型&#xff1a;多角色&#xff0c;用户、教练、管理员数据库表数量&#xff1a;13 张表主要技术&#xff1a;Java、Vue、ElementUl 、SpringBoot、Maven运行环境&#xff1a;Windows/Mac、JD…

【MySQL安装-yum/手动安装,卸载,问题排查处理完整文档(linux)】

一.使用Yum仓库自动安装 步骤1:添加MySQL Yum仓库 sudo rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-6.noarch.rpm步骤2:安装MySQL服务器 sudo yum install mysql-server -y步骤3:启动并设置开机自启 sudo systemctl start mysqld sudo systemct…

自定义线程池-实现任务0丢失的处理策略

设计一个线程池&#xff0c;要求如下&#xff1a;队列最大容量为10&#xff08;内存队列&#xff09;。当队列满了之后&#xff0c;拒绝策略将新的任务写入数据库。从队列中取任务时&#xff0c;若该队列为空&#xff0c;能够从数据库中加载之前被拒绝的任务模拟数据库 (TaskDa…

【NLP入门系列四】评论文本分类入门案例

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 博主简介&#xff1a;努力学习的22级本科生一枚 &#x1f31f;​&#xff1b;探索AI算法&#xff0c;C&#xff0c;go语言的世界&#xff1b;在迷茫中寻找光芒…