以 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 ...
}
多個(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)云幀
// 關(guān)閉 Filter
filter->enable(false);
// 開(kāi)啟 Filter
filter->enable(true);
// 查詢(xún)當前是否啟用
bool enabled = filter->isEnabled();