Skip to the content.

Mini-OpenCV — GPU 图像处理库

CI Docs License: MIT CUDA C++17 CMake

English 简体中文

基于 CUDA 的高性能图像处理库 — 覆盖像素操作、卷积、形态学、几何变换、滤波、色彩空间转换与异步流水线处理。所有算子均 GPU 并行实现,提供类 OpenCV 风格的 C++ API。

架构总览

┌─────────────────────────────────────────────────────────┐
│                    用户应用层                             │
│         ImageProcessor  ·  PipelineProcessor             │
├─────────────────────────────────────────────────────────┤
│                    算子层 (CUDA Kernels)                  │
│  PixelOperator │ ConvolutionEngine │ HistogramCalculator  │
│  ImageResizer  │ Morphology        │ Threshold            │
│  ColorSpace    │ Geometric         │ Filters              │
│  ImageArithmetic                                         │
├─────────────────────────────────────────────────────────┤
│                    基础设施层                             │
│  DeviceBuffer · MemoryManager · StreamManager · CudaError │
│  GpuImage · HostImage · ImageIO (stb)                    │
└─────────────────────────────────────────────────────────┘

功能特性

类别 算子 优化技术
像素操作 反色、灰度化、亮度调整 逐像素并行
卷积 高斯模糊、Sobel 边缘检测、自定义卷积核 Shared Memory Tiling
直方图 计算、均衡化 原子操作 + 并行规约
缩放 双线性插值、最近邻插值 任意尺寸
形态学 腐蚀、膨胀、开/闭运算、梯度、顶帽、黑帽 可自定义结构元素
阈值 全局阈值、自适应阈值、Otsu 自动阈值 直方图驱动
色彩空间 RGB/HSV/YUV 转换、通道分离/合并 批量转换
几何变换 旋转、翻转、仿射/透视变换、裁剪、填充 双线性插值
滤波 中值、双边、盒式、锐化、拉普拉斯 保边去噪
图像算术 加/减/乘、Alpha 混合、加权和、绝对差 标量 & 图像
流水线 多步骤串联、批量异步处理 多 CUDA Stream 并发

系统要求

构建

mkdir build && cd build
cmake -DBUILD_TESTS=ON -DBUILD_EXAMPLES=ON ..
make -j$(nproc)

构建选项

选项 默认值 说明
BUILD_TESTS ON 构建单元测试 (GTest v1.14.0)
BUILD_EXAMPLES ON 构建示例程序
BUILD_BENCHMARKS OFF 构建基准测试 (Google Benchmark v1.8.3)
GPU_IMAGE_ENABLE_IO ON 启用 stb 图像文件 I/O

使用示例

基础使用

#include "gpu_image/gpu_image_processing.hpp"

using namespace gpu_image;

int main() {
    ImageProcessor processor;
    
    // 创建测试图像
    HostImage hostImage = ImageUtils::createHostImage(256, 256, 3);
    // ... 填充图像数据 ...
    
    // 上传到 GPU
    GpuImage gpuImage = processor.loadFromHost(hostImage);
    
    // 处理
    GpuImage inverted = processor.invert(gpuImage);
    GpuImage blurred = processor.gaussianBlur(gpuImage, 5, 1.5f);
    GpuImage edges = processor.sobelEdgeDetection(gpuImage);
    
    // 下载结果
    HostImage result = processor.downloadImage(inverted);
    
    return 0;
}

流水线处理

#include "gpu_image/gpu_image_processing.hpp"

using namespace gpu_image;

int main() {
    PipelineProcessor pipeline(4);  // 4 个 CUDA streams
    
    // 添加处理步骤
    pipeline.addStep([](GpuImage& img, cudaStream_t stream) {
        GpuImage temp;
        PixelOperator::adjustBrightness(img, temp, 20, stream);
        img = std::move(temp);
    });
    
    pipeline.addStep([](GpuImage& img, cudaStream_t stream) {
        GpuImage temp;
        ConvolutionEngine::gaussianBlur(img, temp, 3, 1.0f, stream);
        img = std::move(temp);
    });
    
    // 批量处理
    std::vector<HostImage> inputs = /* ... */;
    std::vector<HostImage> outputs = pipeline.processBatchHost(inputs);
    
    return 0;
}

运行测试

cd build
ctest --output-on-failure

运行基准测试

./bin/benchmark

GPU 架构支持

架构 Compute Capability 代号
Turing SM 75 RTX 20xx / T4
Ampere SM 80 / 86 A100 / RTX 30xx
Ada Lovelace SM 89 RTX 40xx / L4
Hopper SM 90 H100

项目结构

mini-opencv/
├── include/gpu_image/          # 公共头文件(19 个模块)
│   ├── gpu_image_processing.hpp  # 统一入口头文件
│   ├── image_processor.hpp       # 高级同步 API
│   ├── pipeline_processor.hpp    # 流水线异步 API
│   ├── convolution_engine.hpp    # 卷积算子
│   ├── morphology.hpp            # 形态学算子
│   ├── geometric.hpp             # 几何变换
│   ├── filters.hpp               # 滤波 + 图像算术
│   ├── color_space.hpp           # 色彩空间转换
│   ├── threshold.hpp             # 阈值处理
│   ├── device_buffer.hpp         # RAII GPU 内存
│   └── ...                       # cuda_error, gpu_image, stream_manager 等
├── src/                          # CUDA/C++ 源文件(16 个)
├── tests/                        # 单元测试(12 个测试文件)
├── examples/                     # 示例程序
│   ├── basic_example.cpp           # 基础用法
│   └── pipeline_example.cpp        # 流水线用法
├── benchmarks/                   # 性能基准测试
└── CMakeLists.txt                # CMake 构建系统

API 参考

ImageProcessor

主要的用户接口类,提供同步的图像处理方法。

方法 描述
loadFromHost() 从 Host 内存加载图像到 GPU
downloadImage() 从 GPU 下载图像到 Host
invert() 图像反色
toGrayscale() RGB 转灰度
adjustBrightness() 亮度调整
gaussianBlur() 高斯模糊
sobelEdgeDetection() Sobel 边缘检测
histogram() 计算直方图
resize() 图像缩放

Geometric

几何变换类,提供各种空间变换操作。

方法 描述
rotate() 任意角度旋转(双线性插值)
rotate90() 90度倍数旋转(高效)
flip() 图像翻转(水平/垂直/双向)
affineTransform() 仿射变换
perspectiveTransform() 透视变换
crop() 图像裁剪
pad() 图像填充

Filters

滤波器类,提供各种图像滤波操作。

方法 描述
medianFilter() 中值滤波(去噪)
bilateralFilter() 双边滤波(保边去噪)
boxFilter() 盒式滤波(均值滤波)
sharpen() 锐化滤波
laplacian() 拉普拉斯滤波(边缘增强)

ImageArithmetic

图像算术操作类。

方法 描述
add() 图像加法
subtract() 图像减法
multiply() 图像乘法
blend() Alpha 混合
addWeighted() 加权和
absDiff() 绝对差
addScalar() 标量加法
multiplyScalar() 标量乘法

PipelineProcessor

流水线处理器,支持异步批量处理。

方法 描述
addStep() 添加处理步骤
processHost() 处理单张 Host 图像
processBatchHost() 批量处理 Host 图像
synchronize() 同步所有操作

工程质量

许可证

MIT License