国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

opencv如何使用GPU的三種方法

這篇具有很好參考價值的文章主要介紹了opencv如何使用GPU的三種方法。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

我在工作實驗涉及到圖像和視頻處理時,通常使用opencv提供的庫來做處理,雖然OpenCV是一個廣泛使用的庫,它提供了豐富的功能和工具。然而,有時候在處理大量圖片或視頻時,我們可能會面臨速度受限的問題。

opencv執(zhí)行圖像處理,就跟我們電腦一樣,打游戲CPU是來加載處理數(shù)據(jù)的,顯卡(GPU)是來渲染圖像。下面由我助理來介紹如何本文的內(nèi)容吧

opencv如何使用GPU的三種方法

numpy運算加速

一開始我其實考慮使用python其他庫來加速圖像處理的計算,因為在計算機(jī)視角下的圖像是可以等價為numpy類型的數(shù)值,在Python中,有幾個庫可以加速NumPy運算。其中最常用的庫是NumPy本身,它已經(jīng)高度優(yōu)化,可以提供快速的數(shù)值計算。但是,如果你需要進(jìn)一步加速NumPy運算,可以考慮下面這個庫:

Numba:Numba是一個即時(just-in-time)編譯器,可以將Python函數(shù)編譯成高效的機(jī)器碼。它支持在NumPy數(shù)組上進(jìn)行加速運算。你可以使用裝飾器@numba.jit將函數(shù)編譯為機(jī)器碼,以提高其性能。

以下是一個使用Numba加速NumPy運算的示例代碼:

import numba
import numpy as np



def cpu_function(a):
    # 在這里編寫需要加速的NumPy運算代碼
    trace = 0
    # 假設(shè)輸入變量是numpy數(shù)組
    for i in range(a.shape[0]):   # Numba 擅長處理循環(huán)
        trace += np.tanh(a[i, i])  # numba喜歡numpy函數(shù)
    return a + trace

@numba.jit(nopython=True)
def gpu_function(a):
    # 在這里編寫需要加速的NumPy運算代碼
    trace = 0
    # 假設(shè)輸入變量是numpy數(shù)組
    for i in range(a.shape[0]):   # Numba 擅長處理循環(huán)
        trace += np.tanh(a[i, i])  # numba喜歡numpy函數(shù)
    return a + trace
    


# 調(diào)用加速后的函數(shù)
x = np.arange(10000).reshape(100, 100)


print('cpu執(zhí)行時間:')
% timeit cpu_function(x)
print('gpu執(zhí)行時間:')
% timeit gpu_function(x)
cpu執(zhí)行時間:
199 μs ± 1.27 μs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
gpu執(zhí)行時間:
4.18 μs ± 32.9 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

1 微秒(us)=0.000001 秒

但這種方法對于讀取視頻速度還是沒有影響的,為了解決這個問題,我們可以利用GPU加速來提高圖像和視頻的讀取速度。使用OpenCV的cuda模塊,我們可以將解碼和處理操作從CPU轉(zhuǎn)移到GPU上,以利用GPU的并行計算能力。這種方式可以顯著提高處理速度,特別是在大規(guī)模圖像和視頻處理的情況下。下面我將介紹三種opencv使用GPU的方法

opencv內(nèi)置函數(shù)運算

在OpenCV的Python綁定中,可以使用一些內(nèi)置函數(shù)來利用GPU進(jìn)行加速。以下是使用GPU加速的方法和原理:

  1. 安裝正確的依賴項:與使用DNN模塊相同,首先需要確保在系統(tǒng)上安裝了與GPU加速相關(guān)的依賴項,包括CUDA和cuDNN。
  2. 創(chuàng)建GPU加速的函數(shù):在OpenCV中,某些函數(shù)可以利用GPU進(jìn)行加速,例如圖像處理函數(shù)(如濾波、圖像變換等)和矩陣操作函數(shù)(如矩陣乘法、轉(zhuǎn)置等)。這些函數(shù)在使用時需要將數(shù)據(jù)傳遞到GPU上進(jìn)行處理。
  3. 分配GPU內(nèi)存:在使用GPU加速函數(shù)之前,需要為輸入和輸出數(shù)據(jù)在GPU上分配內(nèi)存??梢允褂胏v2.cuda.alloc()函數(shù)來為輸入和輸出數(shù)據(jù)創(chuàng)建GPU內(nèi)存。
  4. 將數(shù)據(jù)傳輸?shù)紾PU:將輸入數(shù)據(jù)從主機(jī)內(nèi)存(CPU)傳輸?shù)紾PU內(nèi)存??梢允褂胏v2.cuda_GpuMat.upload()函數(shù)將數(shù)據(jù)從CPU內(nèi)存上傳到GPU內(nèi)存。
  5. 執(zhí)行GPU加速函數(shù):調(diào)用相應(yīng)的GPU加速函數(shù),傳遞GPU上的輸入數(shù)據(jù)作為參數(shù),并在GPU上進(jìn)行計算。這些函數(shù)將直接在GPU上執(zhí)行,以獲得加速的效果。
  6. 從GPU中下載數(shù)據(jù):如果需要將結(jié)果數(shù)據(jù)從GPU內(nèi)存下載到主機(jī)內(nèi)存,可以使用cv2.cuda_GpuMat.download()函數(shù)。這樣,就可以在主機(jī)上進(jìn)行后續(xù)的處理或輸出。

下面是一個結(jié)合前面的計時器類的示例代碼,展示了如何使用OpenCV的cv2.calcOpticalFlowFarneback函數(shù)進(jìn)行圖像的光流計算預(yù)處理,并通過CPU和GPU實現(xiàn)對比執(zhí)行速度:

import cv2
import time

# 圖像預(yù)處理函數(shù)(CPU實現(xiàn))
def preprocess_image_cpu(img):
    # 在這里進(jìn)行圖像預(yù)處理
    # 轉(zhuǎn)換為灰度圖像  
	gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  
	  
	# 直方圖均衡化  
	equalized = cv2.equalizeHist(gray)  
	  
	# Sobel銳化  
	sobelx = cv2.Sobel(equalized, cv2.CV_64F, 1, 1, ksize=3)  
	sobely = cv2.Sobel(equalized, cv2.CV_64F, 0, 1, ksize=3)  
	sober = np.sqrt(sobelx ** 2 + sobely ** 2) 

	# 顯示原圖、直方圖均衡化后的圖像、Sobel銳化后的圖像  
	cv2.imshow('Original', img)  
	cv2.imshow('Equalized', equalized)  
	cv2.imshow('Sober', sober)  
	  
	cv2.waitKey(0)  
	cv2.destroyAllWindows() 


# 圖像預(yù)處理函數(shù)(GPU實現(xiàn))
def preprocess_image_gpu(img):
    if not cv2.cuda.getCudaEnabledDeviceCount():
        print("CUDA is not available. Please make sure CUDA drivers are installed.")
        return

    gpu_image = cv2.cuda_GpuMat()
    gpu_image.upload(img)

    # 在這里進(jìn)行圖像預(yù)處理(GPU實現(xiàn))
    # 轉(zhuǎn)換為灰度圖像  
	gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  
	  
	# 直方圖均衡化  
	equalized = cv2.equalizeHist(gray)  
	  
	# Sobel銳化  
	sobelx = cv2.Sobel(equalized, cv2.CV_64F, 1, 1, ksize=3)  
	sobely = cv2.Sobel(equalized, cv2.CV_64F, 0, 1, ksize=3)  
	sober = np.sqrt(sobelx ** 2 + sobely ** 2) 

	# 顯示原圖、直方圖均衡化后的圖像、Sobel銳化后的圖像  
	cv2.imshow('Original', img)  
	cv2.imshow('Equalized', equalized)  
	cv2.imshow('Sober', sober)  
	  
	cv2.waitKey(0)  
	cv2.destroyAllWindows() 

# 讀取圖像
image_path = "path/to/image.jpg"
image = cv2.imread(image_path)

print('cpu執(zhí)行時間:')
% timeit preprocess_image_cpu(image)
print('gpu執(zhí)行時間:')
% timeit preprocess_image_gpu(image)

openCV DNN 模塊

在OpenCV的Python綁定中,DNN模塊可以利用GPU加速來進(jìn)行深度神經(jīng)網(wǎng)絡(luò)的推理。以下是使用GPU加速的方法和原理:

  1. 安裝正確的依賴項:首先,確保你的系統(tǒng)上安裝了與GPU加速相關(guān)的依賴項。這通常包括安裝CUDA(Compute Unified Device Architecture)和cuDNN(CUDA Deep Neural Network)。
  2. 配置OpenCV編譯選項:在編譯OpenCV時,需要確保啟用了GPU加速選項??梢允褂肅Make進(jìn)行編譯配置,通過啟用相關(guān)的CUDA選項來啟用GPU加速支持。
  3. 加載模型和權(quán)重:使用OpenCV的DNN模塊加載深度神經(jīng)網(wǎng)絡(luò)模型和相應(yīng)的權(quán)重文件。例如,可以使用cv2.dnn.readNet()函數(shù)加載模型。
  4. 設(shè)置推理設(shè)備:使用cv2.dnn_DNN_BACKEND_CUDA和cv2.dnn.DNN_TARGET_CUDA參數(shù)設(shè)置推理設(shè)備為CUDA。
  5. 配置網(wǎng)絡(luò):為了使用GPU加速,需要將網(wǎng)絡(luò)配置為使用CUDA。可以使用net.setPreferableBackend(cv2.dnn.DNN_BACKEND_CUDA)和net.setPreferableTarget(cv2.dnn.DNN_TARGET_CUDA)方法設(shè)置網(wǎng)絡(luò)的后端和目標(biāo)。
  6. 進(jìn)行推理:現(xiàn)在,可以使用GPU加速進(jìn)行深度神經(jīng)網(wǎng)絡(luò)的推理。使用net.forward()方法來運行前向傳播,并獲取網(wǎng)絡(luò)的輸出。

下面是一個結(jié)合計時器的示例代碼,展示了如何使用OpenCV的dnn模塊進(jìn)行圖像處理,并通過CPU和GPU實現(xiàn)對比執(zhí)行速度:

import cv2
import time

# 圖像處理函數(shù)(CPU實現(xiàn))
def process_image_cpu(image):
    # 在這里進(jìn)行圖像處理(CPU實現(xiàn))
    # ...

    return processed_image

# 圖像處理函數(shù)(GPU實現(xiàn))
def process_image_gpu(image):
    if not cv2.cuda.getCudaEnabledDeviceCount():
        print("CUDA is not available. Please make sure CUDA drivers are installed.")
        return

    net = cv2.dnn.readNetFromCaffe("path/to/caffe/prototxt", "path/to/caffe/model")
    blob = cv2.dnn.blobFromImage(image, scalefactor=1.0, size=(300, 300), mean=(104.0, 177.0, 123.0), swapRB=True)

    gpu_blob = cv2.cuda_GpuMat()
    gpu_blob.upload(blob)

    net.setPreferableBackend(cv2.dnn.DNN_BACKEND_CUDA)
    net.setPreferableTarget(cv2.dnn.DNN_TARGET_CUDA)

    gpu_net = cv2.dnn_DetectionModel(net)
    gpu_net.setInput(gpu_blob)

    start_time = time.time()
    gpu_detection = gpu_net.forward()
    end_time = time.time()
    gpu_execution_time = end_time - start_time

    # 在這里進(jìn)行圖像處理(GPU實現(xiàn))
    # ...

    gpu_processed_image = gpu_blob.download()
    return gpu_processed_image, gpu_execution_time

# 讀取圖像
image_path = "path/to/image.jpg"
image = cv2.imread(image_path)


print('cpu執(zhí)行時間:')
% timeit preprocess_image_cpu(image)
print('gpu執(zhí)行時間:')
% timeit preprocess_image_gpu(image)

在上述代碼中,我們定義了兩個圖像處理函數(shù):process_image_cpu和process_image_gpu,分別表示CPU和GPU的實現(xiàn)方式。

讀取視頻

在Python中使用OpenCV讀取視頻時,可以使用GPU加速來提高讀取速度。為此,你可以使用OpenCV的cuda模塊以及支持CUDA的顯卡驅(qū)動和CUDA工具包。

下面是一個示例代碼,展示如何使用GPU加速在OpenCV中讀取視頻的每一幀:

import cv2

# 檢查是否支持CUDA
if not cv2.cuda.getCudaEnabledDeviceCount():
    print("CUDA is not available. Please make sure CUDA drivers are installed.")
    exit()

# 創(chuàng)建GPU設(shè)備對象
gpu_id = 0  # 選擇GPU設(shè)備的ID
device = cv2.cuda.Device(gpu_id)
ctx = device.createContext()

# 打開視頻文件
video_path = "path/to/video/file.mp4"
cap = cv2.VideoCapture(video_path)

# 檢查視頻文件是否成功打開
if not cap.isOpened():
    print("Failed to open the video file.")
    exit()

# 設(shè)置GPU加速
cap.set(cv2.CAP_PROP_CUDA_MPS, 1)

# 循環(huán)讀取視頻的每一幀
while True:
    # 使用GPU加速讀取一幀
    ret, frame = cap.read(cv2.CAP_CUDA)

    # 檢查是否成功讀取幀
    if not ret:
        break

    # 在這里進(jìn)行你希望執(zhí)行的操作
    # ...

# 釋放資源
cap.release()
cv2.destroyAllWindows()

在上述代碼中,首先檢查是否支持CUDA,然后創(chuàng)建一個指定GPU設(shè)備的上下文(context)。接著打開視頻文件,設(shè)置GPU加速,并循環(huán)讀取視頻的每一幀。讀取過程中,使用cv2.CAP_CUDA作為參數(shù)來啟用GPU加速。你可以在讀取幀后的代碼塊中執(zhí)行你希望的操作,例如對幀進(jìn)行處理或展示。

請確保你的系統(tǒng)中已經(jīng)正確安裝了支持CUDA的顯卡驅(qū)動和CUDA工具包,以及適用于GPU加速的OpenCV版本。同時,根據(jù)實際情況修改代碼中的視頻文件路徑和GPU設(shè)備的ID。

下面是一個示例案例,演示了如何使用CPU和GPU分別讀取視頻,并使用time庫計算二者讀取視頻的時間,并進(jìn)行對比:

import cv2
import time

# 用CPU讀取視頻
def read_video_cpu(video_path):
    cap = cv2.VideoCapture(video_path)

    while True:
        ret, frame = cap.read()

        if not ret:
            break

        # 在這里進(jìn)行你希望執(zhí)行的操作
        # ...
    cap.release()


# 用GPU讀取視頻
def read_video_gpu(video_path):
    if not cv2.cuda.getCudaEnabledDeviceCount():
        print("CUDA is not available. Please make sure CUDA drivers are installed.")
        return

    gpu_id = 0
    device = cv2.cuda.Device(gpu_id)
    ctx = device.createContext()

    cap = cv2.VideoCapture(video_path)

    cap.set(cv2.CAP_PROP_CUDA_MPS, 1)

    while True:
        ret, frame = cap.read(cv2.CAP_CUDA)

        if not ret:
            break

        # 在這里進(jìn)行你希望執(zhí)行的操作
        # ...

    cap.release()


# 視頻文件路徑
video_path = "path/to/video/file.mp4"

print('cpu執(zhí)行時間:')
% timeit read_video_cpu(video_path)
print('gpu執(zhí)行時間:')
% timeit read_video_gpu(video_path)

使用GPU讀取視頻的原理是將視頻解碼和幀處理操作從CPU轉(zhuǎn)移到GPU上進(jìn)行加速。在這種情況下,GPU負(fù)責(zé)解碼視頻幀并執(zhí)行任何與幀相關(guān)的處理操作,而CPU主要負(fù)責(zé)控制和協(xié)調(diào)工作流程。

具體實現(xiàn)方式是,通過OpenCV的cv2.VideoCapture函數(shù)設(shè)置參數(shù)cv2.CAP_CUDA來啟用GPU加速。這將使用GPU進(jìn)行視頻解碼,并將解碼后的幀傳輸?shù)紾PU內(nèi)存中。然后,在每一幀上進(jìn)行處理時,GPU負(fù)責(zé)執(zhí)行相應(yīng)的操作,例如圖像處理、計算等。CPU則不直接參與這些操作,而是僅在必要時與GPU進(jìn)行通信和同步,以確保正確的工作流程和數(shù)據(jù)傳輸。

需要注意的是,雖然視頻的解碼和幀處理操作是由GPU完成的,但仍然需要CPU的參與來完成初始化、設(shè)置參數(shù)、控制流程以及與GPU的通信和同步。因此,在整個過程中,CPU和GPU是協(xié)同工作的。在Linux系統(tǒng)中使用top命令查看CPU利用率時,如果視頻讀取和處理操作主要由GPU執(zhí)行,那么CPU利用率可能會較低文章來源地址http://www.zghlxwxcb.cn/news/detail-500390.html

到了這里,關(guān)于opencv如何使用GPU的三種方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 使用java判斷質(zhì)數(shù)的三種方法

    方法一:質(zhì)數(shù)只能被1和它本身整除 ?方法二:一個數(shù)總能寫成“n = a * b”的形式,a和b之間一定有一個數(shù)不大于n/2 ?方法三:每一個整數(shù)都可以看做由兩個數(shù)相乘得到,且每個乘數(shù)不大于原整數(shù)的平方根 ?

    2024年02月13日
    瀏覽(19)
  • Allegro如何在PCB上查看pin number的三種方法操作指導(dǎo)

    Allegro如何在PCB上查看pin number的三種方法操作指導(dǎo)

    Allegro 如何在PCB上查看pin number的三種方法操作指導(dǎo) Allegro支持快捷的在PCB上查看pin number,如下圖 具體操作如下 方法一:show element 選擇Show Element命令 Find選擇Pins

    2024年02月08日
    瀏覽(43)
  • 【微信小程序】使用自定義字體的三種方法

    【微信小程序】使用自定義字體的三種方法

    小程序官方提供的接口,最便捷的加載字體的方法,不過限制頗多。必須https且同源,canvas等原生組件不支持。注意??!使用本地文件無效,必須使用網(wǎng)絡(luò)地址。 官方文檔:wx.loadFontFace(Object object) | 微信開放文檔 演示代碼: 傳統(tǒng)的css規(guī)則,跟loadFontFace限制一樣,必須https且同

    2024年02月08日
    瀏覽(26)
  • Tomcat安裝使用與部署Web項目的三種方法

    Tomcat安裝使用與部署Web項目的三種方法

    ?作者簡介:C/C++領(lǐng)域新星創(chuàng)作者,為C++和java奮斗中 ?個人社區(qū):微涼秋意社區(qū) ??系列專欄:MySql一點通 ??推薦一款模擬面試、刷題神器??注冊免費刷題 ??前言 今天帶來 Tomcat 的安裝教程,也會講到各種目錄下代表的含義,重點是在Tomcat服務(wù)器上面部署Web項目的三種方法

    2024年02月02日
    瀏覽(23)
  • Android中保持屏幕常亮的三種使用方法

    目錄 一、設(shè)置Flag 二、使用View類中的屬性方法 1、Xml布局中設(shè)置: 2、功能代碼中設(shè)置: 三、Wakelock 鎖定機(jī)制 1、簡介 2、作用 3、分類標(biāo)志 4、使用方法 (1)在AndroidManifest.xml中設(shè)置權(quán)限 (2)通過PowerManager類獲取WakeLock類的實例對象 (3)注意事項 (4)優(yōu)化措施 (5)總結(jié)

    2024年02月07日
    瀏覽(19)
  • 使用 GNU 匯編語法編寫 Hello World 程序的三種方法

    使用 GNU 匯編語法編寫 Hello World 程序的三種方法

    本篇我們使用匯編來寫一個經(jīng)典的? Hello world ?程序。 運行環(huán)境: OS:Ubuntu 18.04.5 LTS x86-64 gcc:version 4.8.5 在用戶空間編寫匯編程序輸出字符串,有三種方法: 調(diào)用C庫函數(shù)? printf 使用軟中斷? int 0x80 使用? syscall 系統(tǒng)調(diào)用 下面對三種方法,分別進(jìn)行說明。 為了更好的理解匯

    2024年02月06日
    瀏覽(39)
  • java獲取系統(tǒng)CPU和內(nèi)存使用率的三種方法

    獲取系統(tǒng)CPU和內(nèi)存的三種方法: 1、使用OperatingSystemMXBean獲取 2、使用sigar方法獲取 3、使用oshi方法獲取 以下是我在我的機(jī)子上對三種方法測試的比較 方法?? ?準(zhǔn)確率 OperatingSystemMXBean?? ?獲取的內(nèi)存數(shù)據(jù)準(zhǔn)確,CPU差距有點大 sigar?? ?獲取的內(nèi)存數(shù)據(jù)稍微有點差距,CPU相對

    2024年04月13日
    瀏覽(24)
  • 【工作記錄】mysql中實現(xiàn)分組統(tǒng)計的三種方式

    【工作記錄】mysql中實現(xiàn)分組統(tǒng)計的三種方式

    前言 實際工作中對范圍分組統(tǒng)計的需求還是相對普遍的,本文記錄下在mysql中通過函數(shù)和sql完成分組統(tǒng)計的實現(xiàn)過程。 數(shù)據(jù)及期望 比如我們獲取到了豆瓣電影top250,現(xiàn)在想知道各個分?jǐn)?shù)段的電影總數(shù). 表數(shù)據(jù)如下: 期望結(jié)果: 實現(xiàn)方案 主要思路是根據(jù)score的范圍設(shè)置別名,然

    2024年02月13日
    瀏覽(24)
  • QT中使用QtXlsx庫的三種方法 QT基礎(chǔ)入門【Excel的操作】

    對于Linux用戶,如果Qt是通過“ apt-get”之類的軟件包管理器工具安裝的,請確保已安裝Qt5開發(fā)軟件包qtbase5-private-dev QtXlsx是一個可以讀寫Excel文件的庫。它不需要Microsoft Excel,可以在Qt5支持的任何平臺上使用。該庫可用于從頭開始生成新的.xlsx文件從現(xiàn)有.xlsx文件中提取數(shù)據(jù)編

    2024年02月12日
    瀏覽(29)
  • 免費使用微軟Azure進(jìn)行文字轉(zhuǎn)語音的三種方法!最自然接近人聲的機(jī)器配音技術(shù)。

    免費使用微軟Azure進(jìn)行文字轉(zhuǎn)語音的三種方法!最自然接近人聲的機(jī)器配音技術(shù)。

    微軟的TTS語音合成技術(shù)目前已經(jīng)做到了非常自然,接近真人音色,在不了解前提下有時候真的很難分辨出這是機(jī)器合成的聲音。 目前微軟的文字轉(zhuǎn)語音已經(jīng)支持21個中文簡體的聲音,并且支持多種聲音風(fēng)格的選擇和語速、音調(diào)的調(diào)整。 免費使用微軟Azure進(jìn)行文字轉(zhuǎn)語音的方法

    2024年02月03日
    瀏覽(40)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包