图像传感器往往面对的挑战是明暗亮度相差较大场景下的物体细节显示能力,,,,,,,例如拍摄室内窗边的人或物体,,,,,,,如图1所示。。。。。。。在机械人方向,,,,,,,类似的场景也会出现,,,,,,,好比在工厂走廊(阳光和阴影共存的场景)运行的自主移动机械人(AMR);;;;;;在落地窗旁工作的清洁机械人面对着过曝和背光物体过暗的问题。。。。。。。在这些场景中,,,,,,,长功夫曝光可能会导致亮区过度曝光,,,,,,,而短功夫曝光可能无法捉拿暗区的细节。。。。。。。Orbbec Gemini 330 Series 立体相机也面对着类似的挑战,,,,,,,由于深度图像的性质是凭据左右IR推算得到。。。。。。。
图1 半户表场景
高动态领域的成像是在推算机图形学与电影摄影术中,,,,,,,是用来实现比通常数位图像技术更大曝光动态领域(即更大的明暗差距)的一组技术,,,,,,,利用多帧归并的方式来克服通常传感器的极限。。。。。。。对于3D深度摄像头,,,,,,,高动态领域意味着更高的深度填充率和更高的正确性,,,,,,,这将显著加强机械人的避障能力。。。。。。。本文介绍了与HDR职能有关的根基概想,,,,,,,并介绍了HDR在Orbbec Gemini 330 Series 相机的利用。。。。。。。
曝光和增益是摄影和成像技术中的两个重要参数,,,,,,,直接影响图像的质量和清澈度。。。。。。。
ORBBEC Gemini 330 Series 别离节造可见光RGB相机、红表相机的曝光。。。。。。。深度或红表摄像头,,,,,,,曝光以微秒(?s)为单元进行丈量。。。。。。。曝光功夫领域从1?s到约166 ms。。。。。。。较长的曝光功夫能够增长低光环境中图像亮度和信噪比(SNR),,,,,,,从而提高图像清澈度,,,,,,,反之亦然。。。。。。。室内场景通常必要较长的曝光功夫,,,,,,,而户表场景则必要较短的曝光功夫。。。。。。。
图2 图像亮度随曝光功夫的变动趋向
增益不会影响传感器的进光量,,,,,,,而是放大现有的电信号。。。。。。。增长增益能够加强低光前提下的图像亮度,,,,,,,但也会增长噪声并降低图像质量。。。。。。。此表,,,,,,,将较短的曝光功夫与较高的增益设置相结合,,,,,,,能够有效减幼由急剧活动引起的活动吞吐等效应。。。。。。。
图3 图像亮度随功夫的变动
当电信号转换为数字图像过程中,,,,,,,它们凭据传感器的有效动态领域和可用的比特深度进行量化,,,,,,,对于一个k位成像传感器,,,,,,,通常预期的灰度值领域从0到 2k-1,,,,,,, 幼于最幼阈值或大于最大阈值将被截断。。。。。。。这可能导致出现过曝和欠曝的区域。。。。。。。曝光过度的区域通常在IR图像中出现白色,,,,,,,而曝光不及IR图像会出现玄色。。。。。。。在3D相机中该问题也会存在,,,,,,,过曝和欠曝会导致深度图出现缺失或噪声,,,,,,,如下图所示。。。。。。。
图4 过曝(上)和欠曝(下)两种不良情况:左测为红表图像,,,,,,,右侧为深度图像
为相识决欠曝或者过曝的问题,,,,,,,常见的步骤蕴含:手动调整相机曝光、自动曝光战术、HDR技术 或 图像加强等。。。。。。。本文不会商图像加强技术。。。。。。。
Orbbec Gemini 330 Series 支持手动曝光调整,,,,,,,即允许用户调整曝光功夫和增益来保障图像亮度。。。。。。。该步骤不会凭据环境光照的变动自动调整。。。。。。。通常利用在必要执行精确的曝光节造的场景,,,,,,,例如,,,,,,,为了拍摄急剧移动的物体,,,,,,,能够设置较幼的固定曝光功夫以预防活动吞吐。。。。。。。
图5 用短曝光(左图)和长曝光(右图)拍摄一样的场景
用户能够在Orbbec Viewer中设置左右IR相机或深度的曝光功夫和增益。。。。。。。设置前先将关关自动曝光。。。。。。。其中左右IR和Depth相机的曝光和增益是同措施整,,,,,,,三者维持一致。。。。。。。
图6 在Orbbec Viewer中手动曝光参数设置
代码参考如下:
// Create a pipeline with default device
ob::Pipeline pipe;
// Get the device from the pipeline
auto device = pipe.getDevice();
// set ir exposure value to 3000
device->setIntProperty(OB_PROP_IR_EXPOSURE_INT, 3000);
// set ir gain value to 16
device->setIntProperty(OB_PROP_IR_GAIN_INT, 16);
自动曝光是相机凭据光线的强弱自动调整曝光量,,,,,,,预防曝光过度或者不及,,,,,,,保障图像信噪比满足用户需要。。。。。。。例如,,,,,,,机械人必要在室内和室表工作,,,,,,,通常将摄像头设置为自动曝光模式。。。。。。。
图7 自动曝光成效,,,,,,,室内(上图)和室表(下图),,,,,,,左边是IR图,,,,,,,右边是深度图
默认情况下,,,,,,,Orbbec Gemini 330 Series 相机配置为自动曝光模式。。。。。。。在这种模式中,,,,,,,相机遇自动调整曝光和增益值,,,,,,,直到均匀图像强度达到某个预设值。。。。。。。在Orbbec Viewer中也能够开启或者关关自动曝光。。。。。。。
用户能够凭据场景调整自动曝光参数,,,,,,,即指标亮度预设值(Mean Intensity Set Point),设置方式如下图所示:
图8 在Orbbec Viewer中自动曝光参数配置
自动曝光配置代码如下:
// Create a pipeline with default device
ob::Pipeline pipe;
// Get the device from the pipeline
auto device = pipe.getDevice();
// Enable IR sensor auto exposue
device->setBoolProperty(OB_PROP_IR_AUTO_EXPOSURE_BOOL, true);
// set the IR sensor mean intensity set point value to 60
device->setIntProperty(OB_PROP_IR_BRIGHTNESS_INT, 60);
自动曝光能够满足用户的绝大部门场景的使用,,,,,,,但是对于极端的凹凸反场景,,,,,,,能够思考第3节的HDR职能。。。。。。。
相机的最大曝光功夫受到帧率的限度,,,,,,,如表1所示。。。。。。。在自动曝光模式下,,,,,,,最大曝光功夫幼于该帧率对应的最大曝光(表1所示最大曝光功夫)。。。。。。。在手动曝光模式下,,,,,,,允许曝光曝光功夫大于该帧率对应的最大曝光,,,,,,,但会导致帧率降低。。。。。。。例如,,,,,,,若是相机的帧率设置为30fps,,,,,,,并且手动曝光功夫设置为30ms,,,,,,,但某些室内场景依然显得太暗,,,,,,,曝光功夫能够耽搁到60ms, 但此时输出帧率降低到15fps。。。。。。。
表1 每个帧率对应的最大曝光功夫

HDR 高动态领域成像的主张是能够显示更大的领域亮度。。。。。。。为了克服传统动态领域的限度,,,,,,,能够选取采集多帧分歧曝光功夫的图像,,,,,,,并将它们归并成一张HDR图像。。。。。。。 由于Orbbec Gemini 330 Series 硬件(MX6800)的限度,,,,,,,无法在硬件ASIC上实现多帧融合。。。。。。。我们提出了一种运行在主机CPU上的软件解决规划来实现此职能。。。。。。。利用两个陆续帧的数据直接合成一帧深度图像,,,,,,,从而加强了16位深度图像的动态领域。。。。。。。此职能必要固件版本v1.2.01+和SDKv1.9.0+。。。。。。。
如上所述,,,,,,,HDR可调整固定的曝光和增益值,,,,,,,用户凭据现实利用场景来进行设置。。。。。。。深度的HDR即为归并分歧的曝光和增益设置下的深度图。。。。。。。对于给定的n帧的深度图,,,,,,,界说 d_i (i=0, \ldots, n-1)为肆意像素(u, v)的第i帧深度值,,,,,,,则该点(u, v)融合后的深度值可表白为:
d=\sum_{i=0}^{n-1}\mathscr{W}(d_i)\cdot d_i, (1)
其中,,,,,,,\mathscr{W}是权沉函数。。。。。。。在Orbbec的HDR职能n=2。。。。。。。\mathscr{W}函数的取值为0或1,,,,,,,因而上述函数也能够暗示为:
d=\begin{cases} d_0 &\text{if } d_0\neq0 \\ d_1 & \text{elif } d_1\neq0 \\ 0&\text{otherwise} \end{cases} (2)
注: 如前所述,,,,,,,该融合算法在OrbbecSDK中实现。。。。。。。
但用户使用Orbbec Viewer工具中高动态领域(HDR)节造职能时,,,,,,,必要开启深度或红表数据流。。。。。。。由于HDR涉及陆续两帧数据的融合,,,,,,,为了预防图像拖影,,,,,,,能够将帧率提高到30fps及以上。。。。。。。 每帧HDR输出了局为归并相邻两帧后的了局,,,,,,,即“高曝光+低曝光”融合和“低曝光+高曝光”融合方式。。。。。。。这种方式会导致帧延长,,,,,,,但帧率能够维持不变。。。。。。。用户能够依照如下设置方式手动调整高曝光和低曝光帧的曝光和增益设置,,,,,,,以优化HDR机能。。。。。。。 为了更正确设置参数,,,,,,,能够先关关HDR-Merge职能,,,,,,,先查抄高/低曝光下的所感兴致的物体是否有较为齐全的深度(高反物体和低反物体)。。。。。。。

图9 在Orbbec Viewer中配置HDR的硬件
开启HDR后,,,,,,,数据流会在两个预约的曝光设置之间交替。。。。。。。?????D芄徊榭垂ぞ呙姘宓膍etadata信息列表。。。。。。。
图10 查抄HDR流的帧元数据
其中,,,,,,,metadata 有关内容注明如下:
● Hdr Sequence Name:HDR序列的名称
● Hdr Sequence Size:HDR序列的长度
● Hdr Sequence Index:当前帧在HDR序列中的编号(从零起头)
● Exposure:用于当前帧的曝光
● Gain:用于当前帧的增益
HDR融合后的深度必要启用HDRMerge后处置开关,,,,,,,如下图所示:
图11 开启深度HDRMerge
开启HDRMerge后,,,,,,,深度不会闪动,,,,,,,但是IR图依然会闪动。。。。。。。OrbbecSDK不支持对IR图像的融合,,,,,,,IR图像的融合用户能够凭据自身的必要依照单一的图像处置即可实现。。。。。。。除了HDRMerge之表,,,,,,,OrbbecSDK还能够通过数据帧ID,,,,,,,将闪动流拆分为两个独立数据流(必要关关HDRMerge)。。。。。。。通过ID来过滤数据流,,,,,,,此时深度也不再闪动,,,,,,,输出的深度为高曝光帧或者低曝光帧。。。。。。。
图12 通过序列ID对流进行过滤
HDR使能和HDRMerge职能生效,,,,,,,有关配置能够参考如下示例代码:
#include "window.hpp"
#include "libobsensor/hpp/Pipeline.hpp"
#include "libobsensor/hpp/Error.hpp"
int main(int argc, char **argv) try {
// Create a pipeline with default device
ob::Pipeline pipe;
// Get the device from the pipeline
auto device = pipe.getDevice();
// Check if the device supports HDR merge
if(!device->isPropertySupported(OB_STRUCT_DEPTH_HDR_CONFIG, OB_PERMISSION_READ_WRITE)) {
std::cerr << "Current default device does not support HDR merge" << std::endl;
return -1;
}
// Configure which streams to enable or disable for the Pipeline by creating a Config
std::shared_ptr<ob::Config> config = std::make_shared<ob::Config>();
// Get all stream profiles of the depth camera, including stream resolution, frame rate, and frame format
auto depthProfiles = pipe.getStreamProfileList(OB_SENSOR_DEPTH);
auto depthProfile = depthProfiles->getProfile(OB_PROFILE_DEFAULT);
config->enableStream(depthProfile);
// Create HdrMerge post processor to merge depth frames betweens different hdr sequence ids.
// The HdrMerge also supports processing of infrared frames.
ob::HdrMerge hdrMerge;
// configure and enable Hdr stream
OBHdrConfig obHdrConfig;
obHdrConfig.enable = true; // enable HDR merge
obHdrConfig.exposure_1 = 7500;
obHdrConfig.gain_1 = 24;
obHdrConfig.exposure_2 = 100;
obHdrConfig.gain_2 = 16;
device->setStructuredData(OB_STRUCT_DEPTH_HDR_CONFIG, &obHdrConfig, sizeof(OBHdrConfig));
// Start the pipeline with config
pipe.start(config);
// Create a window for rendering and set the resolution of the window
bool resizeWindows = true;
Window app("HDR-Merge", 1280, 720);
bool mergeRequired = true;
std::cout << "Press 'M' to toggle HDR merge." << std::endl;
while(app) {
auto key = app.waitKey(10);
if(key == 'M' || key == 'm') {
mergeRequired = !mergeRequired;
if(mergeRequired) {
std::cout << "HDR merge enabled." << std::endl;
}
else {
std::cout << "HDR merge disabled." << std::endl;
}
}
auto frameSet = pipe.waitForFrames(100);
if(frameSet == nullptr) {
continue;
}
auto depthFrame = frameSet->depthFrame();
if(depthFrame == nullptr) {
continue;
}
if(mergeRequired) {
// Using HdrMerge post processor to merge depth frames
auto mergedDepthFrame = hdrMerge.process(depthFrame);
if(mergedDepthFrame == nullptr) {
continue;
}
// add merged depth frame to render queue
app.addToRender(mergedDepthFrame);
}
else {
// add original depth frame to render queue
app.addToRender(depthFrame);
}
}
// Stop the Pipeline, no frame data will be generated
pipe.stop();
// close hdr merge
obHdrConfig.enable = false;
device->setStructuredData(OB_STRUCT_DEPTH_HDR_CONFIG, &obHdrConfig, sizeof(OBHdrConfig));
return 0;
}
catch(ob::Error &e) {
std::cerr << "function:" << e.getName() << "\nargs:" << e.getArgs() << "\nmessage:" << e.getMessage() << "\ntype:" << e.getExceptionType() << std::endl;
exit(EXIT_FAILURE);
}
Orbbec Gemini 330 Series 相机的HDR职能提高了深度填充率,,,,,,,降低了深度浮泛率。。。。。。。我们能够在如下场景下对比AE和HDR成效,,,,,,,场景蕴含一个矩形高背面板和一个低反射支架,,,,,,, 当选取自动曝光时,,,,,,, 从深度图可知,,,,,,,矩形白色高反贴已过曝,,,,,,,深度出现了显著了缺失。。。。。。。
图13 自动曝光模式下的深度成效(凹凸反场景,,,,,,,高反贴深度缺失)
若是使用HDR职能,,,,,,,别离设置曝光功夫为7000ms和100ms, 得到如下深度成效,,,,,,,以及融合后的深度成效,,,,,,,从深度成效来看,,,,,,,整幅图像中的物体深度齐全,,,,,,,不论是低反玄色支架还是白色高反贴。。。。。。。
图14. HDR成效示意:高曝光帧。。。。。。ǖ谝恍校,,,,,,,低曝光帧。。。。。。ǖ诙行),,,,,,,融合后的HDR深度(第三行)
HDR另一个关注点是其对深度正确性的影响。。。。。。。如下所示,,,,,,,在距离Orbbec Gemini 335相机约1043mm的墙上粘贴几块高反射面板,,,,,,,如左上方的RGB图像所示。。。。。。。从右上方图上可知,,,,,,,高反区域的散黑点已过曝,,,,,,,因而这些区域深度无法正确估算。。。。。。。左下方选取自动曝光采集的深度图,,,,,,,右下方是开启HDR及HDRMerge后的深度。。。。。。。
图15. 将高度反射的面板紧贴在平展的墙壁上以测试正确性
比力高反贴在自动曝光下的深度和HDR融合后的深度,,,,,,,选择深度图高反贴区域,,,,,,,选取Imagej 工具显示某一行的深度颠簸情况,,,,,,,玄色暗示开启自动曝光和红色线暗示HDR融合后的深度,,,,,,,从下面数据能够看到HDR融合后的深度颠簸会略幼,,,,,,,不外在有些情况下,,,,,,,两者精度颠簸趋向也不显著。。。。。。。
图16. 在与图15一样的场景中捕获的深度图像的部吩焓面
Orbbec Gemini 330 Series 相机能提供高质量的深度成像,,,,,,,其中自动曝光能够满足大无数情况下的用户需要,,,,,,,蕴含室内和室表。。。。。。。对于自主移动机械人,,,,,,,自动曝光模式可能有效处置不休变动的光照前提。。。。。。。自动曝光算法在固件中实现的,,,,,,,因而不会亏损上位机资源,,,,,,,用户操作单一。。。。。。。而手动曝光通常用于必要精确曝光节造的场景。。。。。。。
深度相机的HDR重要是为相识决自动曝光和手动曝光都无法解决的一些挑战。。。。。。。它显着提高了在一些极线光照环境下的深度填充率,,,,,,,可能提升深度正确性。。。。。。。它能援手削减了机械人视觉系统中两种常见且严沉的谬误:“漏检”和“误检”。。。。。。。
深度HDR也有自身的局限性,,,,,,,由于必要两帧数据帧的融合,,,,,,,必要亏损上位机额表的算力,,,,,,,且还会导致帧延长;;;;;;确定适当的高曝光功夫和低曝光功夫必要肯定的经验;;;;;;对于高速移动物体味由于融合而产生涯动伪影。。。。。。。
在相机急剧移动的场景中,,,,,,,能够调整自动曝光的均匀强度来提深邃度质量。。。。。。。若是必要使用HDR职能,,,,,,,能够思考更高帧率,,,,,,,能够改善活动伪影。。。。。。。对于必要精确深度数据的利用场景,,,,,,,能够使用HDR开启,,,,,,,但不使用多帧融合(HDRMerge 关关),,,,,,,即选取高曝光和低曝光帧以满足特定算法需要。。。。。。。