RM新时代网站

推薦后處理濾波列表

1. 快速開(kāi)始

#include <libobsensor/ObSensor.hpp>

 

ob::Pipeline pipe;

auto device = pipe.getDevice();

 

// 第 1 步:獲取目標 Sensor(以深度流為例)

auto sensor = device->getSensor(OB_SENSOR_DEPTH);

 

// 第 2 步:獲取推薦 Filter 列表

auto filters = sensor->createRecommendedFilters();

 

// 第 3 步:檢查是否有推薦 Filter

if(filters.empty()) {

    std::cout << "該 Sensor 不支持推薦后處理,直接使用原始幀即可。" << std::endl;

    return 0;

}

 

// 第 4 步:查看各 Filter 的初始啟用狀態(tài)

for(auto &filter : filters) {

    std::cout << filter->getName()

              << " : " << (filter->isEnabled() ? "enabled" : "disabled")

              << std::endl;

}

 

// 第 5 步:?jiǎn)?dòng)數據流

std::shared_ptr<ob::Config> config = std::make_shared<ob::Config>();

config->enableVideoStream(OB_STREAM_DEPTH);

pipe.start(config);

 

while(true) {

    auto frameSet = pipe.waitForFrameset(100);

    if(!frameSet) continue;

 

    auto depthFrame = frameSet->getFrame(OB_FRAME_DEPTH);

    if(!depthFrame) continue;

 

    // 第 6 步:依次應用啟用的 Filter

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

    for(auto &filter : filters) {

        if(filter->isEnabled()) {

            auto result = filter->process(outFrame);

            if(result) outFrame = result;

        }

    }

    // outFrame 是處理后的深度幀

}

? 注意:推薦 Filter 列表與獲取它的 Sensor 流類(lèi)型綁定,只能處理對應類(lèi)型的幀。例如從深度 Sensor 獲取的推薦列表只能處理深度幀,傳入其他類(lèi)型幀會(huì )導致處理失敗或返回 `nullptr`。

 

2. 查看、調整推薦列表

第一步:查看推薦 Filter 列表

auto filters = sensor->createRecommendedFilters();

std::cout << "推薦 Filter 列表(共 " << filters.size() << " 個(gè)):" << std::endl;

for(auto &filter : filters) {

    std::cout << "  - " << filter->getName()

              << "  [" << (filter->isEnabled() ? "enabled" : "disabled") << "]"

              << std::endl;

}

第二步:查看某個(gè) Filter 的可調參數

確定目標 Filter 后,通過(guò) getConfigSchemaVec() 查看它支持哪些參數及其范圍、默認值:

字段

說(shuō)明

name

參數名稱(chēng)

type

參數類(lèi)型("int" / "float" / "bool")

min

最小值

max

最大值

step

步長(cháng)

def

默認值

desc

參數描述

// 以 TemporalFilter 為例,查看其可調參數

for(auto &filter : filters) {

    if(filter->getName() == "TemporalFilter") {

        for(auto &item : filter->getConfigSchemaVec()) {

            std::cout << "  " << item.name

                      << "  類(lèi)型=" << item.type

                      << "  范圍=[" << item.min << ", " << item.max << "]"

                      << "  步長(cháng)=" << item.step

                      << "  默認=" << item.def

                      << std::endl;

        }

        break;

    }

}

第三步:讀取當前參數值

getConfigSchemaVec() 返回的是參數的靜態(tài)定義(范圍、默認值),getConfigValue() 返回的是當前運行時(shí)實(shí)際生效的值。

for(auto &filter : filters) {

    if(filter->getName() == "TemporalFilter") {

        double diffScale = filter->getConfigValue("diff_scale");

        double weight    = filter->getConfigValue("weight");

        std::cout << "diff_scale=" << diffScale

                  << "  weight=" << weight << std::endl;

        break;

    }

}

第四步:修改參數

方式一:通用方式(推薦)——適合運行時(shí)動(dòng)態(tài)調整,無(wú)需關(guān)心 Filter 的具體類(lèi)型:

for(auto &filter : filters) {

    if(filter->getName() == "TemporalFilter") {

        filter->setConfigValue("diff_scale", 0.1);

        filter->setConfigValue("weight", 0.4);

        break;

    }

}

方式二:強類(lèi)型方式——用 is<T>() 判斷類(lèi)型,as<T>() 轉型為子類(lèi),調用專(zhuān)屬 API,IDE 有補全:

for(auto &filter : filters) {

    if(filter->is<ob::TemporalFilter>()) {

        auto temporalFilter = filter->as<ob::TemporalFilter>();

        temporalFilter->setDiffScale(0.1f);

        temporalFilter->setWeight(0.4f);

    }

}

第五步:?jiǎn)⒂?/ 禁用某個(gè) Filter

for(auto &filter : filters) {

    if(filter->getName() == "TemporalFilter") {

        filter->enable(false);  // 臨時(shí)禁用時(shí)序濾波

    }

}

注意事項

? 推薦列表中每個(gè) Filter 的參數默認值是 SDK 針對當前連接設備的最優(yōu)配置,直接使用通??色@得較好效果。

? 如需恢復默認值,重新調用 sensor->createRecommendedFilters() 即可,參數會(huì )重置為設備默認值。

 

3. 不同 Sensor 返回不同列表

? 注意:推薦 Filter 列表與獲取它的 Sensor 流類(lèi)型綁定,列表中的 Filter 只能處理該 Sensor 對應流類(lèi)型的幀。請確保傳給 Filter 的幀類(lèi)型與 Sensor 流類(lèi)型一致。詳情請參見(jiàn) 3.1 節注意事項。

不同流類(lèi)型的 Sensor 返回不同的 Filter 列表:深度 Sensor 返回深度專(zhuān)用 Filter,彩色 Sensor 返回彩色專(zhuān)用 Filter。

// 深度流推薦 Filter

auto depthSensor  = device->getSensor(OB_SENSOR_DEPTH);

auto depthFilters = depthSensor->createRecommendedFilters();

 

// 彩色流推薦 Filter

auto colorSensor  = device->getSensor(OB_SENSOR_COLOR);

auto colorFilters = colorSensor->createRecommendedFilters();

不同設備型號返回的列表內容也不同。請務(wù)必通過(guò) filter->getName() 按名稱(chēng)查找目標 Filter,不要用索引硬編碼。

// 正確做法:按名稱(chēng)查找

for(auto &filter : filters) {

    if(filter->getName() == "ThresholdFilter") { /* ... */ }

}

 

// 錯誤做法:硬編碼索引(不同設備順序可能不同)

// auto thresholdFilter = filters[2];  // 不要這樣用

推薦列表為空,說(shuō)明該 Sensor 的數據流不支持推薦后處理,直接使用原始幀即可。


4. 對比與選擇建議


直接創(chuàng )建 Filter

推薦 Filter 列表

上手難度

需了解各 Filter 用途和參數

無(wú)需了解細節,開(kāi)箱即用

參數配置

手動(dòng)設置,完全可控

設備最優(yōu)默認值,按需微調

設備兼容

需自行確認當前設備是否支持目標 Filter

SDK   自動(dòng)只返回當前設備支持的 Filter

Filter   選擇

完全自主選擇

由 SDK 根據設備型號決定

默認參數

需手動(dòng)設置合適值

已是當前設備的最優(yōu)配置

典型場(chǎng)景

產(chǎn)品定制、算法調優(yōu)

快速集成、通用 Demo

 

選擇建議

? 如果你是第一次使用,或者只是想快速看到效果,使用推薦 Filter 列表,幾行代碼即可跑通。

? 如果你需要選擇特定的 Filter 組合,或者對參數有精確要求,使用直接創(chuàng )建 Filter。

? 兩種方式可以混合使用:先通過(guò)推薦列表了解設備支持哪些 Filter,再按需直接創(chuàng )建并精細調參。


RM新时代网站