圖像傳感器往往面臨的挑戰(zhàn)是明暗亮度相差較大場景下的物體細節(jié)顯示能力,例如拍攝室內(nèi)窗邊的人或物體,如圖1所示。在機器人方向,類似的場景也會出現(xiàn),比如在工廠走廊(陽光和陰影共存的場景)運行的自主移動機器人(AMR);在落地窗旁工作的清潔機器人面臨著過曝和背光物體過暗的問題。在這些場景中,長時間曝光可能會導(dǎo)致亮區(qū)過度曝光,而短時間曝光可能無法捕捉暗區(qū)的細節(jié)。Orbbec Gemini 330 Series 立體相機也面臨著類似的挑戰(zhàn),因為深度圖像的本質(zhì)是根據(jù)左右IR計算得到。
圖1 半戶外場景
高動態(tài)范圍的成像是在計算機圖形學(xué)與電影攝影術(shù)中,是用來實現(xiàn)比普通數(shù)位圖像技術(shù)更大曝光動態(tài)范圍(即更大的明暗差別)的一組技術(shù),利用多幀合并的方式來克服普通傳感器的極限。對于3D深度攝像頭,高動態(tài)范圍意味著更高的深度填充率和更高的準(zhǔn)確性,這將顯著增強機器人的避障能力。本文介紹了與HDR功能相關(guān)的基本概念,并介紹了HDR在Orbbec Gemini 330 Series 相機的應(yīng)用。
曝光和增益是攝影和成像技術(shù)中的兩個主要參數(shù),直接影響圖像的質(zhì)量和清晰度。
ORBBEC Gemini 330 Series 分別控制可見光RGB相機、紅外相機的曝光。深度或紅外攝像頭,曝光以微秒(μs)為單位進行測量。曝光時間范圍從1μs到約166 ms。較長的曝光時間可以增加低光環(huán)境中圖像亮度和信噪比(SNR),從而提高圖像清晰度,反之亦然。室內(nèi)場景通常需要較長的曝光時間,而戶外場景則需要較短的曝光時間。
圖2 圖像亮度隨曝光時間的變化趨勢
增益不會影響傳感器的進光量,而是放大現(xiàn)有的電信號。增加增益可以增強低光條件下的圖像亮度,但也會增加噪聲并降低圖像質(zhì)量。此外,將較短的曝光時間與較高的增益設(shè)置相結(jié)合,可以有效減小由快速運動引起的運動模糊等效應(yīng)。
圖3 圖像亮度隨時間的變化
當(dāng)電信號轉(zhuǎn)換為數(shù)字圖像過程中,它們根據(jù)傳感器的有效動態(tài)范圍和可用的比特深度進行量化,對于一個k位成像傳感器,通常預(yù)期的灰度值范圍從0到 2k-1, 小于最小閾值或大于最大閾值將被截斷。這可能導(dǎo)致出現(xiàn)過曝和欠曝的區(qū)域。曝光過度的區(qū)域通常在IR圖像中呈現(xiàn)白色,而曝光不足IR圖像會呈現(xiàn)黑色。在3D相機中該問題也會存在,過曝和欠曝會導(dǎo)致深度圖出現(xiàn)缺失或噪聲,如下圖所示。
圖4 過曝(上)和欠曝(下)兩種不良情況:左測為紅外圖像,右側(cè)為深度圖像
為了解決欠曝或者過曝的問題,常見的方法包括:手動調(diào)整相機曝光、自動曝光策略、HDR技術(shù) 或 圖像增強等。本文不討論圖像增強技術(shù)。
Orbbec Gemini 330 Series 支持手動曝光調(diào)整,即允許用戶調(diào)整曝光時間和增益來保證圖像亮度。該方法不會根據(jù)環(huán)境光照的變化自動調(diào)整。一般應(yīng)用在需要執(zhí)行精確的曝光控制的場景,例如,為了拍攝快速移動的物體,可以設(shè)置較小的固定曝光時間以防止運動模糊。
圖5 用短曝光(左圖)和長曝光(右圖)拍攝相同的場景
用戶可以在Orbbec Viewer中設(shè)置左右IR相機或深度的曝光時間和增益。設(shè)置前先將關(guān)閉自動曝光。其中左右IR和Depth相機的曝光和增益是同步調(diào)整,三者保持一致。
圖6 在Orbbec Viewer中手動曝光參數(shù)設(shè)置
代碼參考如下:
// 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);
自動曝光是相機根據(jù)光線的強弱自動調(diào)整曝光量,防止曝光過度或者不足,保證圖像信噪比滿足用戶需求。例如,機器人需要在室內(nèi)和室外工作,通常將攝像頭設(shè)置為自動曝光模式。
圖7 自動曝光效果,室內(nèi)(上圖)和室外(下圖),左邊是IR圖,右邊是深度圖
默認(rèn)情況下,Orbbec Gemini 330 Series 相機配置為自動曝光模式。在這種模式中,相機會自動調(diào)整曝光和增益值,直到平均圖像強度達到某個預(yù)設(shè)值。在Orbbec Viewer中也可以開啟或者關(guān)閉自動曝光。
用戶可以根據(jù)場景調(diào)整自動曝光參數(shù),即目標(biāo)亮度預(yù)設(shè)值(Mean Intensity Set Point),設(shè)置方式如下圖所示:
圖8 在Orbbec Viewer中自動曝光參數(shù)配置
自動曝光配置代碼如下:
// 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節(jié)的HDR功能。
相機的最大曝光時間受到幀率的限制,如表1所示。在自動曝光模式下,最大曝光時間小于該幀率對應(yīng)的最大曝光(表1所示最大曝光時間)。在手動曝光模式下,允許曝光曝光時間大于該幀率對應(yīng)的最大曝光,但會導(dǎo)致幀率降低。例如,如果相機的幀率設(shè)置為30fps,并且手動曝光時間設(shè)置為30ms,但某些室內(nèi)場景仍然顯得太暗,曝光時間可以延長到60ms, 但此時輸出幀率降低到15fps。
表1 每個幀率對應(yīng)的最大曝光時間

HDR 高動態(tài)范圍成像的目的是可以顯示更大的范圍亮度。為了克服傳統(tǒng)動態(tài)范圍的限制,可以采用采集多幀不同曝光時間的圖像,并將它們合并成一張HDR圖像。 因為Orbbec Gemini 330 Series 硬件(MX6800)的限制,無法在硬件ASIC上實現(xiàn)多幀融合。我們提出了一種運行在主機CPU上的軟件解決方案來實現(xiàn)此功能。利用兩個連續(xù)幀的數(shù)據(jù)直接合成一幀深度圖像,從而增強了16位深度圖像的動態(tài)范圍。此功能需要固件版本v1.2.01+和SDKv1.9.0+。
如上所述,HDR可調(diào)整固定的曝光和增益值,用戶根據(jù)實際應(yīng)用場景來進行設(shè)置。深度的HDR即為合并不同的曝光和增益設(shè)置下的深度圖。對于給定的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}是權(quán)重函數(shù)。在Orbbec的HDR功能n=2。\mathscr{W}函數(shù)的取值為0或1,因此上述函數(shù)也可以表示為:
d=\begin{cases} d_0 &\text{if } d_0\neq0 \\ d_1 & \text{elif } d_1\neq0 \\ 0&\text{otherwise} \end{cases} (2)
注: 如前所述,該融合算法在OrbbecSDK中實現(xiàn)。
但用戶使用Orbbec Viewer工具中高動態(tài)范圍(HDR)控制功能時,需要開啟深度或紅外數(shù)據(jù)流。因為HDR涉及連續(xù)兩幀數(shù)據(jù)的融合,為了避免圖像拖影,可以將幀率提高到30fps及以上。 每幀HDR輸出結(jié)果為合并相鄰兩幀后的結(jié)果,即“高曝光+低曝光”融合和“低曝光+高曝光”融合方式。這種方式會導(dǎo)致幀延遲,但幀率可以保持不變。用戶可以按照如下設(shè)置方式手動調(diào)整高曝光和低曝光幀的曝光和增益設(shè)置,以優(yōu)化HDR性能。 為了更準(zhǔn)確設(shè)置參數(shù),可以先關(guān)閉HDR-Merge功能,先檢查高/低曝光下的所感興趣的物體是否有較為完整的深度(高反物體和低反物體)。

圖9 在Orbbec Viewer中配置HDR的硬件
開啟HDR后,數(shù)據(jù)流會在兩個預(yù)定的曝光設(shè)置之間交替。可以查看工具面板的metadata信息列表。
圖10 檢查HDR流的幀元數(shù)據(jù)
其中,metadata 相關(guān)內(nèi)容說明如下:
● Hdr Sequence Name:HDR序列的名稱
● Hdr Sequence Size:HDR序列的長度
● Hdr Sequence Index:當(dāng)前幀在HDR序列中的編號(從零開始)
● Exposure:用于當(dāng)前幀的曝光
● Gain:用于當(dāng)前幀的增益
HDR融合后的深度需要啟用HDRMerge后處理開關(guān),如下圖所示:
圖11 開啟深度HDRMerge
開啟HDRMerge后,深度不會閃爍,但是IR圖仍然會閃爍。OrbbecSDK不支持對IR圖像的融合,IR圖像的融合用戶可以根據(jù)自身的需要按照簡單的圖像處理即可完成。除了HDRMerge之外,OrbbecSDK還可以通過數(shù)據(jù)幀ID,將閃爍流拆分為兩個獨立數(shù)據(jù)流(需要關(guān)閉HDRMerge)。通過ID來過濾數(shù)據(jù)流,此時深度也不再閃爍,輸出的深度為高曝光幀或者低曝光幀。
圖12 通過序列ID對流進行過濾
HDR使能和HDRMerge功能生效,相關(guān)配置可以參考如下示例代碼:
#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效果,場景包含一個矩形高反面板和一個低反射支架, 當(dāng)采用自動曝光時, 從深度圖可知,矩形白色高反貼已過曝,深度出現(xiàn)了明顯了缺失。
圖13 自動曝光模式下的深度效果(高低反場景,高反貼深度缺失)
如果使用HDR功能,分別設(shè)置曝光時間為7000ms和100ms, 得到如下深度效果,以及融合后的深度效果,從深度效果來看,整幅圖像中的物體深度完整,不管是低反黑色支架還是白色高反貼。
圖14. HDR效果示意:高曝光幀(第一行),低曝光幀(第二行),融合后的HDR深度(第三行)
HDR另一個關(guān)注點是其對深度準(zhǔn)確性的影響。如下所示,在距離Orbbec Gemini 335相機約1043mm的墻上粘貼幾塊高反射面板,如左上方的RGB圖像所示。從右上方圖上可知,高反區(qū)域的散斑點已過曝,因此這些區(qū)域深度無法準(zhǔn)確估算。左下方采用自動曝光采集的深度圖,右下方是開啟HDR及HDRMerge后的深度。
圖15. 將高度反射的面板緊貼在平坦的墻壁上以測試準(zhǔn)確性
比較高反貼在自動曝光下的深度和HDR融合后的深度,選擇深度圖高反貼區(qū)域,采用Imagej 工具顯示某一行的深度波動情況,黑色表示開啟自動曝光和紅色線表示HDR融合后的深度,從下面數(shù)據(jù)可以看到HDR融合后的深度波動會略小,不過在有些情況下,兩者精度波動趨勢也不明顯。
圖16. 在與圖15相同的場景中捕獲的深度圖像的部分剖面
Orbbec Gemini 330 Series 相機能提供高質(zhì)量的深度成像,其中自動曝光可以滿足大多數(shù)情況下的用戶需求,包括室內(nèi)和室外。對于自主移動機器人,自動曝光模式能夠有效處理不斷變化的光照條件。自動曝光算法在固件中實現(xiàn)的,因此不會消耗上位機資源,用戶操作簡單。而手動曝光通常用于需要精確曝光控制的場景。
深度相機的HDR主要是為了解決自動曝光和手動曝光都無法解決的一些挑戰(zhàn)。它顯著提高了在一些極線光照環(huán)境下的深度填充率,可能提升深度準(zhǔn)確性。它能幫助減少了機器人視覺系統(tǒng)中兩種常見且嚴(yán)重的錯誤:“漏檢”和“誤檢”。
深度HDR也有自身的局限性,因為需要兩幀數(shù)據(jù)幀的融合,需要消耗上位機額外的算力,且還會導(dǎo)致幀延遲;確定適當(dāng)?shù)母咂毓鈺r間和低曝光時間需要一定的經(jīng)驗;對于高速移動物體會因為融合而產(chǎn)生運動偽影。
在相機快速移動的場景中,可以調(diào)整自動曝光的平均強度來提高深度質(zhì)量。如果需要使用HDR功能,可以考慮更高幀率,可以改善運動偽影。對于需要精確深度數(shù)據(jù)的應(yīng)用場景,可以使用HDR開啟,但不使用多幀融合(HDRMerge 關(guān)閉),即采用高曝光和低曝光幀以滿足特定算法需求。