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

运行结果

相关推荐
冬奇Lab22 分钟前
一天一个开源项目(第78篇):MiroFish - 用群体智能引擎预测未来
人工智能·开源·资讯
冬奇Lab29 分钟前
你的 Skill 真的好用吗?来自OpenAI的 Eval 系统化验证 Agent 技能方法论
人工智能·openai
数智工坊36 分钟前
Transformer 全套逻辑:公式推导 + 原理解剖 + 逐行精读 - 划时代封神之作!
人工智能·深度学习·transformer
GreenTea1 小时前
AI 时代,工程师的不可替代性在哪里
前端·人工智能·后端
小程故事多_801 小时前
破除迷思,Harness Engineering从来都不是时代过渡品
人工智能·架构·prompt·aigc
热爱专研AI的学妹1 小时前
Seedance 2.0(即梦 2.0)深度解析:AI 视频正式迈入导演级精准可控时代
大数据·人工智能·阿里云·音视频
Ulyanov2 小时前
用Pyglet打造AI数字猎人:从零开始的Python游戏开发与强化学习实践
开发语言·人工智能·python
lcj09246662 小时前
磁控U位管理系统与DCIM对接实现:筑牢数据中心精细化运维底座
大数据·数据库·人工智能
swipe2 小时前
用 Nest + LangChain 打造 OpenClaw 式 Agent 定时任务系统
人工智能·llm·agent
幻风_huanfeng2 小时前
人工智能之数学基础:动量梯度下降法
人工智能·机器学习·动量梯度下降法