文章概述·处理单个图像 ·处理一系列图像 ·对一系列图像使用Dask进行并行延时处理 处理单个图像首先,我们需要创建GPU空间(GPU_frame)来保存图像(就像相框保存图片一样),然后才能将图像上传到GPU。 第1步:上传 import cv2 as cvgpu_frame = cv.cuda_GpuMat() 下一步,用CPU将图像加载到内存中(截图),并将其.upload到gpu上(帧图像);
我们可以开始了。 第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:
注意:download()将从cv转换为图像,从cuda_GpuMat到numpy.ndarray。 处理一系列图像要处理新图片,只需用upload()将新图片加载到现有的GPU矩阵中。图像在传递给GPU之前同样须加载到CPU上。 import cv2 as cvimg_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延时函数,并行预处理多个系列的图像。
我还添加了第二个cvtColor()来灰度化图像,并将反转的二进制阈值切换为二进制阈值。 我们现在可以使用compute(); from dask import computeimg_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。 |
|
来自: taotao_2016 > 《图像处理》