OpenCV CUDA模块设备层-----线性插值函数log()

发布于:2025-06-30 ⋅ 阅读:(21) ⋅ 点赞:(0)
  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

该函数用于创建线性插值访问器,支持对GPU内存中的图像数据进行双线性插值采样。主要应用于图像缩放、旋转等几何变换中需要亚像素级精度的场景。
为输入图像构造一个基于“双线性插值”的访问器对象 LinearInterPtrSz,可以在 CUDA 核函数中按需访问缩放后的像素值。
它本身不执行图像缩放操作,而是返回一个封装了插值逻辑的对象,供后续核函数调用时使用。

函数原型

template <typename SrcPtr>
__host__ LinearInterPtrSz<typename PtrTraits<SrcPtr>::ptr_type>
cv::cudev::interLinear(const SrcPtr& src);

参数

  • src const SrcPtr& 输入图像指针类型(如 GpuMat, PtrStepSz 等)

代码示例


#include <opencv2/opencv.hpp>
#include <opencv2/cudev/common.hpp>
#include <opencv2/cudev/util/vec_math.hpp>


__global__ void logKernel(const uchar1* src, float1* dst, int size) {
    int idx = blockIdx.x * blockDim.x + threadIdx.x;
    if(idx < size) {
        dst[idx] = cv::cudev::log(src[idx]);
    }
}

int main() {
    const int N = 256;
    uchar1 h_src[N];
    float1 h_dst[N];
    
    // 初始化输入数据
    for(int i=0; i<N; ++i) {
        h_src[i].x = i+1; // 避免log(0)
    }

    // 分配设备内存
    uchar1* d_src;
    float1* d_dst;
    cudaMalloc(&d_src, N*sizeof(uchar1));
    cudaMalloc(&d_dst, N*sizeof(float1));
    
    // 数据传输
    cudaMemcpy(d_src, h_src, N*sizeof(uchar1), cudaMemcpyHostToDevice);

    // 启动核函数
    dim3 block(256);
    dim3 grid((N + block.x - 1)/block.x);
    logKernel<<<grid, block>>>(d_src, d_dst, N);

    // 回传结果
    cudaMemcpy(h_dst, d_dst, N*sizeof(float1), cudaMemcpyDeviceToHost);

    // 打印前10个结果
    for(int i=0; i<10; ++i) {
        printf("log(%d) = %.4f\n", h_src[i].x, h_dst[i].x);
    }

    // 释放资源
    cudaFree(d_src);
    cudaFree(d_dst);
    return 0;
}

运行结果

log(1) = 0.0000
log(2) = 0.6931
log(3) = 1.0986
log(4) = 1.3863
log(5) = 1.6094
log(6) = 1.7918
log(7) = 1.9459
log(8) = 2.0794
log(9) = 2.1972
log(10) = 2.3026

网站公告

今日签到

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