- 海康 MVS 工业相机驱动
- 提供 C++ 类库接口与示例程序
- 支持高性能推理引擎
MV-CS200-10UMUC runtime example
- MV-CS200-10UMUC(USB3.0,5472x3648,Bayer GB8)
- MV-CS016-10UMUC(USB3.0,1440x1080,Bayer RG8)
mkdir -p build
cd build
cmake .. -DMVS_ROOT=/opt/MVS -DHIK_CAMERA_ENABLE_CUDA=ON -DHIK_CAMERA_ENABLE_NPP=ON
make -j"$(nproc)"
./hik_camera_demo --config ../config/config.yaml --show./
├── CMakeLists.txt
├── README.md
├── doc/
│ ├── MV-CS200-10UMUC_20241104_9799.pdf # CS200 规格书
│ └── MV-CS016-10UMUC_20241104_9718.pdf # CS016 规格书
├── include/
│ └── hik_camera/
│ ├── hik_camera.h # 对外接口
│ ├── gpu_demosaic_npp.h # NPP 去马赛克声明
│ ├── PixelType.h # 像素格式枚举
│ ├── MvCameraControl.h # MVS SDK 头文件
│ ├── CameraParams.h
│ ├── MvErrorDefine.h
│ ├── MvISPErrorDefine.h
│ ├── MvObsoleteInterfaces.h
│ └── ObsoleteCamParams.h
├── src/
│ ├── hik_camera.cpp # 设备管理 参数配置
│ ├── hik_camera_config.cpp # 配置加载 路径解析
│ ├── hik_camera_frame.cpp # 帧构建 CPU 处理
│ ├── hik_camera_gpu.cpp # GPU Pipeline 去马赛克
│ └── gpu_demosaic_npp.cu # NPP 去马赛克实现
├── examples/
│ └── main.cpp # 示例程序
└── config/
├── config.yaml # 默认配置
├── ost.yaml # 标定文件(ROS YAML)
├── ost.txt # 标定文本
└── camera.mfs # MVS 参数文件
- 输入:相机设备 + 配置文件
- 输出:
hik_camera::Frame(bgr/raw/GPU 指针/时间戳) - 下游:detector/control(消费图像、时间戳;GPU-only 时消费
gpu_bgr_ptr)
mkdir -p build
cd build
cmake .. -DMVS_ROOT=/opt/MVS
make -j$(nproc)启用 CUDA/NPP:
cmake .. -DMVS_ROOT=/opt/MVS -DHIK_CAMERA_ENABLE_CUDA=ON -DHIK_CAMERA_ENABLE_NPP=ON仅 CPU(关闭 CUDA/NPP):
cmake .. -DMVS_ROOT=/opt/MVS -DHIK_CAMERA_ENABLE_CUDA=OFF -DHIK_CAMERA_ENABLE_NPP=OFFCUDA 架构优化(可选):
cmake .. -DMVS_ROOT=/opt/MVS -DCMAKE_CUDA_ARCHITECTURES=86支持的架构示例(compute_XX / SM_XX):
| 架构 | 说明 |
|---|---|
| SM60 / compute_60 | Pascal:Quadro GP100, Tesla P100, DGX-1 |
| SM61 / compute_61 | Pascal:GTX 10 系列, Titan Xp, Tesla P4/P40 |
| SM62 / compute_62 | Jetson TX2 |
| SM70 / compute_70 | Volta:Tesla V100 |
| SM72 / compute_72 | Xavier / Xavier NX |
| SM75 / compute_75 | Turing:RTX 20 系列, Tesla T4 |
| SM80 / compute_80 | Ampere:A100 |
| SM86 / compute_86 | Ampere:RTX 3060/3070/3080/3090 等 |
| SM87 / compute_87 | Jetson Orin |
| SM89 / compute_89 | Lovelace:RTX 4090/4080 |
| SM90 / compute_90 | Hopper:H100 |
说明:如遇 NVCC 报 compute_ 架构相关错误,可显式指定 CMAKE_CUDA_ARCHITECTURES。
./hik_camera_demo --config ../config/config.yaml --show- 阻塞读取:
HikCamera::read(Frame*, timeout_ms) - 回调模式:
HikCamera::setFrameCallback(cb)(不要与read()混用) Frame::bgr:BGR8cv::MatFrame::raw_data:原始 payload(需开启output_raw)Frame::bgr_ptr:BGR 缓冲指针(启用零拷贝时使用)Frame::bgr_size:BGR 缓冲大小(字节)Frame::gpu_bgr_ptr:GPU 端 BGR 指针(gpu_output_only=1时有效)Frame::gpu_stream:CUDA stream 指针(gpu_bgr_ptr有效时可用于下游异步处理)
- 设备选择:
serial_number/use_first_device/device_index - 触发与帧率:
trigger_mode/trigger_source,frame_rate_enable/frame_rate - 畸变校正:
undistort_enable=1+calib_path(CPU) calib_path支持 ROS YAML(camera_matrix/distortion_coefficients或K/D)- 自动曝光限幅:
auto_exposure_time_lower_us/auto_exposure_time_upper_us(会自动夹紧到设备范围) - Gamma/亮度:
gamma_enable/gamma_selector/gamma,brightness_enable/brightness - 重连:
reconnect_enable+reconnect_* - 参数持久化:
feature_load_*、feature_save_* - ROI:
roi_enable/roi_offset_x/roi_offset_y/roi_width/roi_height - 输出:
output_bgr/output_raw/copy_raw(copy_raw=0仅在回调模式下有效) - 零拷贝帧池:
zero_copy_enable+buffer_pool_size(仅影响 BGR 输出) - GPU pipeline:
gpu_pipeline_enable/gpu_device_id/gpu_stream_enable - GPU 端输出:
gpu_output_only=1时 GPU 去马赛克不回拷贝 CPU,Frame::bgr不保证有效 - GPU 后处理(需 OpenCV CUDA):
gpu_undistort_enable/gpu_rotate_180/gpu_resize_enablegpu_resize_enable需要gpu_output_only=1,并设置gpu_resize_width/height(仅 GPU 输出)
- GPU 去马赛克预留:
gpu_demosaic_enable+gpu_demosaic_backend+bayer_patterngpu_demosaic_backend=auto:优先 OpenCV CUDA,其次 NPPgpu_demosaic_backend=opencv:只用 OpenCV CUDAgpu_demosaic_backend=npp:只用 NPP(不依赖 OpenCV CUDA)
bayer_pattern支持auto/GB/GR/BG/RG,auto会基于像素格式自动推断- CS016(彩色)常见 Bayer RG,建议
bayer_pattern=RG
该功能面向高性能推理引擎(如 ORT CUDA / TensorRT)设计,用于减少 CPU 拷贝并降低 H2D 阻塞:
- 零拷贝帧池:采集直接写入预分配缓冲池,避免重复分配
- pinned 内存:
cudaHostRegister注册帧池,提高 H2D 带宽 - GPU 去马赛克:OpenCV CUDA 或 NPP 直接在 GPU 生成 BGR
- 相对路径默认以配置文件所在目录为基准。
- 以
config/开头的路径会自动映射到项目根目录的config/。
Pinned pool enabled:说明 pinned 内存注册生效。GPU demosaic active (opencv/npp):说明 GPU 去马赛克已启用。GPU post-process active:说明 GPU 后处理已启用。
- 只走 CPU:重新
cmake时加-DHIK_CAMERA_ENABLE_CUDA=OFF -DHIK_CAMERA_ENABLE_NPP=OFF。 - 已启用 CUDA/NPP 但想临时不用:在
config.yaml把gpu_pipeline_enable/gpu_demosaic_enable设为0。
环境要求(建议):
- OS:Ubuntu 22.04 LTS
- CUDA:12+(含运行时与驱动)
- NPP:随 CUDA Toolkit 提供
- TensorRT:可选(推理引擎使用)
- OpenCV:4.x(含基础模块即可;OpenCV CUDA 可选)
测试设备(本项目验证环境):
- Computer: Lenovo Legion Y9000P IAH7H
- CPU: 12th Gen Intel Core i9-12900H
- GPU: NVIDIA GA106M (GeForce RTX 3060 Mobile / Max-Q)
- OS: Ubuntu 22.04.5 LTS
- CUDA: 13.0 (nvcc 13.0.48, Driver 580.95.05, CUDA runtime 13.0)
- TensorRT: 10.14.1 (system packages, libnvinfer/libnvinfer_plugin)
- OpenCV: 4.5.4 (system), 4.12.0 (conda/python)
- 为最大 FPS,建议关闭
--show,并避免在采集线程做重计算。 - USB 带宽限制时,可启用 ROI 以提高帧率。
- GPU-only 推理建议开启
gpu_output_only=1,不要用--show,下游直接消费gpu_bgr_ptr。 read()模式始终拷贝 raw;copy_raw=0仅在回调模式下 raw 指针有效。zero_copy_enable=1时,bgr_ptr仅在下一帧覆盖前有效,不保证跨帧持久。gpu_output_only=1时仅提供gpu_bgr_ptr/gpu_stream,CPU 端Frame::bgr可能为空。pixel_format使用 MVS 数值枚举(例如 BayerRG8=17301513,BGR8=35127317),设置为0表示保持相机默认。- GPU 去马赛克依赖 CUDA;OpenCV CUDA 或 NPP 至少其一可用。
-
画面黑屏但帧率正常
- 多数是
gpu_output_only=1+--show,将gpu_output_only设为0再显示。
- 多数是
-
帧率跑不满标称值
AcquisitionFrameRate已设置但 FPS 低,多数为 USB 链路吞吐限制。可通过 ROI 降低带宽验证。
-
若需要 OpenCV CUDA 支持 (可选)
- 在 Ubuntu 22.04 上需从源码编译 OpenCV 并开启 CUDA,避免使用不含 CUDA 的系统包。
- https://blog.csdn.net/SoNg_ch_/article/details/132054785
- https://blog.csdn.net/Natsuago/article/details/145785243