OpenCV CUDA模块设备层-----用于在 CUDA 核函数中访问纹理数据的一个封装类TexturePtr()

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

TexturePtr<T, R> 是 OpenCV 的 opencv_cudev 模块中用于在 CUDA 核函数中访问纹理数据的一个封装类。它主要用于将一个已创建好的 cudaTextureObject_t 封装为可以在核函数中使用的纹理指针对象。

  • T:纹理元素类型(如 uchar, float)
  • R:底层纹理指针类型(如 Texture2DLayeredPtr)

构造函数说明

构造函数定义:

__host__ TexturePtr(const cudaTextureObject_t tex_)
参数类型描述
tex_cudaTextureObject_t已经创建好的 CUDA 纹理对象

此构造函数仅封装一个纹理对象,不带偏移量信息,适用于不需要 ROI 偏移的场景。

使用流程简述

步骤内容
1. 创建 CUDA Array使用 cudaMallocArray()cudaMemcpy2DToArray()
2. 配置资源描述符cudaResourceDesc
3. 配置纹理描述符cudaTextureDesc
4. 创建纹理对象cudaCreateTextureObject()
5. 构造 TexturePtrTexturePtr<uchar>(texObj)
6. 传入核函数使用模板泛型 template <typename TexPtr>
7. 采样数据在核函数中使用 tex(y, x) 接口

代码示例


#include <opencv2/opencv.hpp>
#include <opencv2/cudaimgproc.hpp>
#include <opencv2/cudev/ptr2d/texture.hpp> // TexturePtrusing namespace cv;
using namespace cudev;// CUDA 错误检查宏
#define CUDA_CHECK(call) \do { \cudaError_t err = call; \if (err != cudaSuccess) { \std::cerr << "CUDA error at " << __FILE__ << ":" << __LINE__ << ": " \<< cudaGetErrorString(err) << std::endl; \exit(EXIT_FAILURE); \} \} while (0)// 核函数:使用 TexturePtr 进行图像缩放(最近邻插值)
template <typename TexPtr>
__global__ void resizeKernel(TexPtr tex, uchar* dst, int dst_cols, int dst_rows, size_t dst_step, float scale) {int x = blockIdx.x * blockDim.x + threadIdx.x;int y = blockIdx.y * blockDim.y + threadIdx.y;if (x < dst_cols && y < dst_rows) {float src_x = x / scale;float src_y = y / scale;dst[y * dst_step + x] = tex(src_y, src_x); // 使用纹理采样}
}void resizeWithTexturePtr(cuda::GpuMat& d_src, cuda::GpuMat& d_dst, float scale) {int width = d_src.cols;int height = d_src.rows;// 创建 CUDA Array 并拷贝数据cudaChannelFormatDesc channel_desc = cudaCreateChannelDesc<uchar>();cudaArray* cu_array = nullptr;CUDA_CHECK(cudaMallocArray(&cu_array, &channel_desc, width, height));CUDA_CHECK(cudaMemcpy2DToArray(cu_array, 0, 0,d_src.data, d_src.step,width, height,cudaMemcpyDeviceToDevice));// 配置纹理资源描述符cudaResourceDesc res_desc = {};memset(&res_desc, 0, sizeof(res_desc));res_desc.resType = cudaResourceTypeArray;res_desc.res.array.array = cu_array;// 配置纹理描述符cudaTextureDesc tex_desc = {};memset(&tex_desc, 0, sizeof(tex_desc));tex_desc.addressMode[0] = cudaAddressModeClamp;tex_desc.addressMode[1] = cudaAddressModeClamp;tex_desc.filterMode = cudaFilterModePoint;tex_desc.readMode = cudaReadModeElementType;tex_desc.normalizedCoords = 0;// 创建纹理对象cudaTextureObject_t texObj = 0;CUDA_CHECK(cudaCreateTextureObject(&texObj, &res_desc, &tex_desc, NULL));// 使用 TexturePtr 封装纹理对象TexturePtr<uchar> texPtr(texObj);// 启动核函数dim3 block(16, 16);dim3 grid((d_dst.cols + block.x - 1) / block.x,(d_dst.rows + block.y - 1) / block.y);resizeKernel<<<grid, block>>>(texPtr, d_dst.data, d_dst.cols, d_dst.rows, d_dst.step, scale);CUDA_CHECK(cudaDeviceSynchronize());// 清理资源CUDA_CHECK(cudaDestroyTextureObject(texObj));CUDA_CHECK(cudaFreeArray(cu_array));
}int main() {// 加载图像(灰度图)cv::Mat h_src = cv::imread("/media/dingxin/data/study/OpenCV/sources/images/Lenna.png", cv::IMREAD_GRAYSCALE);if (h_src.empty()) {std::cerr << "Failed to load image!" << std::endl;return -1;}// 上传到 GPUcv::cuda::GpuMat d_src, d_dst;d_src.upload(h_src);// 设置目标尺寸(放大两倍)float scale = 2.0f;d_dst.create(cvRound(h_src.rows * scale), cvRound(h_src.cols * scale), h_src.type());// 调用基于 TexturePtr 的缩放函数resizeWithTexturePtr(d_src, d_dst, scale);// 下载结果cv::Mat h_dst;d_dst.download(h_dst);// 显示图像cv::imshow("Original", h_src);cv::imshow("Resized (TexturePtr)", h_dst);cv::waitKey(0);return 0;
}

运行结果

在这里插入图片描述

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

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

相关文章

Spring Boot的自动装配和自动配置

Spring Boot的自动装配&#xff08;Auto Wiring&#xff09;和自动配置&#xff08;Auto Configuration&#xff09;是两个不同的概念&#xff0c;它们在Spring框架中各自有不同的作用和用途。下面我将详细解释它们的区别和联系。 自动装配&#xff08;Auto Wiring&#xff09…

如何用 vue-office 快速搭建文档在线预览服务

1. 什么是 vue-office 1.1 vue-office 简介 vue-office 是一个基于 Vue 的组件库,用于在 Web 应用中快速集成 Office 文档的在线预览功能。它支持 Word、Excel 和 PowerPoint 等多种格式,并提供了简洁的 API 接口和丰富的自定义选项。 1.2 支持的文档类型与核心特性 支持的…

Python爬虫(六):Scrapy框架

"Scrapy到底该怎么学&#xff1f;"今天&#xff0c;我将用这篇万字长文&#xff0c;带你从零开始掌握Scrapy框架的核心用法&#xff0c;并分享我在实际项目中的实战经验&#xff01;建议收藏⭐&#xff01; 一、Scrapy简介&#xff1a;为什么选择它&#xff1f; 1.…

Linux中关闭swap分区

在 Linux 系统中关闭 swap 分区&#xff08;或交换文件&#xff09;的步骤如下&#xff0c;请务必在操作前保存所有数据&#xff0c;以免丢失&#xff1a; &#x1f4cc; 完整操作步骤&#xff1a; 1. 查看当前 swap 使用情况 free -h swapon --show # 查看活跃的 swap 设…

RPGMZ游戏引擎之如何设计每小时开启一次的副本

本文知识点 1. 获取时间 2. 时间格式要正确 3. 事件内如何设计 正文开始 1. 获取时间 首先获取当前时间 然后保存在 事件内的变量里面 后需要判断时间是否相等 function 获取当前日期(){const now new Date();return now.toISOString();}; 2. 时间格式要正确 now.toI…

学习路之uniapp--uniapp扩展uni-ui

这里写目录标题 一、新建项目二、下载导入插件三、直接创建uni-ui项目 一、新建项目 二、下载导入插件 三、直接创建uni-ui项目 创建uniapp项目时&#xff0c;直接创建uni-ui项目

Kotlin 2.6 猜数小游戏

本次实战通过开发猜数小游戏&#xff0c;深入学习了 Kotlin 编程的循环控制和条件判断。游戏要求计算机随机生成一个数字&#xff0c;用户通过输入猜测&#xff0c;程序根据猜测结果给出提示&#xff0c;直到猜中为止。通过实现这一过程&#xff0c;我们掌握了如何使用 while 循…

RNN工作原理和架构

## 1. 什么是 RNN&#xff1f; * **全称&#xff1a;** Recurrent Neural Network&#xff08;循环神经网络&#xff09; * **核心特点&#xff1a;** 它是一种专门设计用来处理**序列数据**的神经网络。 * **核心能力&#xff1a;** 拥有“记忆”能力&#xff0c;能够利用**…

智能计算模拟:第一性原理+分子动力学+机器学习

第一性原理分子动力学机器学习”三位一体的综合手段&#xff0c;已经成为模拟计算的一个前沿方向&#xff0c;为解决传统计算化学方法面临的挑战提供了新的解决方案。国内外已有科研团队在深化第一性原理与分子动力学的研究与应用拓展&#xff0c;利用机器学习优化大规模计算、…

基于Attention机制的模型。这使得它摆脱了RNN模型顺序读取序列的缺点,可以实现高度的并行化的理解

这句话的核心意思是:​​该模型完全基于注意力机制(Attention Mechanism),不再依赖传统的循环神经网络(RNN)结构,因此避免了 RNN 的顺序计算问题,能够实现高效的并行化计算​​。我们可以从以下几个方面深入理解: 1. ​​"仅基于 Attention 机制"​​ ​​传…

解决虚拟机 Kali 系统安装了VMware Tools 不能拖入文件问题

进入终端&#xff0c;这里我是root模式下&#xff0c;不是root模式在命令前加一个sudo即可&#xff0c;命令如下&#xff1a; apt install open-vm-tools open-vm-tools-desktop 执行成功后输入 reboot 重启后即可

GitHub OAuth 认证示例

GitHub链接&#xff1a;github_auth 流程图 功能特性 ✅ GitHub OAuth 认证✅ 获取用户基本信息✅ 显示用户的 GitHub 仓库列表✅ 安全的会话管理✅ 响应式用户界面 技术栈 后端 Flask - Python Web 框架Flask-CORS - 跨域资源共享Requests - HTTP 库Session - 会话管理 …

百度萝卜快跑携4颗禾赛激光雷达进军迪拜,千辆L4无人车开启全球化战略

3月28日,百度旗下自动驾驶出行服务平台“萝卜快跑”宣布在迪拜市区启动无人驾驶规模化测试及服务,计划部署超1000辆L4级全无人驾驶汽车。此次出海不仅是萝卜快跑首次在中国以外地区实现规模化落地,更以“单车搭载4颗禾赛激光雷达”的硬件配置引发行业关注,标志着中国自动驾…

湖北师范大学人工智能与计算机学院电子信息研究生课程《随机过程》第六次作业

一. 计算题&#xff08;共10题&#xff0c;100分&#xff09; 1. (计算题, 10分)随机信号 的实测样本函数如题图(a)与(b)所示&#xff0c; &#xff0c;期中X为随机变量&#xff0c; &#xff0c;试说明它们可能是均值各态历经的吗&#xff1f;&#xff08;写明道理&#xff…

解决Windows Server打开DNS提示“拒绝访问”和“RPC服务器不可用”

问题背景 在一个活动目录域xyzz.internal中&#xff0c;有两台域控制器&#xff08;Domain Controller&#xff09;&#xff0c;各位于一个站点。 问题 当我们在其中一台域控制器上的服务器管理器中打开DNS管理工具时&#xff0c;却看到类似如下错误&#xff0c;提示拒绝访问…

Python中字符串常用的操作方法

在Python中&#xff0c;字符串是不可变序列类型&#xff0c;提供了丰富的内置方法。以下是常用的字符串操作方法及示例&#xff1a; 1. 大小写转换 lower() 转小写 upper() 转大写 capitalize() 首字母大写 title() 每个单词首字母大写 swapcase() 大小写互换 print(&q…

利用百度/高德地图API实现车辆轨迹跟踪系统

利用百度/高德地图API实现车辆轨迹跟踪系统 摘要: 本文详细阐述了如何利用百度地图API或高德地图API构建一套完整的车辆轨迹跟踪系统。内容涵盖系统架构设计、数据采集与传输、地图API核心功能实现(地图展示、轨迹绘制、实时定位、历史轨迹回放)、关键优化技术(轨迹纠偏、…

解锁K-近邻算法:数据挖掘的秘密武器

目录 一、K - 近邻算法是什么二、算法原理深度剖析2.1 核心思想2.2 距离度量方式2.3 K 值的选择2.4 分类决策规则 三、K - 近邻算法实践3.1 准备数据集3.2 代码实现步骤3.3 结果分析与评估 四、K - 近邻算法优缺点4.1 优点阐述4.2 缺点分析 五、应用案例展示5.1 图像识别领域5.…

华为OD机试_2025 B卷_构成正方形数量(Python,100分)(附详细解题思路)

题目描述 输入N个互不相同的二维整数坐标&#xff0c;求这N个坐标可以构成的正方形数量。[内积为零的的两个向量垂直] 输入描述 第一行输入为N&#xff0c;N代表坐标数量&#xff0c;N为正整数。N < 100 之后的 K 行输入为坐标x y以空格分隔&#xff0c;x&#xff0c;y为整…

Qt:智能指针QScopedPointer使用

QScopedPointer和C中的智能指针std::unique_ptr其概念是一样的&#xff0c;它包装了new操作符在堆上分配的动态对象&#xff0c;能够保证动态创建的对象在任何时候都可以被正确地删除。但它有更严格的所有权&#xff0c;并且不能转让&#xff0c;一旦获取了对象的管理权&#x…