#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`。
第一步:查看推薦 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ì )重置為設備默認值。
? 注意:推薦 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 的數據流不支持推薦后處理,直接使用原始幀即可。
直接創(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 )建并精細調參。