- 操作系統:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 編程語言:C++11
算法描述
是 OpenCV 的 CUDA 模塊(cv::cudev) 中的一個 設備端內聯函數(device function),用于在 CUDA 核函數中對兩個 uchar1 類型像素值進行逐通道的最大值比較。
對兩個 uchar1 類型變量(即單通道無符號字符類型)進行逐通道比較,返回每個通道中的最大值。
由于 uchar1 是單通道數據類型(等價于 unsigned char),因此這個函數實際上就是返回 a 和 b 中較大的那個值。
它通常用于圖像處理中實現 像素級最大值濾波、圖像融合、閾值操作等 GPU 加速場景。
函數原型
__device__ __forceinline__ uchar1 cv::cudev::max ( const uchar1 & a,const uchar1 & b )
參數
- a const uchar1& 第一個輸入像素值
- b const uchar1& 第二個輸入像素值
返回值
- 返回一個新的 uchar1 值,表示 a 和 b 的最大值。
- 因為是單通道類型,所以直接返回 max(a.x, b.x)。
代碼
#include <opencv2/cudaimgproc.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/cudev/util/vec_math.hpp>using namespace cv;
using namespace cv::cudev;// CUDA 核函數:取兩個圖像像素的最大值
template <typename Ptr1, typename Ptr2, typename DstPtr>
__global__ void maxKernel(Ptr1 src1, Ptr2 src2, DstPtr dst, int width, int height) {int x = blockIdx.x * blockDim.x + threadIdx.x;int y = blockIdx.y * blockDim.y + threadIdx.y;if (x < width && y < height) {// 獲取兩個圖像的像素值uchar1 val1 = src1(y, x);uchar1 val2 = src2(y, x);// 取最大值并寫入輸出圖像dst(y, x) = max(val1, val2);}
}int main() {// 加載兩張圖像(假設尺寸相同)Mat h_img1 = imread("/media/dingxin/data/study/OpenCV/sources/images/img0.jpg", IMREAD_GRAYSCALE);Mat h_img2 = imread("/media/dingxin/data/study/OpenCV/sources/images/img1.jpg", IMREAD_GRAYSCALE);if (h_img1.empty() || h_img2.empty()) {std::cerr << "Failed to load images!" << std::endl;return -1;}// 上傳到 GPUcuda::GpuMat d_img1, d_img2, d_result;d_img1.upload(h_img1);d_img2.upload(h_img2);d_result.create(d_img1.size(), d_img1.type());// 構造 PtrStepSz 訪問器auto ptr1 = PtrStepSz<uchar1>(d_img1);auto ptr2 = PtrStepSz<uchar1>(d_img2);auto dptr = PtrStepSz<uchar1>(d_result);// 設置核函數參數dim3 block(16, 16);dim3 grid((d_img1.cols + block.x - 1) / block.x,(d_img1.rows + block.y - 1) / block.y);// 調用核函數maxKernel<<<grid, block>>>(ptr1, ptr2, dptr, d_img1.cols, d_img1.rows);cudaDeviceSynchronize();// 下載結果并顯示Mat h_result;d_result.download(h_result);imshow("Max Image", h_result);waitKey(0);return 0;
}