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