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;
}

运行结果

相关推荐
GuWenyue5 小时前
写Agent还要重复封装工具?一套MCP多服务方案,3个能力让AI自动查地图、读写文件、操控浏览器
人工智能·机器学习·开源
GuWenyue5 小时前
90%AI新手不会调参!LangChain双模型流水线实战,一套代码兼顾严谨+创意
人工智能
光锥智能7 小时前
WAIC亮点|兼具泛化能力与作业效率的极智嘉机器人天团
人工智能·机器人
阳光是sunny7 小时前
LangGraph中的Reducer是什么
前端·人工智能·后端
甲维斯7 小时前
Kimi K3 重构10000行单文件屎山代码!
人工智能
阳光是sunny7 小时前
从链到图:LangGraph 入门基础全解析
前端·人工智能·后端
新知图书7 小时前
11.3 详细实现与核心配置(作业批改智能体开发)
人工智能·agent·ai agent·智能体·扣子
深度研习笔记8 小时前
OpenCV工业视觉实战11|多线程解耦+视频流稳流+推理加速,彻底解决卡顿阻塞,实现毫秒级工业实时检测
人工智能·opencv·计算机视觉
delishcomcn8 小时前
AI视觉识别+分切算法:电化铝缺陷检测与裁切一体化解锁
人工智能·算法
触底反弹9 小时前
深入理解大模型采样:Temperature、Top-K、Top-P 的原理与实战
人工智能·算法·面试