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

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.lqws.cn/news/607087.html

相关文章:

  • Notepad++ 复制宏、编辑宏的方法
  • 机器学习在智能能源管理中的应用:需求响应与可再生能源整合
  • 在Ubuntu上多网卡配置HTTP-HTTPS代理服务器
  • 基于SpringBoot和Leaflet的区域冲突可视化系统(2025企业级实战方案)
  • CAN从站转Modbus TCP主站总线协议转换网关
  • LeetCode 11.盛最多水的容器
  • 基于centOS9(redhat9)使用NGINX搭建discuz论坛
  • 深度解析Linux内核IPv4设备管理:net/ipv4/devinet.c
  • 创客匠人深度解构 IP 定位:从使命驱动到差异化落地的实践路径
  • 【RHCSA-Linux考试题目笔记(自用)】servera的题目
  • 云上配送革命:亚矩云手机如何重塑Uber Eats的全球外卖生态
  • vue中ref()和reactive()区别
  • 新手向:MySQL完全指南,从零开始掌握数据库操作
  • 洪水填充算法详解
  • 智能学号抽取系统 V3.7.5 —— 一个基于 Vue.js 的交互式网页应用
  • SpringCloud系列(46)--SpringCloud Bus实现动态刷新全局广播
  • Prompt Engineering Guide — 提示工程全方位指南
  • 博图SCL编程:数据隐式转换使用详解与实战案例
  • ABAP+记录一个BDC的BUG修改过程
  • moodle升级(4.5到5.0)
  • 数据结构学习之栈
  • 计算机视觉---视觉伺服控制
  • mac mini m4安装node.js@16以下版本方法
  • nignx+Tomcat+NFS负载均衡加共享储存服务脚本
  • 重塑智能体决策路径:深入理解 ReAct 框架
  • 使用OpenCV训练自有模型的实践
  • 金融安全生命线:用AWS EventBridge和CloudTrail构建主动式入侵检测系统
  • Chrome 下载文件时总是提示“已阻止不安全的下载”的解决方案
  • VR制作公司业务范围
  • 【NumPy第二期:深入学习NumPy:切片、索引与数组操作进阶】