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

重磅干货,第一时间送达
import cv2 as cvgpu_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 cvgpu_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 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]}")# 上传到GPUgpu_frame.upload(screenshot)# 转换颜色到opencv (numpy) ndarray→cv2.cuda_GpuMatscreenshot = cv.cuda.cvtColor(gpu_frame, cv.COLOR_RGB2BGR)# 反向阈值@ 100screenshot = cv.cuda.threshold(screenshot, 105, 255, cv.THRESH_BINARY_INV)# 调整图像screenshot = cv.cuda.resize(screenshot[1], (200, 200))# 从GPU下载图像(cv2) cuda_GpuMat→numpy.ndarrayscreenshot = 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]}')# 上传到GPUgpu_frame.upload(screenshot)# 转换颜色到opencv (numpy) ndarray→cv2.cuda_GpuMatscreenshot = cv.cuda.cvtColor(gpu_frame, cv.COLOR_RGB2BGR)screenshot = cv.cuda.cvtColor(screenshot, cv.COLOR_BGR2GRAY)# 反向阈值@ 100screenshot = 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 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-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“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

OpenCV使用CUDA处理图像的教程与实战相关推荐

  1. opencv、opencv_contrib及cuda联合编译详细教程

    opencv.opencv_contrib及cuda联合编译详细教程 最近在使用opencv时需要用cuda加速,网上了很多帖子,踩了很多雷,摸索出来了一点规律,分享给大家,一起探讨(我也是刚刚入手, ...

  2. 计算机视觉用显卡,基于GPU加速的计算机视觉编程:使用OpenCV和CUDA实时处理复杂图像数据...

    本书是OpenCV开发人员的推荐阅读指南,手把手教你使用OpenCV和CUDA实现GPU加速的计算机视觉项目开发,帮你快速掌握利用GPU实时处理复杂图像数据的高效技术.全书共11章,章介绍CUDA架构 ...

  3. 使用Python,OpenCV进行去水印,图像修复

    图像修复是图像保存和图像恢复的一种形式,其历史可以追溯到1700年代,当时意大利威尼斯的公共图片修复总监彼得·爱德华兹(Pietro Edwards)应用这种科学方法来修复和保存著名作品(资料来源). ...

  4. 独家|OpenCV 1.6 改变图像的对比度和亮度!

    翻译:陈之炎 校对:吴金迪本文约2500字,建议阅读5分钟本文为大家介绍了OpenCV改变图像的对比度和亮度. 目标 在本教程中, 你将学习到以下内容: 访问像素值; 用零初始化矩阵; 学习CV :: ...

  5. OpenCV GPU 简单遍历图像

    OpenCV GPU  简单遍历图像 [cpp] view plaincopy print? #include "cuda_runtime.h" #include "de ...

  6. OpenCV之core 模块. 核心功能(1)Mat - 基本图像容器 OpenCV如何扫描图像、利用查找表和计时 矩阵的掩码操作 使用OpenCV对两幅图像求和(求混合(blending))

    Mat - 基本图像容器 目的 从真实世界中获取数字图像有很多方法,比如数码相机.扫描仪.CT或者磁共振成像.无论哪种方法,我们(人类)看到的是图像,而让数字设备来"看"的时候,则 ...

  7. 使用OpenCV和Python从图像中提取形状

    Welcome to the first post in this series of blogs on extracting features from images using OpenCV an ...

  8. C++下opencv学习笔记(一)(图像的简单读取丶显示与存储)

    C++下opencv学习笔记(一)(图像的简单读取丶显示与存储) 前言 学习C++ OpenCV,第一需要具备面向对象语言的基础,第二要对图像处理机器学习有基础了解,容易入门.觉得自己基础已经有了可以 ...

  9. cuda学习笔记5——CUDA实现图像形态学腐蚀、膨胀

    cuda学习笔记5--CUDA实现图像形态学腐蚀.膨胀 代码 linux如何编译cuda和opencv代码 耗时情况 代码 #include "cuda_runtime.h" #i ...

最新文章

  1. python数据驱动读取用例_Python Selenium 之数据驱动测试
  2. win10安装java1.8开发环境JDK
  3. springboot+shiro+redis项目整合
  4. log 的 debug()、 error()、 info()方法的区别
  5. 经典:某程序员手机里保存的五十条牛B短信
  6. ftp服务器web里有个文件,web实现ftp服务器文件
  7. Oracle数据库索引使用及索引失效总结
  8. windows如何在局域网下共享文件(传输文件、修改文件)
  9. 一步步学习微软InfoPath2010和SP2010--第三章节--表单设计基础:处理InfoPath布局、控件和视图(2)--添加一个布局和表格
  10. 使用Java模拟浏览器登陆网站(以抓取武汉理工大学教务处学生个人课表网页为例)
  11. OpenSTF手机设备管理平台-------二次开发
  12. ctc系统通信前置服务器,CTC系统包括哪些接口服务器?
  13. 约瑟夫问题(小小算法,真不可笑)
  14. 程序员深爱的bilibili后台源码泄露,看哔哩哔哩官方回应才放心了
  15. 受益匪浅!Spring事务是如何传播的附架构师必备技术详解
  16. 《Redis设计与实现》笔记
  17. java去除字符串中最后一个字符_java中字符串如何去除最后一个字符方法
  18. JavaScript之ECMAScript
  19. Rootkit 后门的利用 --超详细
  20. 计算机编程的主要内容,什么是电脑编程电脑编程的概述

热门文章

  1. Scikit-learn 发布 0.20版本!新增处理缺失值、合并Pandas等亮点功能
  2. 马斯克宣布特斯拉破产,自己哭晕在车旁?
  3. 同事乱用 Redis 卡爆,我真是醉了...
  4. 趣谈 23 种设计模式(多图 + 代码)
  5. Mybatis-plus常用API全套教程,看完没有不懂的
  6. Spring Boot 和Apache Kafka的集成
  7. Grafana 7.0 发布:改进的界面、新的插件平台和可视化等
  8. 面试:HashMap 夺命二十一问!鸡哥都扛不住~
  9. 微服务架构之「 配置中心 」
  10. 字节跳动AI Lab 再失大将!大牛王长虎被爆已离职回归学界!