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

OpenCV CUDA模块设备层-----逐通道最小值比较函数min()

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

算法描述

OpenCV 的CUDA并行计算模块(cv::cudev)中的一个设备端内联函数,用于在CUDA核函数中对两个uchar2类型像素值进行逐通道最小值比较。

对两个 uchar2 类型变量(即 2 通道无符号字符类型)进行逐通道比较,返回每个通道中的最小值。
它常用于 GPU 加速的图像融合、像素比较、背景建模等场景。

函数原型

__device__ __forceinline__ uchar2 cv::cudev::min 	( 	const uchar2 &  	a,const uchar2 &  	b ) 	

参数

  • a const uchar2& 第一个输入像素值(x, y 两个通道)
  • b const uchar2& 第二个输入像素值

返回值

  • 返回一个新的 uchar2 值;
  • 每个通道的值为 a.x 和 b.x 的最小值,a.y 和 b.y 的最小值。

代码


#include <opencv2/cudaimgproc.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/cudev/util/vec_math.hpp>using namespace cv;
using namespace cv::cudev;// CUDA 核函数:取两个 uchar2 像素的最小值
template <typename Ptr1, typename Ptr2, typename DstPtr>
__global__ void minKernel(Ptr1 src1, Ptr2 src2, DstPtr 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) {// 获取两个图像的像素值uchar2 val1 = src1(y, x);uchar2 val2 = src2(y, x);// 取最小值并写入输出图像dst(y, x) = min(val1, val2);}
}int main() {// 加载两张图像(假设尺寸相同),转换为 2 通道格式(比如合并两个灰度图为 uchar2)Mat h_img1 = imread("/media/dingxin/data/study/OpenCV/sources/images/img0.jpg", IMREAD_GRAYSCALE);Mat h_img2 = imread("/media/dingxin/data/study/OpenCV/sources/images/img1.jpg", IMREAD_GRAYSCALE);if (h_img1.empty() || h_img2.empty()) {std::cerr << "Failed to load images!" << std::endl;return -1;}// 转换为 2 通道图像(uchar2)Mat h_2ch[] = {h_img1, h_img2};Mat h_combined;merge(h_2ch, 2, h_combined);  // 合并为 CV_8UC2// 上传到 GPUcuda::GpuMat d_combined, d_result;d_combined.upload(h_combined);d_result.create(d_combined.size(), d_combined.type());// 构造访问器auto ptr = PtrStepSz<uchar2>(d_combined);auto dptr = PtrStepSz<uchar2>(d_result);// 设置核函数参数dim3 block(16, 16);dim3 grid((d_combined.cols + block.x - 1) / block.x,(d_combined.rows + block.y - 1) / block.y);// 调用核函数minKernel<<<grid, block>>>(ptr, ptr, dptr, d_combined.cols, d_combined.rows);cudaDeviceSynchronize();// 分离通道并显示结果Mat h_result;d_result.download(h_result);std::vector<Mat> channels;split(h_result, channels);imshow("Min Channel 1", channels[0]);imshow("Min Channel 2", channels[1]);waitKey(0);return 0;
}

运行结果

在这里插入图片描述

http://www.lqws.cn/news/533791.html

相关文章:

  • SpringBoot 中 @Transactional 的使用
  • 【LLM安全】MCP(模型上下文协议)及其关键漏洞、技术细节
  • 力扣网C语言编程题:搜索插入位置
  • mac电脑安装vscode的力扣插件报错解决办法
  • element-plus 按钮 展开/隐藏
  • 百面Bert
  • Ubuntu 搭建Kubernetes 1.28版本集群
  • 代码随想录day16二叉树4
  • 参展回顾 | AI应用创新场景:数据分析助手ChatBI、璞公英教学平台亮相2025四川国际职教大会暨产教融合博览会
  • 装修选木地板还是瓷砖,都有哪些优势?
  • 第一章-人工智能概述-深度学习与AI发展(2/36)
  • MySQL备份和恢复
  • 亚矩阵云手机多开赋能Snapchat矩阵运营:技术原理与场景化破局
  • 解锁企业效率革命:Microsoft 365 Copilot 重塑办公新范式
  • 力扣第14题-最长公共前缀
  • UDP 缓冲区
  • 用Dockerfile点亮你的容器化世界:从零到精通
  • Webshell工具的流量特征分析(菜刀,蚁剑,冰蝎,哥斯拉)
  • aws(学习笔记第四十七课) codepipeline-docker-build
  • LINUX 626 DNS报错
  • WebRTC(十):RTP和SRTP
  • 新手向:Anaconda3的安装与使用方法
  • 【电力物联网】云–边协同介绍
  • C# 项目使用obfuscar混淆
  • ubuntu 下cursor的安装
  • 数据分享:汽车行业-汽车属性数据集
  • 儿童机器人玩具未来的市场空间有多大?
  • kafka命令行操作
  • Maven安装和重要知识点概括
  • 数据结构-第三节-树与二叉树