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

OpenCV CUDA模块设备层-----在 GPU上高效地执行两个uint类型值的最小值比较函数vmin2()

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

算法描述

OpenCV 的CUDA模块(cudev) 中的一个设备端内联函数,用于在GPU上高效地执行两个uint类型值的最小值比较。
该函数返回两个无符号整数 a 和 b 中的较小值:

return (a < b) ? a : b;

函数原型

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

参数

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

返回值

返回 a 和 b 中较小的那个值,类型为 uint。

使用场景

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

  • 图像增强(如取最小邻域值)
  • 构建自定义滤波器(如最小值滤波)
  • 多帧合成中的最小值投影(如去除高亮噪声)
  • GPU 并行像素级比较与选择操作

代码

#include <opencv2/cudev.hpp>
#include <opencv2/cudev/util/simd_functions.hpp>using namespace cv::cudev;// CUDA kernel
template <typename T>
__global__ void computeMinKernel(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>(vmin2(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_min;d_src1.upload(h_src1);d_src2.upload(h_src2);d_min.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)computeMinKernel<uchar><<<grid, block>>>(d_src1, d_src2, d_min, d_src1.cols, d_src1.rows);// 下载结果并显示cv::Mat h_min;d_min.download(h_min);cv::imshow("Min Image", h_min);cv::waitKey(0);return 0;
}

运行结果

在这里插入图片描述

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

相关文章:

  • 《人生顶层设计》读书笔记6
  • 开源无广告面板mdserver-web:替代宝塔实现服务器轻松管理
  • 地下管线安全的智能监测先锋:智能标志桩图像监测装置解析​
  • 矩阵批量剪辑源码搭建定制化开发:支持OEM
  • 爬虫技术-获取浏览器身份认证信息(如 Cookie、Token、Session 等)
  • Python 中如何使用 Conda 管理版本和创建 Django 项目
  • 【Docker】如何设置 `wiredTigerCacheSizeGB` 和 `resources.limits.memory`
  • BenchmarkSQL 测试 PostgreSQL 时遇到 numeric field overflow 报错的原因与解决方案
  • 请求未达服务端?iOS端HTTPS链路异常的多工具抓包排查记录
  • 区块链真的会是未来吗?
  • TCP粘包、拆包、解决
  • 什么是协同归因和贡献归因
  • WhoDB:一款基于Web的免费AI数据库管理工具
  • 刷卡登入数据获取
  • 【ArcGISPro】基于Pro的Python环境进行Django简单开发Web
  • 两个PHY芯片之间,是如何连接进行通信的?
  • 并行科技MaaS平台支持文心4.5系列开源模型调用
  • MySQL主从延迟深度解析:现象、原因与实战解决方案
  • KMP(Kotlin Multiplatform)改造(Android/iOS)老项目
  • 舵轮时钟-STM32-28路PWM--ESP8266-NTP时间
  • Babylon.js 材质克隆与纹理共享:你可能遇到的问题及解决方案
  • 从UI设计到数字孪生实战演练:构建智慧城市的智慧停车系统
  • 大势智慧亮相第十八届中国智慧城市大会
  • 暑期出游,解锁“智慧”新玩法!
  • 浏览器原生控件上传PDF导致hash值不同
  • 使用HAProxy搭建Web群集:原理、步骤与实战总结
  • AlpineLinux安装RabbitMQ及其管理界面
  • 攻防世界0-MISC-隐藏的信息
  • VS Code 的 Copilot Chat 扩展程序
  • AI学习笔记三十:基于yolov8的web显示