- 操作系统: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;
}