介绍¶
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 |
4 月(版本 1803,操作系统内部版本 17134)发行版 (x64) 或更高版本- 4 GB 内存- USB2.0 及以上端口 |
vs的工程的生成依赖 安装vs版本和cmake版本, 支持vs2015/vs2017/vs2019 |
Android |
|
|
Linux |
16.04/18.04/20.04 (x64)- 4 GB 内存- USB2.0 及以上端口 |
支持GCC 7.5 |
OrbbecViewer工具的使用¶
3.1 软件主界面¶
如图所示,主界面用红框分隔标注了3个区域,作用分别是:
区域 |
名称 |
功能 |
---|---|---|
区域一 |
设备管理区 |
传感器列表、设备固件更新 |
区域二 |
控制面板区 |
数据流开关及参数配置、图像采集功能控制、D2C功能控制 |
区域三 |
图像预览区 |
传感器图像预览,帧率、时间戳等信息查看 |
其中,控制面板区左侧有六个按钮,最下方按钮
用于切换中英文;
用于打开软件详情页面。
用于查看设备信息和固件升级;剩下两个按钮用于切换不同功能的控制面板TAB页,从上往下一次为“单相机模式”、“高级模式”。点击区域三下方Log信息处,会展示具体的日志信息。
3.2 数据流¶
OrbbecViewer
允许用户选择和配置深度、红外和彩色数据流。本节概述了用户可在工具中自定义的参数。用户完成配置后,必须单击顶部按钮开始数据流传输(Astra+无惯性测试单元)。
OrbbecViewer工具允许用户选择深度、红外和彩色数据流组合。用户可以通过从可用流列表中选中/取消选中以启用/禁用该流。查看器支持
USB2.0 和 USB3.0,因此可用的配置参数会因 USB2.0/USB3.0
功能而异。
分辨率与帧率¶
摄像机为用户提供了多种分辨率可供选择,以满足他们的解决方案需求。各路数据流都提供了多种可选的帧格式,已供用户自由选择合适的图像尺寸、图像格式和帧率组合。
例如,深度流可以支持320x240和640x480两种分辨率,FPS帧率的区间范围为5到30。
彩色流可以支持640x480~1920x1080多种分辨率,FPS帧率的区间范围5到30不等,支持MJPG、RGB、I420、H265。对于彩色流的预览,MJPG、H264、H265是编码格式,需要先进行解码,解码通常耗时会比较大,会导致掉帧或渲染出“花屏”画面。在某些型号PC上,可通过硬件加速解码。
红外流可以支持320x240和640x480两种分辨率,FPS帧率5到30不等。
用户可根据实际情况选择最适合使用的分辨率。请注意,分辨率越高,精确度越高,但会增加计算强度。
3.3 设备信息¶
点击按钮“”查看设备信息OrbbecViewer工具包含简单的设备信息,如固件版本、产品识别码、相机参数、温度等。
3.4 图像预览区¶
开流会默认显示平均帧率、时间搓、图像帧号等信息,点击右上角来切换信息显示关闭。点击
可以关闭流,但不从预览区中移除。点击
可以重新打开已经暂停且未从预览区移除的流。数据流关闭后,图像预览窗并不会随之关闭,需要用户点击图像预览窗右上角
。
3.5 控制面板区¶
3.5.1 传感器和数据流¶
获取相机名称、序列号及USB协议¶
设备上电并将USB与PC主机连接后,打开OrbbecViewer工具软件,软件会自动连接设备。某些设备可能初始化较长时间,请耐心等待设备连接成功。
各流的参数配置项默认隐藏,可点击设备管理区四个按钮展开查看和设置具体配置项。
连接成功后,控制面板区自动显示设备具体信息。
深度流模块¶
包括:镜像、软件滤波(范围模式:关闭、中等、长距离)、深度有效范围获取(MinDepthValue/MaxDepthValue)、曝光等功能。
彩色流模块¶
包括:镜像、翻转、对齐、曝光、白平衡、增益、亮度、锐度、饱和度、对比度、色调等功能。
红外流板块¶
包括镜像、曝光功能。
设备数据管理¶
用户可选择对应图像和捕获帧来进行录制,采集的帧默认保存在“OrbbecViewer/output”目录中。
3.6 D2C功能(支持硬件D2C和软件D2C)¶
在高级模式下的“D2C”功能,可控制实现深度流和彩色流同步功能:
1.点击按钮即可默认同步打开深度流和彩色流;
2.可通过切换按钮实现打开或关闭帧同步功能;
3.点击按钮可预览深度叠加到彩色的渲染显示效果;
4.点击按钮可打开或关闭深度和彩色帧同步采集(Femto特有);
5.录制的图片默认保存在“OrbbecViewer/output/RecordFile”目录中。
3.7 点云¶
点击即可开启点云。
可通过鼠标的滑轮控制点云的缩放,鼠标的移动来控制点云的移动。
可选择导出深度点云(xyz)或RGBD点云(xyzrgb)并保存成ply格式文件,默认保存在“OrbbecViewer/output/PointCloud”目录中。
3.8 固件更新¶
在设备已连接状态,点击可进入固件更新页面。
Femto设备固件包含系统固件和板载MCU固件,可在“类型”下拉框选择升级固件类型。
选择好固件类型后,在“固件”输入框输入现有更新的固件镜像文件(“.img”后缀),点击“升级”按钮开始更新。
设备固件更新采用A/B双分区方案,如更新意外失败,不会影响原固件运行,重新连接设备进行更新即可。设备更新时间比较长,且设备会自动重启一次,请留意提示信息并耐心等待。
Astra+界面:
Femto界面:
3.9 日志信息¶
默认情况下,日志信息区是折叠单条显示状态,可通过点击最右边按钮展开查看完整log信息。展开后可通过点击按钮
清空log,通过点击按钮
恢复折叠单条显示状态。
功能介绍¶
演示了主要API的使用。
4.1 获取序列号¶
C++代码¶
DeviceInfo deviceInfo = device->getDeviceInfo();
std::string serialNumber = deviceInfo.serialNumber();
Android代码¶
DeviceInfo deviceInfo = device.getInfo();
String serialNumber = deviceInfo.getSerialNumber();
4.2 获取设备名称¶
C++代码¶
std::shared_ptr< DeviceInfo > deviceInfo = device->getDeviceInfo();
std::string deviceName = deviceInfo->name();
Android代码¶
DeviceInfo deviceInfo = device.getInfo();
String name = deviceInfo.getName();
4.3 获取相机参数¶
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 获取和设置红外相机曝光值¶
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 彩色相机自动曝光¶
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 获取和设置彩色相机曝光值¶
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 彩色相机自动白平衡¶
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 获取和设置彩色相机增益¶
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 彩色相机数据流镜像¶
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 深度相机数据流镜像¶
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 红外相机数据流镜像¶
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);