相机模块的基本使用,包括初始化、参数设置以及运行示例
- 作者
- 赵曦
- 日期
- 2023/03/15
上一篇教程:工业自动化通信协议 OPC UA ↑
下一篇教程:光源控制器 ↓
相关类
1. 如何使用
使用前需安装相机驱动,详情参考:构建并安装 RMVL
1.1 初始化
MindVision 工业相机
创建 MvCamera 对象即可初始化相机,例如:
@ OpenCV
使用 OpenCV 的 'cvtColor' 进行处理
static CameraConfig create(Args &&...modes)
创建相机初始化配置模式
定义 camutils.hpp:70
HikRobot 工业相机
创建 HikCamera 对象即可初始化相机,例如:
海康机器人相机库
定义 hik_camera.h:35
OPT 奥普特工业相机
创建 OptCamera 对象即可初始化相机,例如:
"192.168.1.100");
"1");
奥普特机器视觉相机库
定义 opt_camera.h:31
@ Index
相机的索引号 (0, 1, 2 ...)
第 1 个参数为 相机初始化模式 ,包含
- 相机外部触发通道
- 相机采集模式
- 相机句柄创建方式
- 相机数据处理模式
4 个待配置的数据,见下表
初始化配置模式 | 含义 | 标识符 | 功能 |
相机外部触发通道 | 通道 0 | TriggerChannel::Chn0 | 通道 0 生效 |
通道 1 | TriggerChannel::Chn1 | 通道 1 生效 |
通道 2 | TriggerChannel::Chn2 | 通道 2 生效 |
通道 3 | TriggerChannel::Chn3 | 通道 3 生效 |
采集方式 | 连续采集 | GrabMode::Continuous | 连续触发相机,当 grab 方法被执行后,相机将开始连续采集,一般调用 read 或在相机构造之初可自动开启相机 Grabbing。 |
软触发 | GrabMode::Software | 软件触发,需要手动设置触发帧,当相机开始取流(Grabbing)时,只有在被设置触发帧之后的下一次执行有效,否则会阻塞以等待接收到触发帧,RMVL 相机库目前仅支持同步的相机数据处理,在指定时间内如果没有收到触发帧,则会被认为相机读取 read 失败。 |
硬触发 | GrabMode::Hardware | 硬件触发,通过向相机的航空接头等串行通信接口传输高低电平信号来设置触发帧,信号的有效性可通过软件设置,例如设置高电平、低电平、上升边沿、下降边沿的一种为触发方式,有关相机取流的细节同软触发。 |
相机句柄模式 | 索引号 | HandleMode::Index | 相机的索引号 (0, 1, 2 ...) |
序列号 | HandleMode::Key | 制造商:序列号 S/N |
ID | HandleMode::ID | 手动设置的相机 ID |
IP | HandleMode::IP | IP 地址,形如 192.168.1.100 |
相机数据处理模式 | 使用 OpenCV | RetrieveMode::OpenCV | OpenCV 的 imgproc 模块提供了有关数据处理的接口,例如 cv::cvtColor 可以用于色彩空间转换 |
使用厂商 SDK | RetrieveMode::SDK | SDK 中提供了有关数据处理的接口,主要用于相机解码、色彩空间转换等操作 |
详细的触发方式
- 参见
1.2 光学参数设置
1.2.1 曝光设置
手动/自动设置曝光
capture.set(CAMERA_MANUAL_EXPOSURE);
capture.set(CAMERA_AUTO_EXPOSURE);
设置曝光值
capture.set(CAMERA_EXPOSURE, 600);
1.2.2 白平衡设置
手动/自动设置白平衡
capture.set(CAMERA_MANUAL_WB);
capture.set(CAMERA_AUTO_WB);
设置各通道增益,并生效(在手动设置白平衡模式下有效)
capture.set(CAMERA_WB_RGAIN, 102);
capture.set(CAMERA_WB_GGAIN, 101);
capture.set(CAMERA_WB_BGAIN, 100);
1.2.3 其余光学参数设置
capture.set(CAMERA_GAIN, 64);
capture.set(CAMERA_GAMMA, 80);
capture.set(CAMERA_CONTRAST, 120);
capture.set(CAMERA_SATURATION, 100);
capture.set(CAMERA_SHARPNESS, 100);
- 注解
- Hik 工业相机暂不支持修改 Gamma
1.3 处理参数设置
capture.set(CAMERA_TRIGGER_DELAY, 1000);
capture.set(CAMERA_TRIGGER_COUNT, 5);
capture.set(CAMERA_TRIGGER_PERIOD, 100);
1.4 事件设置
capture.set(CAMERA_ONCE_WB);
capture.set(CAMERA_TRIGGER_SOFT);
2. para 参数加载
RMVL 提供了全局的相机参数对象: para::camera_param ,详情可参考类 para::CameraParam
3. 示例程序
在构建 RMVL 时,需开启 BUILD_EXAMPLES
选项(默认开启)
cmake -DBUILD_EXAMPLES=ON ..
cmake --build . --parallel 4
cd build
3.1 单相机
单相机例程,在 build 文件夹下执行以下命令
MindVision 工业相机
HikRobot 工业相机
相机按照连续采样、cvtColor
处理方式运行,程序运行中,cv::waitKey(1)
接受到 s
键被按下时,可将参数保存到 out_para.yml
文件中。
键入一次 Esc
可暂停程序,按其余键可恢复。键入两次 Esc
可退出程序。
3.2 多相机
多相机例程,在 build
文件夹下执行以下命令
MindVision 工业相机
HikRobot 工业相机
相机按照连续采样、cvtColor
处理方式运行,程序会枚举所有的相机设备,并可视化的显示出来,指定一个序列号来启动某一相机。
程序运行过程中,相机参数会自动从 out_para.yml
中加载,若没有则会按照默认值运行。
键入一次 Esc
可暂停程序,按其余键可恢复。键入两次 Esc
可退出程序。
3.3 相机录屏
相机录屏例程,在 build 文件夹下执行以下命令
MindVision 工业相机
HikRobot 工业相机
相机按照连续采样、cvtColor
处理方式运行,-o
可指定输出文件名,否则默认输出到 ts.avi
,例如
MindVision 工业相机
bin/rmvl_mv_writer -o=aaa.avi
HikRobot 工业相机
bin/rmvl_hik_writer -o=aaa.avi
程序运行过程中,相机参数会自动从 out_para.yml
中加载,若没有则会按照默认值运行。
3.4 相机标定
MvCamera 相机自动标定程序,在 build
文件夹下执行以下命令
bin/rmvl_mv_auto_calib -w=<?> -h=<?> -s=<?> -d=<?> -n=<?>
<?>
表示可调节,具体帮助可直接执行以下命令
bin/rmvl_mv_calibration -help
另外还有相机手动标定程序,可执行以下命令
4. 使用 Demo
- 注解
- 下面以 MvCamera 为例, HikCamera 相机使用方式与之完全相同
连续采样:
int main()
{
cv::Mat frame;
while(capture.read(frame))
{
cv::imshow("frame", frame);
if (cv::waitKey(1) == 27)
break;
}
}
软触发:
using namespace std::chrono_literals;
int main()
{
bool run = true;
std::thread th([&run]() {
while (run)
{
std::this_thread::sleep_for(10ms);
}
});
cv::Mat frame;
while (capture.read(frame))
{
cv::imshow("frame", frame);
if (cv::waitKey(1) == 27)
{
run = false;
break;
}
}
th.join();
}
@ CAMERA_TRIGGER_SOFT
执行软触发
定义 camutils.hpp:118