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

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'

相关文章:

  • 写网站建设的软文东莞今天最新消息新闻
  • 网站开发多少工资同城推广平台有哪些
  • 网站换服务器要怎么做免费建网站
  • 国内环保行业网站开发张家港seo建站
  • 网站建设制作 南京公司3000块钱在朋友圈投放广告
  • 网站排名优化机构今天高清视频免费播放
  • 开篇:4周的时间设计并开发一个个性化具备专业知识的东方命理师AI agent!
  • Jenkins 全面解析:作用、功能、优势与对比
  • 猿人学js逆向比赛第一届第十三题
  • Web Worker 通信封装与实战应用详解
  • C语言专题——关键字详解
  • Kafka的消费消息是如何传递的?
  • 关于Makefile
  • 【动手学深度学习】4.7. 前向传播、反向传播和计算图
  • 飞算 JavaAI 插件炸场!一小时搭图书管理系统
  • Python训练营-Day40-训练和测试的规范写法
  • 10-C#的dataGridView1和datatable的使用
  • 【Pandas】pandas DataFrame merge
  • 飞往大厂梦之算法提升-day08
  • libevent(1)之基础概述
  • 网站公安网安备案查询API集成指南
  • 元宇宙时代实物建模新趋势:动态纹理映射与实时渲染方案
  • 【驱动设计的硬件基础】PCI和PCI-E
  • TongWeb替换tomcat
  • 【机器学习深度学习】多层神经网络的构成
  • MySQL深分页性能瓶颈:问题分析与解决方案