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