From 454085391e96f61ef58f8a06eeea6d7ec7bd2660 Mon Sep 17 00:00:00 2001 From: lbgos <285507185+lbgos@users.noreply.github.com> Date: Tue, 13 Oct 2026 01:34:05 +0300 Subject: [PATCH] rift_s: use native Hamming LSH for uncached room queries --- src/xrt/drivers/rift_s/rift_s_world_anchor.cpp | 11 +++-------- .../drivers/rift_s/rift_s_world_anchor_knn_cache.h | 3 ++- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/src/xrt/drivers/rift_s/rift_s_world_anchor.cpp b/src/xrt/drivers/rift_s/rift_s_world_anchor.cpp index 6c6833395..0ce76131d 100644 --- a/src/xrt/drivers/rift_s/rift_s_world_anchor.cpp +++ b/src/xrt/drivers/rift_s/rift_s_world_anchor.cpp @@ -2,6 +2,7 @@ // SPDX-License-Identifier: BSL-1.0 #include "rift_s_world_anchor.h" #include "rift_s_world_anchor_knn_cache.h" +#include "rift_s_world_matcher.hpp" #include "util/u_json.h" #include "util/u_logging.h" #include @@ -860,7 +861,7 @@ struct rift_s_world_anchor bool index_dirty = true; std::vector indexed_world; cv::Mat indexed_descriptors[2]; - cv::Ptr index[2]; + std::unique_ptr index[2]; // Bounded exact memo of knnMatch 4-neighbor lists per bank. Cleared on every index // rebuild and whenever the map is replaced/cleared/reloaded (see index_dirty sites). rift_s_knn_memo::ExactKnnMemo knn_cache[2]; @@ -1420,13 +1421,7 @@ build_index(rift_s_world_anchor &a) for (const auto &point : k.points) std::memcpy(a.indexed_descriptors[bank].ptr(int(row++)), point.descriptors[bank].data(), 32); - if (a.indexed_world.size() > 2000) - a.index[bank] = - cv::makePtr(cv::makePtr(12, 20, 2)); - else - a.index[bank] = cv::makePtr(cv::NORM_HAMMING); - a.index[bank]->add(std::vector{a.indexed_descriptors[bank]}); - a.index[bank]->train(); + a.index[bank] = std::make_unique(a.indexed_descriptors[bank]); } a.index_dirty = false; } diff --git a/src/xrt/drivers/rift_s/rift_s_world_anchor_knn_cache.h b/src/xrt/drivers/rift_s/rift_s_world_anchor_knn_cache.h index 07daec56b..b80d3a44c 100644 --- a/src/xrt/drivers/rift_s/rift_s_world_anchor_knn_cache.h +++ b/src/xrt/drivers/rift_s/rift_s_world_anchor_knn_cache.h @@ -138,8 +138,9 @@ public: // Exact memoized knnMatch with k == kNeighbors. On any unexpected query layout the // call falls back to a direct uncached knnMatch so behavior never changes. + template void - knnMatch(cv::DescriptorMatcher &matcher, + knnMatch(Matcher &matcher, const cv::Mat &query, std::vector> &out, int k = kNeighbors)