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

OpenCV CUDA模块设备层---- 绝对值函数abs()

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

算法描述

这是 OpenCV 的 cv::cudev 模块中用于 CUDA 设备端(device)的绝对值函数,专门处理 uchar1 类型(即单通道无符号字符)。

函数原型

__device__ __forceinline__ uchar1 cv::cudev::abs 	( 	const uchar1 &  	a	) 	
  • device: 表示这个函数只能在 CUDA 设备端(GPU)运行。
  • forceinline: 强制内联,提高性能。
  • uchar1: CUDA 内建类型,表示一个包含 1 个 unsigned char 的向量(类似 struct { unsigned char x; };)。
  • cv::cudev::abs(a): 返回输入值的绝对值。对于 uchar 来说其实等价于直接返回 a,因为它是无符号类型。

示例使用场景

在 CUDA 核函数中对图像像素进行操作时,可能会用到:

__global__ void absKernel(const cv::cudev::PtrStep<uchar> src,cv::cudev::PtrStep<uchar> dst)
{int x = blockIdx.x * blockDim.x + threadIdx.x;int y = blockIdx.y * blockDim.y + threadIdx.y;if (x < src.cols && y < src.rows){uchar val = src(y, x);dst(y, x) = cv::cudev::abs(make_uchar1(val)).x;}
}

示例代码

cu文件:


#include <opencv2/opencv.hpp>
#include <opencv2/cudaimgproc.hpp>
#include <opencv2/cudev/util/vec_math.hpp>using namespace cv;
using namespace cudev;__global__ void absKernel(PtrStepSz<uchar> src, PtrStepSz<uchar> dst)
{int x = blockIdx.x * blockDim.x + threadIdx.x;int y = blockIdx.y * blockDim.y + threadIdx.y;if (x < src.cols && y < src.rows){uchar1 val = make_uchar1(src(y, x));dst(y, x) = cv::cudev::abs(val).x;}
}int main()
{Mat h_src = imread("/media/dingxin/data/study/OpenCV/sources/images/Lenna.png", IMREAD_GRAYSCALE);if (h_src.empty()){std::cerr << "Failed to load image!" << std::endl;return -1;}cuda::GpuMat d_src, d_dst;d_src.upload(h_src);d_dst.create(h_src.size(), h_src.type());PtrStepSz<uchar> srcPtr(d_src);PtrStepSz<uchar> dstPtr(d_dst);dim3 block(16, 16);dim3 grid((srcPtr.cols + block.x - 1) / block.x,(srcPtr.rows + block.y - 1) / block.y);absKernel<<<grid, block>>>(srcPtr, dstPtr);cudaDeviceSynchronize();Mat h_dst;d_dst.download(h_dst);imshow("Original", h_src);imshow("Abs Result", h_dst);waitKey(0);return 0;
}

运行结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.dtcms.com/a/253465.html

相关文章:

  • HarmonyOS 5 原子化服务卡片测试全攻略
  • 探究webView与html的通讯
  • LLaVA-Med常见问题解决方案
  • 论文笔记 <交通灯><多智能体>MetaLight:基于价值的元强化学习用于交通信号控制
  • day13-软件包管理
  • 22.流程控制函数
  • python校园服务交流系统
  • VUE3(一)、基础语法
  • iOS开发中的安全实践:如何通过Ipa混淆与加固确保应用安全
  • 特种设备安全管理:使用单位的 “责任清单”
  • 贝叶斯定理:AI大模型的概率统计基石
  • 青少年编程与数学 01-011 系统软件简介 27 备份恢复工具
  • 新零售系统商城开发全解析
  • 爱普特APT32F1104C8T6单片机 高抗干扰+硬件加密双保障
  • TensorFlow深度学习实战——Transformer变体模型
  • C++11中alignof和alignas的入门到精通指南
  • C++ 标准模板库各个容器的应用场景分析
  • 查询pgsql表字段 包含 name 的表
  • 基于Rust的Polars学习笔记
  • C# .net core添加单元测试项目,依赖注入接口测试
  • QtitanRibbon为能源工业打造高效应用体验:实现系统中的现代化UI
  • java设计模式[4]之设计型模式
  • qt 实现socket 通讯 demo
  • 一篇文章快速学会HTML
  • 用Go写一个飞书机器人定时发送消息的程序
  • 《企业司法风险监控系统架构设计:从数据采集到T+1实时预警的完整解决方案》
  • macOS版的节点小宝上架苹果APP Store了
  • 碳化硅在轨道车辆永磁牵引电动机的优势和应用
  • 深度解析 Cursor(逐行解析系统提示词、分享高效制定 Cursor Rules 的技巧...)
  • 架构优化——submodule转为subtree