OpenCV使用CUDA处理图像的教程与实战

小白学视觉

共 4412字,需浏览 9分钟

 · 2021-02-06

点击上方小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

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, (400400))
注意:你调用的函数的第一个参数应该是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, 105255, cv.THRESH_BINARY_INV)
        
    # 调整图像
    screenshot = cv.cuda.resize(screenshot[1], (200200))

    # 从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, 125255, cv.THRESH_BINARY)

        # 调整图像
        screenshot = cv.cuda.resize(screenshot[1], (200200))
        
        # 从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-Analytis/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.



☆ END ☆
下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲
小白学视觉公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲
小白学视觉公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群


欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~



浏览 16
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报