介绍

OrbbecViewer是基于Orbbec SDK开发的示例工具,帮助开发者快速使用Orbbec的3D传感器产品。实现了 Orbbec 3D传感器产品的特性功能,包括读取序列号、获取设备类型、相机参数、控制等功能。

本文档对这些功能进行了描述并演示了基本使用的过程。

OrbbecViewer工具概述

目标用户

OrbbecViewer工具专为最终用户/开发人员设计,用于使用Orbbec SDK 3D相机。

支持设备及平台

SDK版本

产品列表

固件版本

v1.0.2

Astra+

1.0.19

v1.1.6

Astra+

1.0.19/1.0.20

Femto

1.5.1

v1.2.8

Astra+

1.0.20

Femto

1.6.7

操作系统

要求

描述

Windows

  • Windows 10 的 2018 年

4 月(版本 1803,操作系统内部版本 17134)发行版 (x64) 或更高版本- 4 GB 内存- USB2.0 及以上端口

vs的工程的生成依赖 安装vs版本和cmake版本, 支持vs2015/vs2017/vs2019

Android

  • Android 6/7/8/9/10

Linux

  • Linux Ubuntu

16.04/18.04/20.04 (x64)- 4 GB 内存- USB2.0 及以上端口

支持GCC 7.5

OrbbecViewer工具的使用

3.1 软件主界面

如图所示,主界面用红框分隔标注了3个区域,作用分别是:

区域

名称

功能

区域一

设备管理区

传感器列表、设备固件更新

区域二

控制面板区

数据流开关及参数配置、图像采集功能控制、D2C功能控制

区域三

图像预览区

传感器图像预览,帧率、时间戳等信息查看

image1.png其中,控制面板区左侧有六个按钮,最下方按钮image2.png用于切换中英文;3用于打开软件详情页面。image4.png用于查看设备信息和固件升级;剩下两个按钮用于切换不同功能的控制面板TAB页,从上往下一次为“单相机模式”、“高级模式”。点击区域三下方Log信息处,会展示具体的日志信息。

3.2 数据流

OrbbecViewer 允许用户选择和配置深度、红外和彩色数据流。本节概述了用户可在工具中自定义的参数。用户完成配置后,必须单击顶部image5.png按钮开始数据流传输(Astra+无惯性测试单元)。

OrbbecViewer工具允许用户选择深度、红外和彩色数据流组合。用户可以通过从可用流列表中选中/取消选中以启用/禁用该流。查看器支持 USB2.0 和 USB3.0,因此可用的配置参数会因 USB2.0/USB3.0 功能而异。image6.png

分辨率与帧率

摄像机为用户提供了多种分辨率可供选择,以满足他们的解决方案需求。各路数据流都提供了多种可选的帧格式,已供用户自由选择合适的图像尺寸、图像格式和帧率组合。

例如,深度流可以支持320x240和640x480两种分辨率,FPS帧率的区间范围为5到30。 image7.png

彩色流可以支持640x480~1920x1080多种分辨率,FPS帧率的区间范围5到30不等,支持MJPG、RGB、I420、H265。对于彩色流的预览,MJPG、H264、H265是编码格式,需要先进行解码,解码通常耗时会比较大,会导致掉帧或渲染出“花屏”画面。在某些型号PC上,可通过硬件加速解码。 image8.png

红外流可以支持320x240和640x480两种分辨率,FPS帧率5到30不等。 image9.png

用户可根据实际情况选择最适合使用的分辨率。请注意,分辨率越高,精确度越高,但会增加计算强度。

3.3 设备信息

点击按钮“image10.png”查看设备信息OrbbecViewer工具包含简单的设备信息,如固件版本、产品识别码、相机参数、温度等。image11.png

3.4 图像预览区

开流会默认显示平均帧率、时间搓、图像帧号等信息,点击右上角image12.png来切换信息显示关闭。点击image13.png可以关闭流,但不从预览区中移除。点击image14.png可以重新打开已经暂停且未从预览区移除的流。数据流关闭后,图像预览窗并不会随之关闭,需要用户点击图像预览窗右上角image15.pngSnipaste_2022-04-21_14-45-09.png

3.5 控制面板区

3.5.1 传感器和数据流

获取相机名称、序列号及USB协议

设备上电并将USB与PC主机连接后,打开OrbbecViewer工具软件,软件会自动连接设备。某些设备可能初始化较长时间,请耐心等待设备连接成功。

各流的参数配置项默认隐藏,可点击设备管理区四个按钮展开查看和设置具体配置项。16

连接成功后,控制面板区自动显示设备具体信息。image17.png

深度流模块

包括:镜像、软件滤波(范围模式:关闭、中等、长距离)、深度有效范围获取(MinDepthValue/MaxDepthValue)、曝光等功能。

image18.png

彩色流模块

包括:镜像、翻转、对齐、曝光、白平衡、增益、亮度、锐度、饱和度、对比度、色调等功能。

image19.png

红外流板块

包括镜像、曝光功能。

image20.png

设备数据管理

用户可选择对应图像和捕获帧来进行录制,采集的帧默认保存在“OrbbecViewer/output”目录中。

image21.png

3.6 D2C功能(支持硬件D2C和软件D2C)

在高级模式下的“D2C”功能,可控制实现深度流和彩色流同步功能:

1.点击按钮image22.png即可默认同步打开深度流和彩色流;

2.可通过切换按钮image23.png实现打开或关闭帧同步功能;

3.点击按钮image24.png可预览深度叠加到彩色的渲染显示效果;

4.点击按钮image25.png可打开或关闭深度和彩色帧同步采集(Femto特有);

5.录制的图片默认保存在“OrbbecViewer/output/RecordFile”目录中。

image26

3.7 点云

点击image26.png即可开启点云。

可通过鼠标的滑轮控制点云的缩放,鼠标的移动来控制点云的移动。

可选择导出深度点云(xyz)或RGBD点云(xyzrgb)并保存成ply格式文件,默认保存在“OrbbecViewer/output/PointCloud”目录中。

image27.png

3.8 固件更新

在设备已连接状态,点击28可进入固件更新页面。

  1. Femto设备固件包含系统固件和板载MCU固件,可在“类型”下拉框选择升级固件类型。

  2. 选择好固件类型后,在“固件”输入框输入现有更新的固件镜像文件(“.img”后缀),点击“升级”按钮开始更新。

  3. 设备固件更新采用A/B双分区方案,如更新意外失败,不会影响原固件运行,重新连接设备进行更新即可。设备更新时间比较长,且设备会自动重启一次,请留意提示信息并耐心等待。

Astra+界面:

1650524827127_47E08781-CEC2-4d18-BC50-F8984C3F87C4.png

Femto界面:

image29.png

3.9 日志信息

默认情况下,日志信息区是折叠单条显示状态,可通过点击最右边按钮image30.png展开查看完整log信息。展开后可通过点击按钮image31.png清空log,通过点击按钮image32.png恢复折叠单条显示状态。Snipaste_2022-04-21_14-45-27.png

功能介绍

演示了主要API的使用。

4.1 获取序列号

33

C++代码

DeviceInfo deviceInfo = device->getDeviceInfo();
std::string serialNumber = deviceInfo.serialNumber();

Android代码

DeviceInfo deviceInfo = device.getInfo();
String serialNumber = deviceInfo.getSerialNumber();

4.2 获取设备名称

34

C++代码

std::shared_ptr< DeviceInfo > deviceInfo = device->getDeviceInfo();
std::string deviceName = deviceInfo->name();

Android代码

DeviceInfo deviceInfo = device.getInfo();
String name = deviceInfo.getName();

4.3 获取相机参数

image38

C++代码

//获取深度相机内参
OBCameraIntrinsic colorCameraIntrinsic = device->getCameraIntrinsic(OB_SENSOR_DEPTH);
//获取彩色相机内参
OBCameraIntrinsic depthCameraIntrinsic = device->getCameraIntrinsic(OB_SENSOR_COLOR);
//获取深度相机畸变参数
OBCameraDistortion depthCameraDistortion = device->getCameraDistortion(OB_SENSOR_DEPTH);
//获取彩色相机畸变参数
OBCameraDistortion colorCameraDistortion = device->getCameraDistortion(OB_SENSOR_color);
//获取旋转矩阵
OBD2CTransform d2cTransform = device->getD2CTransform();

Android代码

CameraParams object = new CameraParams();
boolean isSupport = device.isPropertySupported(DeviceProperty.CAMERA_PARA);
if (!isSupport) {
    return;
}
device.getPropertyValueDataType(DeviceProperty.CAMERA_PARA, object);
//获取深度相机内参
float[] depthParams = object.getDepthInternalParams();
//获取彩色相机内参
float[] colorParams = object.getColorInternalParams();
//获取深度相机畸变参数
float[] depthCoeffs = object.getDepthCoeffs();
//获取彩色相机畸变参数
float[] colorCoeffs = object.getColorCoeffs();

4.4 获取和设置红外相机曝光值

image39

C++代码

std::shared_ptr<ob::Sensor> irSensor = device->getSensorList()->getSensor(OB_SENSOR_IR);
if(!irSensor->isPropertySupported(OB_SENSOR_PROPERTY_EXPOSURE_INT))
    return;
//获取红外相机曝光值
int32_t exposure = irSensor->getIntProperty(OB_SENSOR_PROPERTY_EXPOSURE_INT);
//设置红外相机曝光值
irSensor->setIntProperty(OB_SENSOR_PROPERTY_EXPOSURE_INT, exposure / 2);

Android代码

Sensor irSensor = device.getSensor(SensorType.IR);
boolean isSupport = irSensor.isPropertySupported(SensorProperty.EXPOSURE_INT);
if (!isSupport) {
    return;
}
//获取红外相机曝光值
int exposure = irSensor.getPropertyValueI(SensorProperty.EXPOSURE_INT);
//设置红外相机曝光值
irSensor.setPropertyValueI(SensorProperty.EXPOSURE_INT, exposure / 2);

4.5 彩色相机自动曝光

image40

C++代码

bool isOpen;
std::shared_ptr<ob::Sensor> colorSensor = device->getSensorList()->getSensor(OB_SENSOR_COLOR);
if(!colorSensor->isPropertySupported(OB_SENSOR_PROPERTY_ENABLE_AUTO_EXPOSURE_BOOL))
    return;

colorSensor->setBoolProperty(OB_SENSOR_PROPERTY_ENABLE_AUTO_EXPOSURE_BOOL, isOpen);

Android代码

boolean isOpen;
Sensor colorSensor = device.getSensor(SensorType.COLOR);
boolean isSupport = colorSensor.isPropertySupported(SensorProperty.ENABLE_AUTO_EXPOSURE_BOOL);
if (!isSupport) {
    return;
}
colorSensor.setPropertyValueB(SensorProperty.ENABLE_AUTO_EXPOSURE_BOOL, isOpen);

4.6 获取和设置彩色相机曝光值

image41

C++代码

std::shared_ptr<ob::Sensor> colorSensor = device->getSensorList()->getSensor(OB_SENSOR_COLOR);
if(!colorSensor->isPropertySupported(OB_SENSOR_PROPERTY_EXPOSURE_INT))
    return;
//获取彩色相机曝光值
int32_t exposure = colorSensor->getIntProperty(OB_SENSOR_PROPERTY_EXPOSURE_INT);
//设置彩色相机曝光值
colorSensor->setIntProperty(OB_SENSOR_PROPERTY_EXPOSURE_INT, exposure / 2);

Android代码

Sensor colorSensor = device.getSensor(SensorType.COLOR);
boolean isSupport = colorSensor.isPropertySupported(SensorProperty.EXPOSURE_INT);
if (!isSupport) {
    return;
}
//获取彩色相机曝光值
int exposure = colorSensor.getPropertyValueI(SensorProperty.EXPOSURE_INT);
//设置彩色相机曝光值
colorSensor.setPropertyValueI(SensorProperty.EXPOSURE_INT, exposure / 2);

4.7 彩色相机自动白平衡

image42

C++代码

bool isOpen;
std::shared_ptr<ob::Sensor> colorSensor = device->getSensorList()->getSensor(OB_SENSOR_COLOR);
if(!colorSensor->isPropertySupported(OB_SENSOR_PROPERTY_ENABLE_AUTO_WHITE_BALANCE_BOOL))
    return;

colorSensor->setBoolProperty(OB_SENSOR_PROPERTY_ENABLE_AUTO_WHITE_BALANCE_BOOL, isOpen);

Android代码

boolean isOpen;
Sensor colorSensor = device.getSensor(SensorType.COLOR);
boolean isSupport = colorSensor.isPropertySupported(SensorProperty.ENABLE_AUTO_WHITE_BALANCE_BOOL);
if (!isSupport) {
    return;
}
colorSensor.setPropertyValueB(SensorProperty.ENABLE_AUTO_WHITE_BALANCE_BOOL, isOpen);

4.8 获取和设置彩色相机增益

image43

C++代码

std::shared_ptr<ob::Sensor> colorSensor = device->getSensorList()->getSensor(OB_SENSOR_COLOR);
if(!colorSensor->isPropertySupported(OB_SENSOR_PROPERTY_GAIN_INT))
    return;
//获取彩色相机增益值
int32_t gain = colorSensor->getIntProperty(OB_SENSOR_PROPERTY_GAIN_INT);
//设置彩色相机增益值
colorSensor->setIntProperty(OB_SENSOR_PROPERTY_GAIN_INT, gain / 2);

Android代码

boolean isExposure;
Sensor colorSensor = device.getSensor(SensorType.COLOR);
boolean isSupport = colorSensor.isPropertySupported(SensorProperty.GAIN_INT);
if (!isSupport) {
    return;
}
//获取彩色相机增益
int gain = colorSensor.getPropertyValueI(SensorProperty.GAIN_INT);
//设置彩色相机增益
colorSensor.setPropertyValueI(SensorProperty.GAIN_INT, gain / 2);

4.9 彩色相机数据流镜像

image44

C++代码

std::shared_ptr<ob::Sensor> colorSensor = device->getSensorList()->getSensor(OB_SENSOR_COLOR);
if(!colorSensor->isPropertySupported(OB_SENSOR_PROPERTY_ROLL_INT))
    return;
//1 - 设置镜像; 0 - 不设置镜像
colorSensor->setBoolProperty(OB_SENSOR_PROPERTY_ROLL_INT, 1);

Android代码

Sensor colorSensor = device.getSensor(SensorType.COLOR);
boolean isSupport = colorSensor.isPropertySupported(SensorProperty.ROLL_INT);
if (!isSupport) {
    return;
}
//1 - 设置镜像; 0 - 不设置镜像
colorSensor.setPropertyValueI(SensorProperty.ROLL_INT, 1);

4.10 深度相机数据流镜像

image45

C++代码

bool isMirror;
std::shared_ptr<ob::Sensor> depthSensor = device->getSensorList()->getSensor(OB_SENSOR_COLOR);
if(!depthSensor->isPropertySupported(OB_DEVICE_PROPERTY_DEPTH_MIRROR_BOOL))
    return;

depthSensor->setBoolProperty(OB_DEVICE_PROPERTY_DEPTH_MIRROR_BOOL, isMirror);

Android代码

boolean isMirror;
boolean isSupport = device.isPropertySupported(DeviceProperty.DEPTH_MIRROR_BOOL);
if (!isSupport) {
    return;
}
device.setPropertyValueB(DeviceProperty.DEPTH_MIRROR_BOOL, isMirror);

4.11 红外相机数据流镜像

image46

C++代码

bool isMirror;
std::shared_ptr<ob::Sensor> irSensor = device->getSensorList()->getSensor(OB_SENSOR_IR);
if(!irSensor->isPropertySupported(OB_SDK_PROPERTY_IR_MIRROR_BOOL))
    return;

irSensor->setBoolProperty(OB_SDK_PROPERTY_IR_MIRROR_BOOL, isMirror);

Android代码

boolean isMirror;
boolean isSupport = device.isPropertySupported(DeviceProperty.IR_MIRROR_BOOL);
if (!isSupport) {
    return;
}
device.setPropertyValueB(DeviceProperty.IR_MIRROR_BOOL, isMirror);