- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
OpenCV 的 CUDA 设备函数(device function),用于在 GPU 上计算一个 uchar4 类型向量的平方根,并返回一个 float4 类型的结果。
这个函数通常出现在 OpenCV 的 CUDA 加速图像处理代码中,例如:
- 图像归一化(Normalization)
- 色彩空间转换
- 卷积、滤波等操作中涉及数值稳定性的平方根计算
它被设计为在 CUDA kernel 中高效使用,适用于需要对图像像素批量执行数学运算的高性能场景。
函数原型
__device__ __forceinline__ float4 cv::cudev::sqrt(const uchar4 &a)
参数
- const uchar4 &a 输入参数是一个 uchar4 类型的常量引用(即 4 个无符号字符)
代码
#include <opencv2/opencv.hpp>
#include <opencv2/cudaimgproc.hpp>
#include <opencv2/cudev.hpp>
#include <iostream>
__global__ void sqrtKernel(const uchar4* input, float4* output, int numPixels) {
int idx = blockIdx.x * blockDim.x + threadIdx.x;
if (idx < numPixels) {
output[idx] = cv::cudev::sqrt(input[idx]);
}
}
int main() {
// 读取图像(RGBA 格式)
cv::Mat bgr = cv::imread("/media/dingxin/data/study/OpenCV/sources/images/img0.jpg");
if (bgr.empty()) {
std::cerr << "Failed to load image!" << std::endl;
return -1;
}
// 转换为 RGBA
cv::Mat src;
cv::cvtColor(bgr, src, cv::COLOR_BGR2BGRA);
int width = src.cols;
int height = src.rows;
int numPixels = width * height;
// 将输入图像上传到 GPU
uchar4* d_input;
cudaMalloc(&d_input, numPixels * sizeof(uchar4));
cudaMemcpy(d_input, src.ptr<uchar4>(), numPixels * sizeof(uchar4), cudaMemcpyHostToDevice);
// 分配输出内存
float4* d_output;
cudaMalloc(&d_output, numPixels * sizeof(float4));
// 启动 kernel
int blockSize = 256;
int numBlocks = (numPixels + blockSize - 1) / blockSize;
sqrtKernel<<<numBlocks, blockSize>>>(d_input, d_output, numPixels);
// 下载结果回 CPU
cv::Mat result(height, width, CV_32FC4);
cudaMemcpy(result.ptr<float4>(), d_output, numPixels * sizeof(float4), cudaMemcpyDeviceToHost);
// 显示或保存结果(例如将每个通道 clamp 到 [0,1] 并归一化显示)
cv::Mat display;
cv::normalize(result, display, 0, 1, cv::NORM_MINMAX, CV_32F);
cv::imshow("Result", display);
cv::waitKey(0);
// 清理资源
cudaFree(d_input);
cudaFree(d_output);
return 0;
}