| RMVL 2.4.0 Robotic Manipulation and Vision Library

载入中...
搜索中...
未找到
相机设备

相机模块的基本使用，包括初始化、参数设置以及运行示例

作者
  赵曦

日期
  2023/03/15

版本
  1.0

上一篇教程：轻量发布订阅服务 —— LPSS
下一篇教程：光源控制器

相关类

- 迈德威视 USB3.0 工业相机 rm::MvCamera
- 海康机器人 USB3.0/GigE 工业相机 rm::HikCamera
- 奥普特机器视觉 USB3.0/GigE 工业相机 rm::OptCamera
- 大恒图像 Galaxy USB3.0/GigE 工业相机 rm::GalaxyCamera

# 1 如何使用

使用前需安装相机驱动，详情参考：构建并安装 RMVL ，下面以 MvCamera 为例介绍如何使用相机模块，其余相机操作完全一致。

## 1.1 初始化

创建 MvCamera 对象即可初始化相机：

- C++

  auto cam_cfg = rm::CameraConfig::create(rm::GrabMode::Continuous, rm::RetrieveMode::SDK);
  rm::MvCamera capture(cam_cfg, "0123456789");
  rm::MvCamera
  迈德威视相机库
  定义 mv_camera.h:37
  rm::RetrieveMode::SDK
  @ SDK
  使用官方 SDK 进行处理
  定义 camutils.hpp:50
  rm::GrabMode::Continuous
  @ Continuous
  连续采样
  定义 camutils.hpp:33
  rm::CameraConfig::create
  static CameraConfig create(Args &&...modes)
  创建相机初始化配置模式
  定义 camutils.hpp:66

- Python

  cam_cfg = rm.CameraConfig()
  cam_cfg.grab_mode = rm.GrabMode.Continuous
  cam_cfg.retrieve_mode = rm.RetrieveMode.SDK
  capture = rm.MvCamera(cam_cfg, "0123456789")
  rm::CameraConfig
  相机初始化配置模式
  定义 camutils.hpp:54

第 1 个参数为 相机初始化模式 ，包含

- 相机外部触发通道
- 相机采集模式
- 相机句柄创建方式
- 相机数据处理模式

4 个待配置的数据，见下表

初始化配置模式 | 含义 | 标识符 | 功能
--- | --- | --- | ---
相机外部触发通道 | 通道 0 | `rm::TriggerChannel::Chn0` | 通道 0 生效
通道 1 | `rm::TriggerChannel::Chn1` | 通道 1 生效
通道 2 | `rm::TriggerChannel::Chn2` | 通道 2 生效
通道 3 | `rm::TriggerChannel::Chn3` | 通道 3 生效
采集方式 | 连续采集 | `rm::GrabMode::Continuous` | 连续触发相机，当 `grab` 方法被执行后，相机将开始连续采集，一般调用 `read` 或在相机构造之初可自动开启相机 Grabbing。
软触发 | `rm::GrabMode::Software` | 软件触发，需要手动设置触发帧，当相机开始取流（Grabbing）时，只有在被设置触发帧之后的下一次执行有效，否则会阻塞以等待接收到触发帧，RMVL 相机库目前仅支持同步的相机数据处理，在指定时间内如果没有收到触发帧，则会被认为相机读取 `read` 失败。
硬触发 | `rm::GrabMode::Hardware` | 硬件触发，通过向相机的航空接头等串行通信接口传输高低电平信号来设置触发帧，信号的有效性可通过软件设置，例如设置高电平、低电平、上升边沿、下降边沿的一种为触发方式，有关相机取流的细节同软触发。
相机句柄模式 | 索引号 | `rm::HandleMode::Index` | 相机的索引号 (0, 1, 2 ...)
序列号 | `rm::HandleMode::Key` | 制造商：序列号 S/N
MAC | `rm::HandleMode::MAC` | 相机的 MAC 地址
IP 地址 | `rm::HandleMode::IP` | IP 地址，形如 `192.168.1.100`
相机数据处理模式 | 使用 OpenCV | `rm::RetrieveMode::OpenCV` | OpenCV 的 `imgproc` 模块提供了有关数据处理的接口，例如 `cv::cvtColor` 可以用于色彩空间转换
使用厂商 SDK | `rm::RetrieveMode::SDK` | SDK 中提供了有关数据处理的接口，主要用于相机解码、色彩空间转换等操作

详细的触发方式

参见

- HIKROBOT 工业相机用户手册
- 迈德威视工业相机用户手册

## 1.2 光学属性设置

### 1.2.1 曝光设置

手动/自动设置曝光

- C++

  capture.set(rm::CameraProperties::auto_exposure, false); // 手动曝光
  capture.set(rm::CameraProperties::auto_exposure, true); // 自动曝光
  rm::CameraProperties::auto_exposure
  @ auto_exposure
  自动曝光
  定义 camutils.hpp:90

- Python

  capture.set(rm.CameraProperties::auto_exposure, False) # 手动曝光
  capture.set(rm.CameraProperties::auto_exposure, True) # 自动曝光

设置曝光值

- C++

  capture.set(rm::CameraProperties::exposure, 600); // 设置曝光值为 600
  rm::CameraProperties::exposure
  @ exposure
  曝光值
  定义 camutils.hpp:92

- Python

  capture.set(rm.CameraProperties::exposure, 600) # 设置曝光值为 600

### 1.2.2 白平衡设置

手动/自动设置白平衡

- C++

  capture.set(rm::CameraProperties::auto_wb, false); // 手动白平衡
  capture.set(rm::CameraProperties::auto_wb, true); // 自动白平衡
  rm::CameraProperties::auto_wb
  @ auto_wb
  自动白平衡
  定义 camutils.hpp:91

- Python

  capture.set(rm.CameraProperties::auto_wb, False) # 手动白平衡
  capture.set(rm.CameraProperties::auto_wb, True) # 自动白平衡

设置各通道增益，并生效（在手动设置白平衡模式下有效）

- C++

  capture.set(rm::CameraProperties::wb_rgain, 102); // 红色通道增益设置为 102
  capture.set(rm::CameraProperties::wb_ggain, 101); // 绿色通道增益设置为 101
  capture.set(rm::CameraProperties::wb_bgain, 100); // 蓝色通道增益设置为 100
  rm::CameraProperties::wb_bgain
  @ wb_bgain
  白平衡蓝色分量
  定义 camutils.hpp:97
  rm::CameraProperties::wb_ggain
  @ wb_ggain
  白平衡绿色分量
  定义 camutils.hpp:96
  rm::CameraProperties::wb_rgain
  @ wb_rgain
  白平衡红色分量
  定义 camutils.hpp:95

- Python

  capture.set(rm.CameraProperties::wb_rgain, 102) # 红色通道增益设置为 102
  capture.set(rm.CameraProperties::wb_ggain, 101) # 绿色通道增益设置为 101
  capture.set(rm.CameraProperties::wb_bgain, 100) # 蓝色通道增益设置为 100

### 1.2.3 其余光学参数设置

- C++

  capture.set(rm::CameraProperties::gain, 64); // 设置模拟增益为 64
  capture.set(rm::CameraProperties::gamma, 80); // 设置 Gamma 为 80
  capture.set(rm::CameraProperties::contrast, 120); // 设置对比度为 120
  capture.set(rm::CameraProperties::saturation, 100); // 设置饱和度为 100
  capture.set(rm::CameraProperties::sharpness, 100); // 设置锐度为 100
  rm::CameraProperties::gamma
  @ gamma
  Gamma 值
  定义 camutils.hpp:94
  rm::CameraProperties::sharpness
  @ sharpness
  锐度
  定义 camutils.hpp:100
  rm::CameraProperties::contrast
  @ contrast
  对比度
  定义 camutils.hpp:98
  rm::CameraProperties::gain
  @ gain
  模拟增益
  定义 camutils.hpp:93
  rm::CameraProperties::saturation
  @ saturation
  饱和度
  定义 camutils.hpp:99

- Python

  capture.set(rm.CameraProperties::gain, 64) # 设置模拟增益为 64
  capture.set(rm.CameraProperties::gamma, 80) # 设置 Gamma 为 80
  capture.set(rm.CameraProperties::contrast, 120) # 设置对比度为 120
  capture.set(rm.CameraProperties::saturation, 100) # 设置饱和度为 100
  capture.set(rm.CameraProperties::sharpness, 100) # 设置锐度为 100

注解
  Hik 工业相机暂不支持修改 Gamma

## 1.3 触发属性设置

- C++

  // 设置硬触发采集延迟为 1000 μs，仅在硬触发模式下有效
  capture.set(rm::CameraProperties::trigger_delay, 1000);
  // 设置单次触发时的触发帧数为 5 帧，即一次触发能触发 5 帧画面，仅在触发模式下有效
  capture.set(rm::CameraProperties::trigger_count, 5);
  // 设置单次触发时多次采集的周期为 100 μs，即一次触发信号能触发多帧画面，每帧间隔为 100 μs
  capture.set(rm::CameraProperties::trigger_period, 100);
  // 执行一次白平衡操作，仅在手动白平衡模式下有效
  capture.trigger(rm::CameraEvents::once_wb);
  // 执行一次软触发，仅在软触发模式下有效
  capture.trigger(rm::CameraEvents::software);
  rm::once_wb
  @ once_wb
  执行单次白平衡
  定义 camutils.hpp:111
  rm::software
  @ software
  执行软触发
  定义 camutils.hpp:112
  rm::CameraProperties::trigger_delay
  @ trigger_delay
  硬触发采集延迟（微秒 ）
  定义 camutils.hpp:103
  rm::CameraProperties::trigger_count
  @ trigger_count
  单次触发时的触发帧数
  定义 camutils.hpp:104
  rm::CameraProperties::trigger_period
  @ trigger_period
  单次触发时多次采集的周期（微秒 ）
  定义 camutils.hpp:105

- Python

  # 设置硬触发采集延迟为 1000 μs，仅在硬触发模式下有效
  capture.set(rm.CameraProperties::trigger_delay, 1000)
  # 设置单次触发时的触发帧数为 5 帧，即一次触发能触发 5 帧画面，仅在触发模式下有效
  capture.set(rm.CameraProperties::trigger_count, 5)
  # 设置单次触发时多次采集的周期为 100 μs，即一次触发信号能触发多帧画面，每帧间隔为 100 μs
  capture.set(rm.CameraProperties::trigger_period, 100)
  # 执行一次白平衡操作，仅在手动白平衡模式下有效
  capture.trigger(rm.CameraEvents::once_wb)
  # 执行一次软触发，仅在软触发模式下有效
  capture.trigger(rm.CameraEvents::software)

# 2 para 参数加载

RMVL 提供了全局的相机参数对象： rm::para::camera_param ，详情可参考类 rm::para::CameraParam

# 3 示例程序

## 3.1 单相机

单相机例程，打开终端，输入以下命令

rmvl_mv_mono

相机按照连续采样、cvtColor 处理方式运行，程序运行中，cv::waitKey(1) 接受到 s 键被按下时，可将参数保存到 out_para.yml 文件中。

键入一次 Esc 可暂停程序，按其余键可恢复。键入两次 Esc 可退出程序。

## 3.2 多相机

多相机例程，打开终端，输入以下命令

rmvl_mv_multi

相机按照连续采样、cvtColor 处理方式运行，程序会枚举所有的相机设备，并可视化的显示出来，指定一个序列号来启动某一相机。

程序运行过程中，相机参数会自动从 out_para.yml 中加载，若没有则会按照默认值运行。

键入一次 Esc 可暂停程序，按其余键可恢复。键入两次 Esc 可退出程序。

## 3.3 相机录屏

相机录屏例程，打开终端，输入以下命令

rmvl_mv_writer

相机按照连续采样、cvtColor 处理方式运行，-o 可指定输出文件名，否则默认输出到 ts.avi，例如

rmvl_mv_writer -o=aaa.avi

程序运行过程中，相机参数会自动从 out_para.yml 中加载，若没有则会按照默认值运行。

## 3.4 相机标定

MvCamera 相机自动标定程序，打开终端，输入以下命令

rmvl_mv_auto_calib -w=<?> -h=<?> -s=<?> -d=<?> -n=<?>

<?> 表示可调节，具体帮助可直接执行以下命令

rmvl_mv_calibration -help

另外还有相机手动标定程序，可执行以下命令

rmvl_mv_manual_calib

# 4 使用 Demo

## 4.1 连续采样

- C++

  #include <opencv2/highgui.hpp>
  #include <rmvl/camera/mv_camera.h>
  int main() {
  rm::MvCamera capture(rm::CameraConfig::create(rm::GrabMode::Continuous, rm::RetrieveMode::OpenCV));
  cv::Mat frame;
  while(capture.read(frame)) {
  cv::imshow("frame", frame);
  if (cv::waitKey(1) == 27)
  break;
  }
  }
  rm::RetrieveMode::OpenCV
  @ OpenCV
  使用 OpenCV 的 'cvtColor' 进行处理
  定义 camutils.hpp:49

- Python

  import rm
  import cv2
  cam_cfg = rm.CameraConfig()
  cam_cfg.grab_mode = rm.GrabMode.Continuous
  cam_cfg.retrieve_mode = rm.RetrieveMode.OpenCV
  capture = rm.MvCamera(cam_cfg)
  while True:
  res, frame = capture.read()
  if not res:
  break
  cv2.imshow("frame", frame)
  if cv2.waitKey(1) == 27:
  break

## 4.2 软触发

- C++

  #include <thread>
  #include <opencv2/highgui.hpp>
  #include <rmvl/camera/mv_camera.h>
  using namespace std::chrono_literals;
  int main() {
  auto camera_config = rm::CameraConfig::create(rm::GrabMode::Software, rm::RetrieveMode::OpenCV)
  rm::MvCamera capture(camera_config);
  bool run = true;
  std::thread th([&run]() {
  while (run) {
  std::this_thread::sleep_for(10ms); // 每隔 10ms 触发一次
  capture.trigger(rm::CameraEvents::software); // 触发
  }
  });
  cv::Mat frame;
  while (capture.read(frame)) {
  cv::imshow("frame", frame);
  if (cv::waitKey(1) == 27) {
  run = false;
  break;
  }
  }
  th.join();
  }
  rm::GrabMode::Software
  @ Software
  软触发
  定义 camutils.hpp:34

- Python

  待办事项
    Python 软触发示例暂无