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

OpenCV CUDA模块设备层-----创建一个“常量指针访问器” 的工具函数constantPtr()

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

算法描述

在 CUDA 设备端模拟一个“指向常量值”的虚拟指针访问器,使得你可以像访问数组一样访问一个固定值。
这在某些核函数中非常有用,例如当你希望将一个标量值作为图像或矩阵来使用时(如与卷积核、滤波器结合)。

函数原型

__host__ ConstantPtr<T> cv::cudev::constantPtr 	( 	T  	value	) 	

参数

  • value T 要封装为常量访问器的值。

使用场景举例

  • 在 CUDA 核函数中将一个标量值当作“全图常量图像”使用;
  • 与 filter2D, convolve, 自定义卷积核等结合使用;
  • 简化逻辑,统一接口:无论输入是真实图像还是常量图像,都可调用相同的访问器接口。

代码示例


#include <opencv2/core/cuda.hpp>
#include <opencv2/cudev/ptr2d/constant.hpp>
#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv::cudev;// 核函数:使用 constantPtr 访问一个常量图像
__global__ void fillKernel(const ConstantPtr<uchar> src,uchar* dst,int width,int height) {int x = blockIdx.x * blockDim.x + threadIdx.x;int y = blockIdx.y * blockDim.y + threadIdx.y;if (x >= width || y >= height)return;// 无论坐标是什么,都返回常量值dst[y * width + x] = src(y, x);
}int main() {const int width = 640;const int height = 480;const uchar constantValue = 128;// 创建 GPU 图像cv::cuda::GpuMat d_dst(height, width, CV_8UC1);// 使用 constantPtr 封装一个常量值auto constAccessor = constantPtr(constantValue);dim3 block(16, 16);dim3 grid((width + block.x - 1) / block.x,(height + block.y - 1) / block.y);fillKernel<<<grid, block>>>(constAccessor, d_dst.ptr<uchar>(),width, height);// 下载结果cv::Mat h_dst;d_dst.download(h_dst);// 显示图像信息std::cout << "Image size: " << h_dst.size() << ", type: " << h_dst.type() << std::endl;std::cout << "First pixel value: " << static_cast<int>(h_dst.at<uchar>(0, 0)) << std::endl;// 保存图像cv::imwrite("constant_image.png", h_dst);std::cout << "Saved image as 'constant_image.png'" << std::endl;return 0;
}

运行结果

Image size: [640 x 480], type: 0
First pixel value: 128
Saved image as 'constant_image.png'
http://www.xdnf.cn/news/14668.html

相关文章:

  • 从设备自动化到智能管控:MES如何赋能牛奶饮料行业高效生产?
  • IAR平台全面升级,提升瑞萨MCU架构的嵌入式软件开发效率
  • C++语言发展历程-2025
  • 在大数据求职面试中如何回答分布式协调与数据挖掘问题
  • 单片机——浮点数转换4位数码管显示
  • JVM内存模型详解
  • 设计模式精讲 Day 11:享元模式(Flyweight Pattern)
  • STM32和C++ 实现配置文件导入、导出功能
  • uniapp+vue3做小程序,获取容器高度
  • 【开源工具】一键解决使用代理后无法访问浏览器网页问题 - 基于PyQt5的智能代理开关工具开发全攻略
  • OVS Faucet练习(下)
  • 【Linux指南】文件管理高级操作(复制、移动、查找)
  • 【基础篇-消息队列】——详解 RocketMQ 和 Kafka 的消息模型
  • VR看房:房地产数字化转型的核心引擎
  • RSYNC+IONTIFY数据实时同步
  • 二刷苍穹外卖 day03
  • MySQL基础函数篇
  • (C++)素数的判断(C++教学)(C语言)
  • 逻辑门电路Multisim电路仿真汇总——硬件工程师笔记
  • es中常规的根据字段查询时走什么索引(说明:「常规的根据字段查询」不包含分词查询)
  • 2025-06-22 思考-人的意识与不断走向死亡的过程
  • 文心一言(ERNIE Bot):百度打造的知识增强大语言模型
  • 端侧调用云存储实现头像存储
  • Redis快的原因
  • 扫雷中的数学原理
  • 如何用AI开发完整的小程序<9>—UI自适应与游戏页优化
  • 基于python代码的通过爬虫方式实现TK下载视频(2025年6月)
  • 【期末速成】编译原理
  • 【好用但慎用】Windows 系统中将所有 WSL 发行版从 C 盘迁移到 非系统 盘的完整笔记(附 异常处理)
  • C++ 中 QVector 的判断与操作