OpenCV CUDA模块设备层-----双曲正切函数tanh()

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

算法描述

OpenCV 的CUDA模块(cudev) 中的一个设备函数,用于在 GPU 上对uchar4类型的向量(如 RGBA 像素)进行双曲正切(hyperbolic tangent)运算,并返回一个float4类型的结果。

函数原型

__device__ __forceinline__ float4 cv::cudev::tanh(const uchar4 &a)

参数

  • const uchar4 &a 输入参数为一个4通道的无符号字符向量(如 RGBA 像素)

代码


#include <opencv2/opencv.hpp>
#include <opencv2/cudev/common.hpp>

// CUDA核函数
__global__ void apply_tanh_kernel(uchar4* src, float4* dst, int width, int height) {
    int x = blockIdx.x * blockDim.x + threadIdx.x;
    int y = blockIdx.y * blockDim.y + threadIdx.y;
    
    if (x < width && y < height) {
        int idx = y * width + x;
        dst[idx] = cv::cudev::tanh(src[idx]);
    }
}

int main() {
    // 创建测试图像(256x256 RGBA)
    cv::Mat src(256, 256, CV_8UC4);
    cv::randu(src, cv::Scalar(0, 0, 0, 0), cv::Scalar(255, 255, 255, 255));
    
    // 分配设备内存
    cv::cuda::GpuMat d_src, d_dst;
    d_src.upload(src);
    d_dst.create(src.size(), CV_32FC4);
    
    // 调用核函数
    dim3 block(16, 16);
    dim3 grid((src.cols + block.x - 1) / block.x, 
              (src.rows + block.y - 1) / block.y);
    
    apply_tanh_kernel<<<grid, block>>>(
        d_src.ptr<uchar4>(), 
        d_dst.ptr<float4>(), 
        src.cols, 
        src.rows
    );
    
    // 将结果下载回主机
    cv::Mat dst;
    d_dst.download(dst);
    
    // 显示结果(只显示第一个通道作为示例)
    cv::imshow("Original", src);
    cv::Mat channels[4];
    cv::split(dst, channels);
    cv::imshow("Tanh Result", channels[0]);
    cv::waitKey(0);
    
    return 0;
}

运行结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

村北头的码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值