RM新时代网站

快速創(chuàng )建一個(gè)后處理濾波

1. 快速開(kāi)始

以 ThresholdFilter 為例,3 步完成一次后處理:

#include <libobsensor/ObSensor.hpp>

 

// 第 1 步:創(chuàng )建 Filter

auto thresholdFilter = std::make_shared<ob::ThresholdFilter>();

 

// 第 2 步:設置參數(只保留 300mm~3000mm 范圍內的深度值)

thresholdFilter->setValueRange(300, 3000);

 

// 第 3 步:處理幀(depthFrame 來(lái)自 Pipeline 獲取的 FrameSet)

auto outFrame = thresholdFilter->process(depthFrame);

if(outFrame) {

    auto processedDepth = outFrame->as<ob::DepthFrame>();

    // 使用 processedDepth ...

}

 

2. 串聯(lián)多個(gè) Filter

多個(gè) Filter 可以依次串聯(lián),將上一個(gè) Filter 的輸出作為下一個(gè) Filter 的輸入。

串聯(lián)順序(深度流)

格式轉換(FormatConvertFilter)

  → 降采樣(DecimationFilter)

    → 序列篩選(SequenceIdFilter)

      → 閾值過(guò)濾(ThresholdFilter)

        → 降噪(EdgeNoiseRemovalFilter/FalsePositiveFilter/

             MgcNoiseRemovalFilter/LutNoiseRemovalFilter)

          → 空間平滑(SpatialAdvancedFilter/SpatialFastFilter/

                 SpatialModerateFilter)

            → 時(shí)序平滑(TemporalFilter)

              → 填孔(HoleFillingFilter)

                → 軟件對齊(Align)

                  → 點(diǎn)云(PointCloudFilter)

? 注意:斜杠(/)表示同一階段可選其一,根據設備型號和場(chǎng)景需求選擇。使用時(shí)保持各 Filter 的相對順序不變,調整順序可能產(chǎn)生非預期的效果。

代碼示例(以閾值過(guò)濾 → 降噪 → 空間平滑 → 軟件對齊 → 點(diǎn)云為例):

auto thresholdFilter = std::make_shared<ob::ThresholdFilter>();

thresholdFilter->setValueRange(300, 3000);

thresholdFilter->enable(true);

 

auto edgeFilter = std::make_shared<ob::EdgeNoiseRemovalFilter>();

edgeFilter->enable(true);

 

auto spatialFilter = std::make_shared<ob::SpatialAdvancedFilter>();

spatialFilter->enable(true);

 

auto alignFilter = std::make_shared<ob::Align>(OB_STREAM_COLOR);

alignFilter->enable(true);

 

auto pointCloudFilter = std::make_shared<ob::PointCloudFilter>();

pointCloudFilter->setCreatePointFormat(OB_FORMAT_RGB_POINT);

pointCloudFilter->enable(true);

 

// 每幀處理應在獨立線(xiàn)程中進(jìn)行,不要在獲取幀數據的線(xiàn)程或回調線(xiàn)程中直接調用

if(!frameSet) return;

auto depthFrame = frameSet->getFrame(OB_FRAME_DEPTH);

auto colorFrame = frameSet->getFrame(OB_FRAME_COLOR);

if(!depthFrame || !colorFrame) return;

 

std::shared_ptr<ob::Frame> outFrame = frameSet;

for(auto &filter : std::vector<std::shared_ptr<ob::Filter>>{

        thresholdFilter, edgeFilter, spatialFilter,

        alignFilter, pointCloudFilter}) {

    if(outFrame) {

        outFrame = filter->process(outFrame);

    }

}

// outFrame 是經(jīng)過(guò)完整處理鏈后的點(diǎn)云幀

 

3. 其他常用接口

// 關(guān)閉 Filter

filter->enable(false);

// 開(kāi)啟 Filter

filter->enable(true);

 

// 查詢(xún)當前是否啟用

bool enabled = filter->isEnabled();

 

RM新时代网站