RM新时代网站

深度圖像的HDR功能

版本:V3.1

1. 介紹

圖像傳感器往往面臨的挑戰是明暗亮度相差較大場(chǎng)景下的物體細節顯示能力,例如拍攝室內窗邊的人或物體,如圖1所示。在機器人方向,類(lèi)似的場(chǎng)景也會(huì )出現,比如在工廠(chǎng)走廊(陽(yáng)光和陰影共存的場(chǎng)景)運行的自主移動(dòng)機器人(AMR);在落地窗旁工作的清潔機器人面臨著(zhù)過(guò)曝和背光物體過(guò)暗的問(wèn)題。在這些場(chǎng)景中,長(cháng)時(shí)間曝光可能會(huì )導致亮區過(guò)度曝光,而短時(shí)間曝光可能無(wú)法捕捉暗區的細節。Orbbec Gemini 330 Series 立體相機也面臨著(zhù)類(lèi)似的挑戰,因為深度圖像的本質(zhì)是根據左右IR計算得到。

image.png 

圖1  半戶(hù)外場(chǎng)景

高動(dòng)態(tài)范圍的成像是在計算機圖形學(xué)與電影攝影術(shù)中,是用來(lái)實(shí)現比普通數位圖像技術(shù)更大曝光動(dòng)態(tài)范圍(即更大的明暗差別)的一組技術(shù),利用多幀合并的方式來(lái)克服普通傳感器的極限。對于3D深度攝像頭,高動(dòng)態(tài)范圍意味著(zhù)更高的深度填充率和更高的準確性,這將顯著(zhù)增強機器人的避障能力。本文介紹了與HDR功能相關(guān)的基本概念,并介紹了HDR在Orbbec Gemini  330 Series 相機的應用。

2. 傳感器設置

2.1 曝光和增益

曝光和增益是攝影和成像技術(shù)中的兩個(gè)主要參數,直接影響圖像的質(zhì)量和清晰度。

ORBBEC Gemini 330 Series 分別控制可見(jiàn)光RGB相機、紅外相機的曝光。深度或紅外攝像頭,曝光以微秒(μs)為單位進(jìn)行測量。曝光時(shí)間范圍從1μs到約166 ms。較長(cháng)的曝光時(shí)間可以增加低光環(huán)境中圖像亮度和信噪比(SNR),從而提高圖像清晰度,反之亦然。室內場(chǎng)景通常需要較長(cháng)的曝光時(shí)間,而戶(hù)外場(chǎng)景則需要較短的曝光時(shí)間。  

image.png 

圖2 圖像亮度隨曝光時(shí)間的變化趨勢

增益不會(huì )影響傳感器的進(jìn)光量,而是放大現有的電信號。增加增益可以增強低光條件下的圖像亮度,但也會(huì )增加噪聲并降低圖像質(zhì)量。此外,將較短的曝光時(shí)間與較高的增益設置相結合,可以有效減小由快速運動(dòng)引起的運動(dòng)模糊等效應。

image.png 

圖3 圖像亮度隨時(shí)間的變化

2.2 過(guò)曝和欠曝

當電信號轉換為數字圖像過(guò)程中,它們根據傳感器的有效動(dòng)態(tài)范圍和可用的比特深度進(jìn)行量化,對于一個(gè)k位成像傳感器,通常預期的灰度值范圍從0到  2k-1, 小于最小閾值或大于最大閾值將被截斷。這可能導致出現過(guò)曝和欠曝的區域。曝光過(guò)度的區域通常在IR圖像中呈現白色,而曝光不足IR圖像會(huì )呈現黑色。在3D相機中該問(wèn)題也會(huì )存在,過(guò)曝和欠曝會(huì )導致深度圖出現缺失或噪聲,如下圖所示。

image.png 

image.png 

圖4 過(guò)曝(上)和欠曝(下)兩種不良情況:左測為紅外圖像,右側為深度圖像

為了解決欠曝或者過(guò)曝的問(wèn)題,常見(jiàn)的方法包括:手動(dòng)調整相機曝光、自動(dòng)曝光策略、HDR技術(shù) 或 圖像增強等。本文不討論圖像增強技術(shù)。

2.3 手動(dòng)曝光

Orbbec Gemini 330 Series 支持手動(dòng)曝光調整,即允許用戶(hù)調整曝光時(shí)間和增益來(lái)保證圖像亮度。該方法不會(huì )根據環(huán)境光照的變化自動(dòng)調整。一般應用在需要執行精確的曝光控制的場(chǎng)景,例如,為了拍攝快速移動(dòng)的物體,可以設置較小的固定曝光時(shí)間以防止運動(dòng)模糊。

image.png 

圖5 用短曝光(左圖)和長(cháng)曝光(右圖)拍攝相同的場(chǎng)景

用戶(hù)可以在Orbbec Viewer中設置左右IR相機或深度的曝光時(shí)間和增益。設置前先將關(guān)閉自動(dòng)曝光。其中左右IR和Depth相機的曝光和增益是同步調整,三者保持一致。

image.png 

圖6 在Orbbec Viewer中手動(dòng)曝光參數設置

代碼參考如下:

// 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);

2.4 自動(dòng)曝光

自動(dòng)曝光是相機根據光線(xiàn)的強弱自動(dòng)調整曝光量,防止曝光過(guò)度或者不足,保證圖像信噪比滿(mǎn)足用戶(hù)需求。例如,機器人需要在室內和室外工作,通常將攝像頭設置為自動(dòng)曝光模式。

image.png 

image.png 

圖7 自動(dòng)曝光效果,室內(上圖)和室外(下圖),左邊是IR圖,右邊是深度圖

默認情況下,Orbbec Gemini 330 Series 相機配置為自動(dòng)曝光模式。在這種模式中,相機會(huì )自動(dòng)調整曝光和增益值,直到平均圖像強度達到某個(gè)預設值。在Orbbec Viewer中也可以開(kāi)啟或者關(guān)閉自動(dòng)曝光。

用戶(hù)可以根據場(chǎng)景調整自動(dòng)曝光參數,即目標亮度預設值(Mean Intensity Set Point),設置方式如下圖所示:

image.png 

圖8 在Orbbec Viewer中自動(dòng)曝光參數配置

自動(dòng)曝光配置代碼如下:

// 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);

自動(dòng)曝光可以滿(mǎn)足用戶(hù)的絕大部分場(chǎng)景的使用,但是對于極端的高低反場(chǎng)景,可以考慮第3節的HDR功能。

2.5 曝光限制

相機的最大曝光時(shí)間受到幀率的限制,如表1所示。在自動(dòng)曝光模式下,最大曝光時(shí)間小于該幀率對應的最大曝光(表1所示最大曝光時(shí)間)。在手動(dòng)曝光模式下,允許曝光曝光時(shí)間大于該幀率對應的最大曝光,但會(huì )導致幀率降低。例如,如果相機的幀率設置為30fps,并且手動(dòng)曝光時(shí)間設置為30ms,但某些室內場(chǎng)景仍然顯得太暗,曝光時(shí)間可以延長(cháng)到60ms, 但此時(shí)輸出幀率降低到15fps。

表1 每個(gè)幀率對應的最大曝光時(shí)間

image.png

3. 高動(dòng)態(tài)范圍

HDR 高動(dòng)態(tài)范圍成像的目的是可以顯示更大的范圍亮度。為了克服傳統動(dòng)態(tài)范圍的限制,可以采用采集多幀不同曝光時(shí)間的圖像,并將它們合并成一張HDR圖像。 因為Orbbec Gemini 330 Series 硬件(MX6800)的限制,無(wú)法在硬件ASIC上實(shí)現多幀融合。我們提出了一種運行在主機CPU上的軟件解決方案來(lái)實(shí)現此功能。利用兩個(gè)連續幀的數據直接合成一幀深度圖像,從而增強了16位深度圖像的動(dòng)態(tài)范圍。此功能需要固件版本v1.2.01+和SDKv1.9.0+。

3.1 方法

如上所述,HDR可調整固定的曝光和增益值,用戶(hù)根據實(shí)際應用場(chǎng)景來(lái)進(jìn)行設置。深度的HDR即為合并不同的曝光和增益設置下的深度圖。對于給定的n幀的深度圖,定義 d_i (i=0, \ldots, n-1)為任意像素(u, v)的第i幀深度值,則該點(diǎn)(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中實(shí)現。

3.2 工具使用

但用戶(hù)使用Orbbec Viewer工具中高動(dòng)態(tài)范圍(HDR)控制功能時(shí),需要開(kāi)啟深度或紅外數據流。因為HDR涉及連續兩幀數據的融合,為了避免圖像拖影,可以將幀率提高到30fps及以上。 每幀HDR輸出結果為合并相鄰兩幀后的結果,即“高曝光+低曝光”融合和“低曝光+高曝光”融合方式。這種方式會(huì )導致幀延遲,但幀率可以保持不變。用戶(hù)可以按照如下設置方式手動(dòng)調整高曝光和低曝光幀的曝光和增益設置,以?xún)?yōu)化HDR性能。 為了更準確設置參數,可以先關(guān)閉HDR-Merge功能,先檢查高/低曝光下的所感興趣的物體是否有較為完整的深度(高反物體和低反物體)。

image.pngimage.png 

圖9 在Orbbec Viewer中配置HDR的硬件

開(kāi)啟HDR后,數據流會(huì )在兩個(gè)預定的曝光設置之間交替??梢圆榭垂ぞ呙姘宓膍etadata信息列表。

image.png 

圖10 檢查HDR流的幀元數據

其中,metadata 相關(guān)內容說(shuō)明如下:

● Hdr Sequence Name:HDR序列的名稱(chēng)

● Hdr Sequence Size:HDR序列的長(cháng)度

● Hdr Sequence Index:當前幀在HDR序列中的編號(從零開(kāi)始)

● Exposure:用于當前幀的曝光

● Gain:用于當前幀的增益

HDR融合后的深度需要啟用HDRMerge后處理開(kāi)關(guān),如下圖所示:

image.png 

圖11   開(kāi)啟深度HDRMerge

開(kāi)啟HDRMerge后,深度不會(huì )閃爍,但是IR圖仍然會(huì )閃爍。OrbbecSDK不支持對IR圖像的融合,IR圖像的融合用戶(hù)可以根據自身的需要按照簡(jiǎn)單的圖像處理即可完成。除了HDRMerge之外,OrbbecSDK還可以通過(guò)數據幀ID,將閃爍流拆分為兩個(gè)獨立數據流(需要關(guān)閉HDRMerge)。通過(guò)ID來(lái)過(guò)濾數據流,此時(shí)深度也不再閃爍,輸出的深度為高曝光幀或者低曝光幀。

image.png 

圖12 通過(guò)序列ID對流進(jìn)行過(guò)濾

3.3 代碼參考

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);
}

3.4 結果

Orbbec Gemini 330 Series 相機的HDR功能提高了深度填充率,降低了深度空洞率。我們可以在如下場(chǎng)景下對比AE和HDR效果,場(chǎng)景包含一個(gè)矩形高反面板和一個(gè)低反射支架, 當采用自動(dòng)曝光時(shí), 從深度圖可知,矩形白色高反貼已過(guò)曝,深度出現了明顯了缺失。

image.png 

圖13  自動(dòng)曝光模式下的深度效果(高低反場(chǎng)景,高反貼深度缺失)

      如果使用HDR功能,分別設置曝光時(shí)間為7000ms和100ms, 得到如下深度效果,以及融合后的深度效果,從深度效果來(lái)看,整幅圖像中的物體深度完整,不管是低反黑色支架還是白色高反貼。

image.png 

圖14. HDR效果示意:高曝光幀(第一行),低曝光幀(第二行),融合后的HDR深度(第三行)

HDR另一個(gè)關(guān)注點(diǎn)是其對深度準確性的影響。如下所示,在距離Orbbec Gemini 335相機約1043mm的墻上粘貼幾塊高反射面板,如左上方的RGB圖像所示。從右上方圖上可知,高反區域的散斑點(diǎn)已過(guò)曝,因此這些區域深度無(wú)法準確估算。左下方采用自動(dòng)曝光采集的深度圖,右下方是開(kāi)啟HDR及HDRMerge后的深度。

 

image.png 

圖15. 將高度反射的面板緊貼在平坦的墻壁上以測試準確性

比較高反貼在自動(dòng)曝光下的深度和HDR融合后的深度,選擇深度圖高反貼區域,采用Imagej 工具顯示某一行的深度波動(dòng)情況,黑色表示開(kāi)啟自動(dòng)曝光和紅色線(xiàn)表示HDR融合后的深度,從下面數據可以看到HDR融合后的深度波動(dòng)會(huì )略小,不過(guò)在有些情況下,兩者精度波動(dòng)趨勢也不明顯。

image.png 

圖16. 在與圖15相同的場(chǎng)景中捕獲的深度圖像的部分剖面

4. 總結

Orbbec Gemini 330 Series 相機能提供高質(zhì)量的深度成像,其中自動(dòng)曝光可以滿(mǎn)足大多數情況下的用戶(hù)需求,包括室內和室外。對于自主移動(dòng)機器人,自動(dòng)曝光模式能夠有效處理不斷變化的光照條件。自動(dòng)曝光算法在固件中實(shí)現的,因此不會(huì )消耗上位機資源,用戶(hù)操作簡(jiǎn)單。而手動(dòng)曝光通常用于需要精確曝光控制的場(chǎng)景。

深度相機的HDR主要是為了解決自動(dòng)曝光和手動(dòng)曝光都無(wú)法解決的一些挑戰。它顯著(zhù)提高了在一些極線(xiàn)光照環(huán)境下的深度填充率,可能提升深度準確性。它能幫助減少了機器人視覺(jué)系統中兩種常見(jiàn)且嚴重的錯誤:“漏檢”和“誤檢”。

       深度HDR也有自身的局限性,因為需要兩幀數據幀的融合,需要消耗上位機額外的算力,且還會(huì )導致幀延遲;確定適當的高曝光時(shí)間和低曝光時(shí)間需要一定的經(jīng)驗;對于高速移動(dòng)物體會(huì )因為融合而產(chǎn)生運動(dòng)偽影。

在相機快速移動(dòng)的場(chǎng)景中,可以調整自動(dòng)曝光的平均強度來(lái)提高深度質(zhì)量。如果需要使用HDR功能,可以考慮更高幀率,可以改善運動(dòng)偽影。對于需要精確深度數據的應用場(chǎng)景,可以使用HDR開(kāi)啟,但不使用多幀融合(HDRMerge 關(guān)閉),即采用高曝光和低曝光幀以滿(mǎn)足特定算法需求。


RM新时代网站