专业的编程技术博客社区

网站首页 > 博客文章 正文

OpenCV CUDA简介(opencv cuda python)

baijin 2024-08-30 11:46:21 博客文章 2 ℃ 0 评论

文章概述

?处理单个图像

?处理一系列图像

?对一系列图像使用Dask进行并行延时处理

处理单个图像

首先,我们需要创建GPU空间(GPU_frame)来保存图像(就像相框保存图片一样),然后才能将图像上传到GPU。

第1步:上传

import cv2 as cv

gpu_frame = cv.cuda_GpuMat()

下一步,用CPU将图像加载到内存中(截图),并将其.upload到gpu上(帧图像);

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

gpu_frame.upload(screenshot)

我们可以开始了。

第2步:开始玩图像

OpenCV CUDA函数返回cv2.cuda_GpuMat(GPU矩阵),因此每个结果都可以在用户不必重新upload的情况下操作。

让我们把图像从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)将继续保存原始图像,直到新图像被upload。

第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])

结果如下:

结尾

谢谢你的阅读。Github链接:https://github.com/Dropout-Analytics/opencv_cuda。

扩展阅读:

?https://medium.com/dropout-analytics/opencv-cuda-for-videos-f3dcf346e398?https://medium.com/dropout-analytics/pycuda-on-jetson-nano-7990decab299?https://medium.com/dropout-analytics/beginners-guide-to-knn-with-cuml-ddca099f9e9d

参考引用

1.Koriukina, Valeriia. “Getting Started with OpenCV CUDA Module.” Learn OpenCV, Learnopencv.com, 15 Sept. 2020, learnopencv.com/getting-started-opencv-cuda-modul.2.McWhorter, Paul. “AI on the Jetson Nano LESSON 10: Installing OpenCV for Python 3.” Paul McWhorter — YouTube, Youtube.com/User/Mcwhorpj, 2 Nov. 2019, youtu.be/3QYayL5y2hk.3.Pulli, Kari; Baksheev, Anatoly; Kornyakov, Kirill; Eruhimov, Victor. “Realtime Computer Vision with OpenCV.” Realtime Computer Vision with OpenCV — ACM Queue, Association for Computing Machinery, 22 Apr. 2012, queue.acm.org/detail.cfm?id=2206309.

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表