opencv使用 GStreamer 硬解碼和 CUDA 加速的方案

在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;在迷茫中尋找光芒…