当前位置: 首页 > news >正文

OpenCV CUDA模块设备层-----在 GPU 上执行类似于 std::copy 的操作函数warpCopy()

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

算法描述

OpenCV 的 CUDA 模块(cudev) 中的一个设备端内联模板函数,用于在 GPU 上执行类似于 std::copy 的操作,但专门针对 warp 规模的数据复制
该函数的作用是:
将一个范围内的元素从输入迭代器 beg 到 end 之间复制到输出迭代器 out 所指向的位置。

函数原型

 template<class InIt , class OutIt >
__device__ __forceinline__ OutIt cv::cudev::warpCopy 	
( 	InIt  	beg,InIt  	end,OutIt  	out 
) 		

参数

  • InIt 输入迭代器类型(例如 PtrTraits<…>::ptr_type)
  • OutIt 输出迭代器类型(例如 PtrTraits<…>::ptr_type)

返回值

返回最终的输出迭代器 out,指向最后一个复制元素之后的位置,便于链式调用或后续操作。

使用场景

这个函数通常用于以下情况:

  • 在 CUDA kernel 中进行快速内存拷贝(如图像像素、数组等)
  • 实现自定义的图像变换或数据搬运逻辑
  • 构建更复杂的并行算法(如分块处理、扫描、归约)

它非常适合在每个线程负责多个数据项的场景下使用(即“warp-level”粒度的复制),可以提高内存访问效率和并行利用率。

代码

#include <opencv2/opencv.hpp>
#include <opencv2/cudaimgproc.hpp>
#include <opencv2/cudev.hpp>using namespace cv;
using namespace cv::cudev;// 使用 warpCopy 的 kernel,用于高效复制一行像素
template <typename T>
__global__ void copyWarpCopyKernel(PtrStep<T> src,               // 注意:不是 constPtrStep<T> dst,int roiX, int roiY,int roiWidth, int roiHeight)
{int y = blockIdx.y * blockDim.y + threadIdx.y;if (y < roiHeight) {T* srcRow = &src(roiY + y, roiX);  // 正确获取非 const 指针T* dstRow = &dst(y, 0);warpCopy(srcRow, srcRow + roiWidth, dstRow);}
}int main() {// 加载图像(灰度图)Mat h_src = imread("/media/dingxin/data/study/OpenCV/sources/images/Lenna.png", IMREAD_GRAYSCALE);if (h_src.empty()) {std::cerr << "Failed to load image!" << std::endl;return -1;}// 设置 ROI 参数int roiX = 100;int roiY = 50;int roiWidth = 320;int roiHeight = 240;// 上传到 GPUcuda::GpuMat d_src, d_dst;d_src.upload(h_src);d_dst.create(roiHeight, roiWidth, d_src.type());// 配置 kernel 参数(仅在 Y 方向并行)dim3 block(16, 16);dim3 grid(1, (roiHeight + block.y - 1) / block.y);// 启动 kernelcopyWarpCopyKernel<uchar><<<grid, block>>>(d_src, d_dst, roiX, roiY, roiWidth, roiHeight);// 下载结果Mat h_dst;d_dst.download(h_dst);// 显示结果imshow("Copied ROI", h_dst);waitKey(0);return 0;
}

运行结果

在这里插入图片描述

http://www.dtcms.com/a/265502.html

相关文章:

  • gateway断言配置详解
  • Web基础关键_007_JavaScript 的 DOM
  • 算法学习笔记:5.后缀数组——从原理到实战,涵盖 LeetCode 与考研 408 例题
  • 华为c编程规范
  • 【大模型】从0到1:DeepSeek + Coze API调用全攻略,企业,开发个人专属AI智能体使用详解,小白也能轻松上手
  • Qt编程-qml操作(js,c++,canvas)
  • spring boot如何只修改配置文件就解决swagger漏洞
  • Spring 6 源码深度掘金:66+核心原理与高频面试攻坚指南
  • 朝鲜APT组织使用Nim语言恶意软件对macOS发起隐秘Web3与加密货币攻击
  • 中国户外品牌全球竞争力榜单发布:科技突围与文化赋能重塑行业格局
  • 现代工程科技杂志投稿
  • 后端MVC(控制器与动作方法的关系)
  • 微服务外联Feign调用:第三方API调用的负载均衡与容灾实战
  • C++之路:类基础、构造析构、拷贝构造函数
  • Rust Web 全栈开发(一):构建 TCP Server
  • Go基础(Gin)
  • Webpack 5 核心机制详解与打包性能优化实践
  • 牛客:HJ16 购物单【01背包】【华为机考】
  • 前端单元测试覆盖率工具有哪些,分别有什么优缺点
  • 在 Sepolia 上使用 Zama fhEVM 构建隐私代币与流动性池:全流程实战指南
  • Android音视频探索之旅 | CMake基础语法 创建支持Ffmpeg的Android项目
  • 【免费.NET方案】CSV到PDF与DataTable的快速转换
  • 音频动态压缩算法曲线实现
  • C++【成员变量、成员函数、this指针】
  • OSPF高级特性之FRR
  • Vue 项目在哪里加载「字典数据」最好
  • 基于 alpine 构建 .net 的基础镜像
  • 开源模型应用落地-让AI更懂你的每一次交互-Mem0集成Qdrant、Neo4j与Streamlit的创新实践(四)
  • Zookeeper 客户端 .net访问框架 ZookeeperNetEx项目开发编译
  • 开源 C# .net mvc 开发(六)特殊控制控制台、周期、邮件编程