极智AI | cv::cuda::GpuMat数据排布的误区

news2024/11/15 13:41:11

欢迎关注我的公众号 [极智视界],获取我的更多经验分享

大家好,我是极智视界,本文来谈谈 cv::cuda::GpuMat 数据排布的误区。

邀您加入我的知识星球「极智视界」,星球内有超多好玩的项目实战源码下载,链接:https://t.zsxq.com/0aiNxERDq

opencv 是一个功能强大的图像处理库,被广泛应用于计算机视觉和机器学习领域。在计算机视觉领域,一般说到图像数据排布大抵就是 NCHW、NHWC、CHW 等等。拿 opencv 来说,它的主要图像数据结构 cv::Mat 就是 CHW 的。这应该很好理解,如果是 RGB 的图像,那它的 opencv 数据排布就是 RRRGGGBBB 的,这就是 CHW。那么如果是 HWC 呢,那应该就是 RGBRGBRGB 了。

好了,这里要开始说 cv::cuda::GpuMat 数据排布的误区了。先来看一下下面这些操作:

# cpu数据
cv::Mat img = cv::imread("./data/img.png");
cv::cvtColor(img, img, cv::COLOR_BGR2RGB, 0);

# gpu数据
uint8_t *gpuBuf;
cudaMalloc(&gpuBuf, sizeof(u_int8_t) * img.cols * img.rows * 3);
cv::cuda::GpuMat gimg;
gimg.upload(img);
cv::uint8_t *data = (cv::uint8_t *)gpuBuf;
cv::cuda::GpuMat dst(cv::Size(img.cols, img.rows), CV_8UC3, data);
gimg.copyTo(dst);

# 下放cpu数据
cv::Mat cimg;
gimg.download(cimg);

到道理,主要做了读取一张图片赋给 img,img 是 cpu 上的 cvMat,然后将它 upload 给 gimg,它是 gpu 上的 cvMat,然后这里还有个数据是 gpuBuf,它是展平后的 gpu 上的数据。

那么这个时候你可以考虑一下,不考虑 device 的话,单纯从数值来看,img.data == gimg.data == gpuBuf? 成立吗,估计大部分人都会觉得是成立的,因为中间咱们只是做了一些内存拷贝的操作,并没有太多特殊的操作,数据应该是不会改动的。我来给答案,它们是不完全一致的。哪个有问题呢,答案是 gimg.data。

来看一下下面的对比图,你就了解了:

左边是 img.data (gpuBuf 和 img.data 一致),右边是 gimg.data。可以看到 gimg.data 后面有很多补零,这是因为 cv::cuda::GpuMat.data 的数据是 2048 字节补齐的,而同为 cpu 版的 mat.data 就不会有这个问题,这个误区很容易让人犯错。比如你如果用 gimg.data 来代替 gpuBuf 使用,结果就会有问题;或者你可能实验了将 gimg download 到 cpu mat (也就是代码中的 cimg),然后结果又是正确的,就认为 gimg.data 没有问题,想当然地认为 gimg.data 等价于 cimg.data,这样其实进一步导致这个问题并不太容易被发现。

好了,以上分享了谈谈 cv::cuda::GpuMat 数据排布的误区。希望我的分享能对你的学习有一点帮助。


【极智视界】

《极智AI | cv::cuda::GpuMat数据排布的误区》

畅享人工智能的科技魅力,让好玩的AI项目不难玩。邀请您加入我的知识星球,星球内我精心整备了大量好玩的AI项目,皆以工程源码形式开放使用,涵盖人脸、检测、分割、多模态、AIGC、自动驾驶、工业等。不敢说会对你学习有所帮助,但一定非常好玩,并持续更新更加有趣的项目。https://t.zsxq.com/0aiNxERDq

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/738742.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Tomcat NIO 实现

1. tomcat网络整体架构 来自 https://www.cnblogs.com/cuzzz/p/17499364.html 上图是tomcat整个网络请求模型 Acceptor线程作为监听线程,会通过通过 accept 方法 获取连接,该线程没有使用selector进行多路复用,使用了阻塞式的accept有请求连接后&#x…

UE5《Electric Dreams》项目PCG技术解析 之 PCGCustomNodes详解(二)Look At

继续解析《Electric Dreams》项目中的自定义节点和子图 文章目录 前导文章Look AtExecute with ContextPoint Loop Body使用范例Get Actor Data节点的设置LookAt节点的设置Add节点的设置 小结 前导文章 《虚幻引擎程序化资源生成框架PCG 之 UPCGBlueprintElement源码笔记&…

阿里云轻量应用服务器使用教程(从0到1网站上线)

阿里云轻量应用服务器怎么使用?阿里云百科分享轻量应用服务器从选配、配置建站环境、轻量服务器应用服务器远程连接、开端口到网站上线全流程: 阿里云轻量应用服务器使用教程 轻量应用服务器很火爆因为成本足够低,阿里云2核2G3M带宽轻量服务…

第一批用ChatGPT坐牢的人,都玩的是哪些套路?

通过GPT在短时间内生成完整诈骗话术,套路啊套路 “虚拟角色”可以虚拟客服,还可以虚拟恋人玩杀猪盘 让受害人以为自己“坠入爱河” 套路还是从前的套路 但骗子用上了新的工具 又换上了很多马甲 防不胜防 你以为OpenAI不知道骗子会用这个工具来做坏…

数据库之MySQL数据操作练习

目录 练习内容 worker表要求 创建的表的表结构 表中的数据内容 对数据的操作 1.显示所有职工的基本信息 2.查询所有职工所属部门的部门号,不显示重复的部门号 3.求出所有职工的人数 4.列出最高工和最低工资 5.列出职工的平均工资和总工资 6.创建一个只有职…

深度学习之权重初始化

在深度学习中,神经网络的权重初始化方法( w e i g h t weight weight i n i t i a l i z a t i o n initialization initialization)对模型的收敛速度和性能有着至关重要的影响。说白了,神经网络其实就是对权重参数 w w w的不停迭代更新,以达…

基于Javaweb实现ATM机系统开发实战(五)新增用户功能实现

新增用户非常简单,前端拿到数据传递给后端然后往数据库里一存就完事了~ 首先我们看一下新增用户的页面:add.jsp, 可以看到提交的页面:insert 和方式post,但是少了密码的添加,所以我们手动给他加上&#xf…

阿里云——网站建设:部署与发布(知识点)

作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​ 目录 前言 学习目标 1.建站: (1)建站基本步骤 2.域…

导入Excel数据【EasyPoi实战系列】- 第480篇

历史文章(文章累计480) 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 【…

Docker操作镜像相关命令

[rootdocker02 ~]# docker image ##查看docker命令 docker image search 搜索镜像, 优先选官方,stars数量多(尽量不选择第三方镜像) 第三方镜像不支持搜索,特点是特别长。 官方仓库地址:https://hub.docker.com/ 官方仓库 官方镜像…

v-for遍历数组或者对象,渲染结构、v-bind动态设置class和style

(一)v-for数组变化(增加一项,删除一项), 会更新页面吗?那么数组改变后,是如何更新的呢? 1. v-for 作用:可以遍历数组或者对象,用于渲染结构。遍历数组语法&#xff1a…

robotframework之python扩展库编写

通过对robot自动化框架的使用,大大方便了我们做自动化测试。但很多时候官网提供的扩展库并不能满足我们的测试要求,此时就需要我们编写自己的扩展库。这里以ubuntu下使用python编写自定义扩展库举例说明。 最近笔者在做物联网方面的自动化测试&#xff…

FASTADMIN联合查询 搜索

控制器中添加relationSearch开关 控制器里面添加联合查询 MODEL里面添加 js里面添加即可 可以查看数据json 搜索开启searchFileds就可以了

❤️创意网页:生日快乐!穿越奇妙时光的温暖庆祝(HTML+CSS+JS)简单好用

✨博主:命运之光 🌸专栏:Python星辰秘典 🐳专栏:web开发(简单好用又好看) ❤️专栏:Java经典程序设计 ☀️博主的其他文章:点击进入博主的主页 前言:欢迎踏入…

【Linux】使用git 连接到远程gitee仓库

一.创建gitee仓库 登陆到自己的gitee,点击新建仓库 输入仓库名称,注意gitee初次创建仓库时只能设置成私有的 创建后的页面是这样的,复制HTTPS 二.git三板斧 1.安装git 打开xshell,输入命令: yum install git 可以输入…

SpringBoot中集成Flyway实现数据库sql版本管理入门以及遇到的那些坑

场景 Git/ SVN 是代码界的版本控制工具,那么,Flyway 就是一款数据库界的版本控制工具, 它可以记录数据库的变化记录。可能很多公司都是通过人工去维护、同步数据库脚本, 但经常会遇到疏忽而遗漏的情况,举个简单的例…

glob找不到文件而os.listdir可以

前几天遇到了一个问题,就是glob找不到文件而os.listdir可以 /mnt/data/datasets/abc[123]: ├── img_0001.jpg ├──img_0002.jpg代码 import os import glob path /mnt/data/datasets/abc[123] os.listdir(path) glob.glob(os.path.join(path, *.…

ES6: Proxy概念及用法

Proxy如其名, 它的作用是在对象和和对象的属性值之间设置一个代理,获取该对象的值或者设置该对象的值, 以及实例化等等多种操作, 都会被拦截住, 经过这一层我们可以统一处理,我们可以认为它就是“代理器” …

使用 @Autowired 为什么会被 IDEA 警告,应该怎么修改最佳?

# 问题原因 关于这个问题,其实答案相对统一,实际上用大白话说起来也容易理解。 1.初始化问题 先看一下Java初始化类的顺序:父类的静态字段 > 父类静态代码块 > 子类静态字段 > 子类静态代码块 > 父类成员变量 > 父类构造代码块…

前端学习——Web API (Day3)

事件流 事件流和两个阶段说明 事件捕获 事件冒泡 阻止冒泡 解绑事件 事件委托 案例 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" …