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

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

算法描述

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

函数原型

cpp 复制代码
__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 核函数中对图像像素进行操作时,可能会用到:

cpp 复制代码
__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文件:

cpp 复制代码
#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;
}

运行结果

相关推荐
nju_spy13 分钟前
复杂结构数据挖掘(二)关联规则挖掘 Association rule mining
人工智能·数据挖掘·关联规则挖掘·apiriori·dhp·fp-growth·高频集
刀客Doc18 分钟前
刀客doc:亚马逊广告再下一城,拿下微软DSP广告业务
大数据·人工智能·microsoft
AndrewHZ1 小时前
【图像处理基石】GIS图像处理入门:4个核心算法与Python实现(附完整代码)
图像处理·python·算法·计算机视觉·gis·cv·地理信息系统
掘金安东尼1 小时前
Google+禁用“一次性抓取100条搜索结果”,SEO迎来变革?
人工智能
FIN66681 小时前
射频技术领域的领航者,昂瑞微IPO即将上会审议
前端·人工智能·前端框架·信息与通信
小麦矩阵系统永久免费1 小时前
短视频矩阵系统哪个好用?2025最新评测与推荐|小麦矩阵系统
大数据·人工智能·矩阵
Mr.Lee jack1 小时前
【vLLM】源码解读:高性能大语言模型推理引擎的工程设计与实现
人工智能·语言模型·自然语言处理
IT_陈寒1 小时前
Java性能优化:这5个Spring Boot隐藏技巧让你的应用提速40%
前端·人工智能·后端
MicroTech20251 小时前
微算法科技(NASDAQ:MLGO)开发延迟和隐私感知卷积神经网络分布式推理,助力可靠人工智能系统技术
人工智能·科技·算法
喜欢吃豆1 小时前
多轮智能对话系统架构方案(可实战):从基础模型到自我优化的对话智能体,数据飞轮的重要性
人工智能·语言模型·自然语言处理·系统架构·大模型·多轮智能对话系统