訂閱
糾錯(cuò)
加入自媒體

教程與實(shí)戰(zhàn):OpenCV使用CUDA處理圖像

import cv2 as cv

gpu_frame = cv.cuda_GpuMat()

screenshot = cv.imread('media/drip.png')

gpu_frame.upload(screenshot)

gpu_frame.download()

概述在單張圖像上使用在多張圖像上使用對(duì)多張圖像使用Dask進(jìn)行并行延時(shí)處理在單張圖像上使用我們需要?jiǎng)?chuàng)建GPU空間(GPU_frame)來(lái)保存圖像(就像相框保存圖片一樣),然后才能將圖像上傳到GPU。第1步:上傳import cv2 as cv

gpu_frame = cv.cuda_GpuMat()

接下來(lái)用CPU將圖像加載到內(nèi)存中(截圖),并將其上傳到gpu上(幀圖像);screenshot = cv.imread('media/drop.png')

gpu_frame.upload(screenshot)

第2步:處理圖像OpenCV CUDA函數(shù)返回cv2.cuda_GpuMat(GPU矩陣),因此每個(gè)結(jié)果都可以在用戶(hù)不必重新上傳的情況下進(jìn)行操作。讓我們把圖像從RGB轉(zhuǎn)換成BGR(OpenCV格式),然后調(diào)整大小;screenshot = cv.cuda.cvtColor(gpu_frame, cv.COLOR_RGB2BGR)
screenshot = cv.cuda.resize(screenshot, (400, 400))

注意:你調(diào)用的函數(shù)的第一個(gè)參數(shù)應(yīng)該是GPU矩陣(GPU幀),而不是你剛剛上傳的圖像,這會(huì)返回一個(gè)新的GPU矩陣。原始的GPU矩陣(gpu_frame)將繼續(xù)保存原始圖像,直到新圖像被上傳。第3步:下載處理之后的圖像在GPU上,我們需要把它下載回CPU;screenshot.download()

注意:.download()將從cv轉(zhuǎn)換為圖像,即從cuda_GpuMat到 numpy.ndarray。在多張圖像上使用如果需要處理新圖片,只需調(diào)用.upload()將新圖片加載到現(xiàn)有的GPU矩陣中。圖像在傳遞給GPU之前仍然必須加載到CPU上。import cv2 as cv

img_files = ['bear.png', 'drip.png', 'tldr.png', 'frog.png']

# 創(chuàng)建幀來(lái)保存圖片(cv2.cuda_GpuMat)

gpu_frame = cv.cuda_GpuMat()

for i in range(len(img_files)):
   # 加載圖像(CPU)
   screenshot = cv.imread(f"media/{img_files[i]}")
   # 上傳到GPU
   gpu_frame.upload(screenshot)
   # 轉(zhuǎn)換顏色到opencv (numpy) ndarray→cv2.cuda_GpuMat
   screenshot = cv.cuda.cvtColor(gpu_frame, cv.COLOR_RGB2BGR)
   # 反向閾值@ 100
   screenshot = cv.cuda.threshold(screenshot, 105, 255, cv.THRESH_BINARY_INV)
   # 調(diào)整圖像
   screenshot = cv.cuda.resize(screenshot[1], (200, 200))
   # 從GPU下載圖像(cv2) cuda_GpuMat→numpy.ndarray
   screenshot = screenshot.download()
這一次我們?cè)陬A(yù)處理中添加了一個(gè)反向的binary.threshold()函數(shù);

對(duì)多張圖像使用Dask進(jìn)行并行延時(shí)處理使用Dask延時(shí),我們可以將上面的循環(huán)推入到Dask延時(shí)函數(shù),并行預(yù)處理多張圖。import cv2 as cv
import dask.delayed
@dask.delayed
def preprocess(files):
   # 復(fù)制圖像文件
   i_files = files.copy()
   # 創(chuàng)建GPU幀來(lái)保存圖像
   gpu_frame = cv.cuda_GpuMat()
   for i in range(len(i_files)):
       # 加載圖像(CPU)
       screenshot = cv.imread(f'media/{i_files[i]}')
       # 上傳到GPU
       gpu_frame.upload(screenshot)
       # 轉(zhuǎn)換顏色到opencv (numpy) ndarray→cv2.cuda_GpuMat
       screenshot = cv.cuda.cvtColor(gpu_frame, cv.COLOR_RGB2BGR)
       screenshot = cv.cuda.cvtColor(screenshot, cv.COLOR_BGR2GRAY)
       # 反向閾值@ 100
       screenshot = cv.cuda.threshold(screenshot, 125, 255, cv.THRESH_BINARY)
       # 調(diào)整圖像
       screenshot = cv.cuda.resize(screenshot[1], (200, 200))
       
       # 從GPU下載圖像 (cv2.cuda_GpuMat -> numpy.ndarray)
       screenshot = screenshot.download()
       # 用新圖像
       i_files[i] = screenshot
   
   # 輸出預(yù)處理圖像
   return i_files

添加了另一個(gè).cvtColor()來(lái)灰度化圖像,并將反轉(zhuǎn)的二進(jìn)制閾值切換為二進(jìn)制閾值。我們現(xiàn)在可以使用compute()來(lái)進(jìn)行計(jì)算了;from dask import compute

img_files = ['bear.png', 'drip.png', 'tldr.png', 'frog.png']

img_files_2 = ['apple.png', 'eye.png', 'window.png', 'blinds.png']

# 設(shè)置延遲

set_a = dask.delayed(preprocess)(img_files)

set_b = dask.delayed(preprocess)(img_files_2)

# 開(kāi)始計(jì)算

out_a, out_b = compute(*[set_a, set_b])

結(jié)果

聲明: 本文由入駐維科號(hào)的作者撰寫(xiě),觀點(diǎn)僅代表作者本人,不代表OFweek立場(chǎng)。如有侵權(quán)或其他問(wèn)題,請(qǐng)聯(lián)系舉報(bào)。

發(fā)表評(píng)論

0條評(píng)論,0人參與

請(qǐng)輸入評(píng)論內(nèi)容...

請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字

您提交的評(píng)論過(guò)于頻繁,請(qǐng)輸入驗(yàn)證碼繼續(xù)

  • 看不清,點(diǎn)擊換一張  刷新

暫無(wú)評(píng)論

暫無(wú)評(píng)論

人工智能 獵頭職位 更多
掃碼關(guān)注公眾號(hào)
OFweek人工智能網(wǎng)
獲取更多精彩內(nèi)容
文章糾錯(cuò)
x
*文字標(biāo)題:
*糾錯(cuò)內(nèi)容:
聯(lián)系郵箱:
*驗(yàn) 證 碼:

粵公網(wǎng)安備 44030502002758號(hào)