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

OpenCV CUDA模块设备层-----高效地计算两个uint 类型值的平均值函数vavg2()

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

算法描述

OpenCV 的 CUDA 模块(cudev) 中的一个设备端内联函数,用于高效地计算两个 uint 类型值的平均值(取整)。
该函数返回两个无符号整数 a 和 b 的整数平均值,

函数原型

__device__ __forceinline__ uint cv::cudev::vavg2(uint a, uint b)

参数

  • a uint 第一个无符号整数(通常表示像素值)
  • b uint 第二个无符号整数(另一个像素值或参考值)

使用场景

这个函数常用于以下图像处理任务中:

  • 图像混合(blending)
  • 下采样(downsampling)
  • 多帧平均去噪(multi-frame average denoising)
  • GPU 上的快速像素级平均操作

代码


#include <opencv2/cudev.hpp>
#include <opencv2/cudev/util/simd_functions.hpp>using namespace cv::cudev;// CUDA kernel
template <typename T>
__global__ void computeAvgKernel(const PtrStep<T> src1, const PtrStep<T> src2, PtrStep<T> 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) {uint a = static_cast<uint>(src1(y, x));uint b = static_cast<uint>(src2(y, x));dst(y, x) = static_cast<T>(vavg2(a, b));}
}int main() {// 读取两幅图像cv::Mat h_src1 = cv::imread("/media/dingxin/data/study/OpenCV/sources/images/img0.jpg", cv::IMREAD_GRAYSCALE);cv::Mat h_src2 = cv::imread("/media/dingxin/data/study/OpenCV/sources/images/img1.jpg", cv::IMREAD_GRAYSCALE);if (h_src1.empty() || h_src2.empty()) {std::cerr << "Failed to load images!" << std::endl;return -1;}// 上传到 GPUcv::cuda::GpuMat d_src1, d_src2, d_avg;d_src1.upload(h_src1);d_src2.upload(h_src2);d_avg.create(h_src1.size(), h_src1.type());// 设置 kernel 参数dim3 block(16, 16);dim3 grid((d_src1.cols + block.x - 1) / block.x,(d_src1.rows + block.y - 1) / block.y);// 启动 kernel(显式指定模板参数 uchar)computeAvgKernel<uchar><<<grid, block>>>(d_src1, d_src2, d_avg, d_src1.cols, d_src1.rows);// 下载结果并显示cv::Mat h_avg;d_avg.download(h_avg);cv::imshow("Original Image 1", h_src1);cv::imshow("Original Image 2", h_src2);cv::imshow("Averaged Image", h_avg);cv::waitKey(0);return 0;
}

运行结果

在这里插入图片描述

http://www.xdnf.cn/news/14778.html

相关文章:

  • android核心技术摘要
  • gin框架 中间件 是在判断路由存在前执行还是存在后执行的研究
  • 机器学习:集成学习方法之随机森林(Random Forest)
  • 【Unity】MiniGame编辑器小游戏(九)打砖块【Breakout】
  • 【前端】基础 - HTML基础标签和样式设置
  • 【新手小白的嵌入式学习之路】-STM32的学习_GPIO 8种模式学习心得
  • 第二章AIGC入门:打开人工智能生成内容的新世界大门(3/36)
  • Windows连接L2TP/IPsec 协议 VPN失败
  • QT异步操作
  • Kuikly 与 Flutter 的全面对比分析,结合技术架构、性能、开发体验等核心维度
  • QT初识-实现Hello World(2)
  • Qt Quick 与 QML(五)qml中的布局
  • 运维打铁: 数据加密与备份恢复策略制定
  • 免费版安全性缩水?ToDesk、TeamViewer、向日葵、网易UU远程访问隐私防护测评
  • 【卡尔曼滤波第一期】α−β−γ 滤波器概述
  • [CS创世SD NAND征文] 精准控制的坚固基石:CS创世SD NAND在华大HC32F4A0运动控制卡中的高可靠应用
  • 如何在Excel中每隔几行取一行
  • Foundation 5 安装使用教程
  • 【仿muduo库实现并发服务器】Poller模块
  • Python应用指南:利用高德地图API获取公交+地铁可达圈(二)
  • UE5.6 官方文档笔记 [1]——虚幻编辑器界面
  • Qt_Creator入门基础知识
  • BFD故障检测技术之概述
  • 2025 推理技术风向标:DeepSeek-R1 揭示大模型从 “记忆” 到 “思考” 的进化路径
  • k8s将service的IP对应的不同端口分配到不同的pod上
  • day48
  • 【仿muduo库实现并发服务器】Connection模块
  • 630,百度文心大模型4.5系列开源!真香
  • mac python3.13 selenium安装使用
  • 半无界波动方程混合条件求解