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