教程與實戰:OpenCV使用CUDA處理圖像
import cv2 as cv
gpu_frame = cv.cuda_GpuMat()
screenshot = cv.imread('media/drip.png')
gpu_frame.upload(screenshot)
gpu_frame.download()

概述在單張圖像上使用在多張圖像上使用對多張圖像使用Dask進行并行延時處理在單張圖像上使用我們需要創建GPU空間(GPU_frame)來保存圖像(就像相框保存圖片一樣),然后才能將圖像上傳到GPU。第1步:上傳import cv2 as cv
gpu_frame = cv.cuda_GpuMat()
接下來用CPU將圖像加載到內存中(截圖),并將其上傳到gpu上(幀圖像);screenshot = cv.imread('media/drop.png')
gpu_frame.upload(screenshot)
第2步:處理圖像OpenCV CUDA函數返回cv2.cuda_GpuMat(GPU矩陣),因此每個結果都可以在用戶不必重新上傳的情況下進行操作。讓我們把圖像從RGB轉換成BGR(OpenCV格式),然后調整大小;screenshot = cv.cuda.cvtColor(gpu_frame, cv.COLOR_RGB2BGR)
screenshot = cv.cuda.resize(screenshot, (400, 400))
注意:你調用的函數的第一個參數應該是GPU矩陣(GPU幀),而不是你剛剛上傳的圖像,這會返回一個新的GPU矩陣。原始的GPU矩陣(gpu_frame)將繼續保存原始圖像,直到新圖像被上傳。第3步:下載處理之后的圖像在GPU上,我們需要把它下載回CPU;screenshot.download()

注意:.download()將從cv轉換為圖像,即從cuda_GpuMat到 numpy.ndarray。在多張圖像上使用如果需要處理新圖片,只需調用.upload()將新圖片加載到現有的GPU矩陣中。圖像在傳遞給GPU之前仍然必須加載到CPU上。import cv2 as cv
img_files = ['bear.png', 'drip.png', 'tldr.png', 'frog.png']
# 創建幀來保存圖片(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)
# 轉換顏色到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)
# 調整圖像
screenshot = cv.cuda.resize(screenshot[1], (200, 200))
# 從GPU下載圖像(cv2) cuda_GpuMat→numpy.ndarray
screenshot = screenshot.download()
這一次我們在預處理中添加了一個反向的binary.threshold()函數;

對多張圖像使用Dask進行并行延時處理使用Dask延時,我們可以將上面的循環推入到Dask延時函數,并行預處理多張圖。import cv2 as cv
import dask.delayed
@dask.delayed
def preprocess(files):
# 復制圖像文件
i_files = files.copy()
# 創建GPU幀來保存圖像
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)
# 轉換顏色到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)
# 調整圖像
screenshot = cv.cuda.resize(screenshot[1], (200, 200))
# 從GPU下載圖像 (cv2.cuda_GpuMat -> numpy.ndarray)
screenshot = screenshot.download()
# 用新圖像
i_files[i] = screenshot
# 輸出預處理圖像
return i_files
添加了另一個.cvtColor()來灰度化圖像,并將反轉的二進制閾值切換為二進制閾值。我們現在可以使用compute()來進行計算了;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']
# 設置延遲
set_a = dask.delayed(preprocess)(img_files)
set_b = dask.delayed(preprocess)(img_files_2)
# 開始計算
out_a, out_b = compute(*[set_a, set_b])
結果

請輸入評論內容...
請輸入評論/評論長度6~500個字
最新活動更多
- 1 AI狂歡遇上油價破百,全球股市還能漲多久? | 產聯看全球
- 2 OpenAI深夜王炸!ChatGPT Images 2.0實測:中文穩、細節炸,設計師慌了
- 3 6000億美元估值錨定:字節跳動的“去單一化”突圍與估值重構
- 4 Tesla AI5芯片最新進展總結
- 5 連夜測了一波DeepSeek-V4,我發現它可能只剩“審美”這個短板了
- 6 熱點丨AI“瑜亮之爭”:既生OpenClaw,何生Hermes?
- 7 AI界的殺豬盤:9秒刪庫跑路,全員被封號,還繼續扣錢!
- 8 2026,人形機器人只贏了面子
- 9 DeepSeek降價90%:價格屠夫不是身份,是戰略
- 10 AI Infra產業鏈卡在哪里了?


分享













