From eaf69a764488b451635d16fe21322b40e81c5691 Mon Sep 17 00:00:00 2001 From: Long Vuong Date: Mon, 26 Feb 2024 17:34:42 +0100 Subject: [PATCH] update with upstream --- corelib/src/Features2d.cpp | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/corelib/src/Features2d.cpp b/corelib/src/Features2d.cpp index 36e340c6a4..add45c75cc 100644 --- a/corelib/src/Features2d.cpp +++ b/corelib/src/Features2d.cpp @@ -741,13 +741,13 @@ std::vector Feature2D::generateKeypoints(const cv::Mat & image, co if(roi.x || roi.y) { // Adjust keypoint position to raw image - for(std::vector::iterator iter=sub_keypoints.begin(); iter!=sub_keypoints.end(); ++iter) + for(std::vector::iterator iter=subKeypoints.begin(); iter!=subKeypoints.end(); ++iter) { iter->pt.x += roi.x; iter->pt.y += roi.y; } } - keypoints.insert( keypoints.end(), sub_keypoints.begin(), sub_keypoints.end() ); + keypoints.insert( keypoints.end(), subKeypoints.begin(), subKeypoints.end() ); } } UDEBUG("Keypoints extraction time = %f s, keypoints extracted = %d (grid=%dx%d, mask empty=%d)", @@ -2122,6 +2122,24 @@ std::vector ORBOctree::generateKeypointsImpl(const cv::Mat & image (*_orb)(imgRoi, maskRoi, keypoints, descriptors_); + // OrbOctree ignores the mask, so we have to apply it manually here + if(!keypoints.empty() && !maskRoi.empty()) + { + std::vector validKeypoints; + validKeypoints.reserve(keypoints.size()); + cv::Mat validDescriptors; + for(size_t i=0; i(keypoints[i].pt.y+roi.y, keypoints[i].pt.x+roi.x) != 0) + { + validKeypoints.push_back(keypoints[i]); + validDescriptors.push_back(descriptors_.row(i)); + } + } + keypoints = validKeypoints; + descriptors_ = validDescriptors; + } + if((int)keypoints.size() > this->getMaxFeatures()) { limitKeypoints(keypoints, descriptors_, this->getMaxFeatures());