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