<blockquote id="76sxc"></blockquote>
<cite id="76sxc"><track id="76sxc"></track></cite>
<legend id="76sxc"></legend>

  • <blockquote id="76sxc"><p id="76sxc"></p></blockquote>
    <sub id="76sxc"><p id="76sxc"></p></sub>

          深度圖像的HDR功能

          版本:V3.1

          1. 介紹

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

          image.png 

          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)用。

          2. 傳感器設(shè)置

          2.1 曝光和增益

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

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

          image.png 

          2 圖像亮度隨曝光時間的變化趨勢

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

          image.png 

          3 圖像亮度隨時間的變化

          2.2 過曝和欠曝

          當(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)缺失或噪聲,如下圖所示。

          image.png 

          image.png 

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

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

          2.3 手動曝光

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

          image.png 

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

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

          image.png 

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

          2.4 自動曝光

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

          image.png 

          image.png 

          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è)置方式如下圖所示:

          image.png 

          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功能。

          2.5 曝光限制

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

          1 每個幀率對應(yīng)的最大曝光時間

          image.png

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

          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+。

          3.1 方法

          如上所述,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)。

          3.2 工具使用

          但用戶使用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功能,先檢查高/低曝光下的所感興趣的物體是否有較為完整的深度(高反物體和低反物體)。

          image.pngimage.png 

          9 在Orbbec Viewer中配置HDR的硬件

          開啟HDR后,數(shù)據(jù)流會在兩個預(yù)定的曝光設(shè)置之間交替。可以查看工具面板的metadata信息列表。

          image.png 

          10 檢查HDR流的幀元數(shù)據(jù)

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

          ● Hdr Sequence NameHDR序列的名稱

          ● Hdr Sequence SizeHDR序列的長度

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

          ● Exposure:用于當(dāng)前幀的曝光

          ● Gain:用于當(dāng)前幀的增益

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

          image.png 

          11   開啟深度HDRMerge

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

          image.png 

          12 通過序列ID對流進行過濾

          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 結(jié)果

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

          image.png 

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

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

          image.png 

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

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

           

          image.png 

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

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

          image.png 

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

          4. 總結(jié)

          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)閉),即采用高曝光和低曝光幀以滿足特定算法需求。


          <blockquote id="76sxc"></blockquote>
          <cite id="76sxc"><track id="76sxc"></track></cite>
          <legend id="76sxc"></legend>

        1. <blockquote id="76sxc"><p id="76sxc"></p></blockquote>
          <sub id="76sxc"><p id="76sxc"></p></sub>

                夜夜撸夜夜操 | 偷拍日韩欧美婷婷五月天 | 美女看黄色 | A片在线观看网站 | 国内丰满少妇猛烈精品播 | 日本在线黄色视频 | 逼毛片| 国产在线一卡 | 亭亭色导航 | 屁屁插亚洲 |