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

运行结果

相关推荐
腾讯云开发者2 小时前
港科大郭毅可谈Agentic AI时代的核心命题:人机共生,人不可能退场
人工智能
常丛丛2 小时前
5.6 LangGraph-Edges理解-Agent图的道路系统
人工智能
雪隐2 小时前
个人电脑玩AI-08让5060 Ti给你打工——我拿 Unlimited-OCR扫了 600 页书,然后悟了
人工智能·后端
Coffeeee2 小时前
Prompt要花心思写,与 AI 对话的七个技巧
人工智能·aigc·ai编程
蝎子莱莱爱打怪3 小时前
Claude Code 官宣新升级:子智能体默认后台跑,你边聊它边干活
人工智能
武子康3 小时前
调查研究-206 DeepSeek DSpark 深度解析:大模型推理加速,正在从“模型能力”转向“系统工程”
人工智能·agent·deepseek
甲维斯3 小时前
最佳work模型sonnet5来了,直接就能用!
人工智能
IT_陈寒4 小时前
React hooks 闭包陷阱把我的状态吃掉了,原来问题出在这里
前端·人工智能·后端
冬奇Lab16 小时前
Workflow 系列(03):状态管理——持久化、幂等性与版本绑定
人工智能·工作流引擎