OpenCV CUDA模块设备层----计算向量的平方根函数sqrt

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

运行结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

村北头的码农

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

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

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

打赏作者

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

抵扣说明:

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

余额充值