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

发布于:2025-07-02 ⋅ 阅读:(15) ⋅ 点赞:(0)
  • 操作系统: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;
}

运行结果

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到