Merge branch 'master' of github.com:introlab/rtabmap into gtest

This commit is contained in:
matlabbe
2026-06-01 21:04:32 -07:00
4 changed files with 40 additions and 14 deletions
+11 -2
View File
@@ -887,8 +887,17 @@ cv::Mat Feature2D::generateDescriptors(
UASSERT(!image.empty()); UASSERT(!image.empty());
UASSERT(image.type() == CV_8UC1); UASSERT(image.type() == CV_8UC1);
descriptors = generateDescriptorsImpl(image, keypoints); descriptors = generateDescriptorsImpl(image, keypoints);
UASSERT_MSG(descriptors.rows == (int)keypoints.size(), uFormat("descriptors=%d, keypoints=%d", descriptors.rows, (int)keypoints.size()).c_str()); if(descriptors.rows != (int)keypoints.size())
UDEBUG("Descriptors extracted = %d, remaining kpts=%d", descriptors.rows, (int)keypoints.size()); {
UWARN("Descriptor extraction returned %d rows for %d keypoints — "
"clearing keypoints to keep them in sync.",
descriptors.rows, (int)keypoints.size());
keypoints.clear();
descriptors = cv::Mat();
}
else {
UDEBUG("Descriptors extracted = %d, remaining kpts=%d", descriptors.rows, (int)keypoints.size());
}
} }
return descriptors; return descriptors;
} }
+7 -4
View File
@@ -113,11 +113,14 @@ ParametersMap Parameters::deserialize(const std::string & parameters)
std::list<std::string> tuplets = uSplit(parameters, ';'); std::list<std::string> tuplets = uSplit(parameters, ';');
for(std::list<std::string>::iterator iter=tuplets.begin(); iter!=tuplets.end(); ++iter) for(std::list<std::string>::iterator iter=tuplets.begin(); iter!=tuplets.end(); ++iter)
{ {
std::list<std::string> p = uSplit(*iter, ':'); // Split on the FIRST ':' only. Using uSplit() here would discard
if(p.size() == 2) // empty tokens, so a tuplet like "Marker/Lengths:" (legitimate empty
// string value) would lose the value side and be dropped entirely.
size_t colonPos = iter->find(':');
if(colonPos != std::string::npos && colonPos > 0)
{ {
std::string key = p.front(); std::string key = iter->substr(0, colonPos);
std::string value = p.back(); std::string value = iter->substr(colonPos + 1);
// look for old parameter name // look for old parameter name
bool addParameter = true; bool addParameter = true;
+8 -3
View File
@@ -144,7 +144,12 @@ std::vector<cv::KeyPoint> SPDetector::detect(const cv::Mat &img, const cv::Mat &
UASSERT(img.type() == CV_8UC1); UASSERT(img.type() == CV_8UC1);
UASSERT(mask.empty() || (mask.type() == CV_8UC1 && img.cols == mask.cols && img.rows == mask.rows)); UASSERT(mask.empty() || (mask.type() == CV_8UC1 && img.cols == mask.cols && img.rows == mask.rows));
detected_ = false; detected_ = false;
if(model_) if(!model_)
{
UERROR("No model is loaded!");
return std::vector<cv::KeyPoint>();
}
try
{ {
torch::NoGradGuard no_grad_guard; torch::NoGradGuard no_grad_guard;
auto x = torch::from_blob(img.data, {1, 1, img.rows, img.cols}, torch::kByte); auto x = torch::from_blob(img.data, {1, 1, img.rows, img.cols}, torch::kByte);
@@ -199,9 +204,9 @@ std::vector<cv::KeyPoint> SPDetector::detect(const cv::Mat &img, const cv::Mat &
detected_ = true; detected_ = true;
return keypoints; return keypoints;
} }
else catch(const std::exception & e)
{ {
UERROR("No model is loaded!"); UERROR("SPDetector::detect() threw: %s", e.what());
return std::vector<cv::KeyPoint>(); return std::vector<cv::KeyPoint>();
} }
} }
+14 -5
View File
@@ -153,6 +153,15 @@ int main(int argc, char * argv[])
#endif #endif
int padding = 35; int padding = 35;
std::cout << ("Parameters (Yellow=modified, Red=old parameter not used anymore, NA=not in database):\n"); std::cout << ("Parameters (Yellow=modified, Red=old parameter not used anymore, NA=not in database):\n");
auto displayValue = [](const std::string & key, const std::string & v) -> std::string {
// Quote string-typed parameters so empty values are visible and
// whitespace-padded values aren't misread as missing.
if(Parameters::getType(key) == "string")
{
return std::string("\"") + v + "\"";
}
return v;
};
for(ParametersMap::iterator iter=parameters.begin(); iter!=parameters.end(); ++iter) for(ParametersMap::iterator iter=parameters.begin(); iter!=parameters.end(); ++iter)
{ {
ParametersMap::const_iterator jter = defaultParameters.find(iter->first); ParametersMap::const_iterator jter = defaultParameters.find(iter->first);
@@ -195,7 +204,7 @@ int main(int argc, char * argv[])
#else #else
printf("%s", COLOR_YELLOW); printf("%s", COLOR_YELLOW);
#endif #endif
std::cout << (uFormat("%s%s (%s=%s)\n", uPad(iter->first + "=", padding).c_str(), iter->second.c_str(), otherDatabasePath.empty()?"default":otherDatabasePathName.c_str(), defaultValue.c_str())); std::cout << (uFormat("%s%s (%s=%s)\n", uPad(iter->first + "=", padding).c_str(), displayValue(iter->first, iter->second).c_str(), otherDatabasePath.empty()?"default":otherDatabasePathName.c_str(), displayValue(iter->first, defaultValue).c_str()));
} }
else if(!diff) else if(!diff)
{ {
@@ -205,7 +214,7 @@ int main(int argc, char * argv[])
#else #else
printf("%s", COLOR_NORMAL); printf("%s", COLOR_NORMAL);
#endif #endif
std::cout << (uFormat("%s%s\n", uPad(iter->first + "=", padding).c_str(), iter->second.c_str())); std::cout << (uFormat("%s%s\n", uPad(iter->first + "=", padding).c_str(), displayValue(iter->first, iter->second).c_str()));
} }
} }
else if(!defaultValueSet) else if(!defaultValueSet)
@@ -216,7 +225,7 @@ int main(int argc, char * argv[])
#else #else
printf("%s", COLOR_RED); printf("%s", COLOR_RED);
#endif #endif
std::cout << (uFormat("%s%s (%s=NA)\n", uPad(iter->first + "=", padding).c_str(), iter->second.c_str(), otherDatabasePath.empty()?"default":otherDatabasePathName.c_str())); std::cout << (uFormat("%s%s (%s=NA)\n", uPad(iter->first + "=", padding).c_str(), displayValue(iter->first, iter->second).c_str(), otherDatabasePath.empty()?"default":otherDatabasePathName.c_str()));
} }
else if(!diff) else if(!diff)
{ {
@@ -226,7 +235,7 @@ int main(int argc, char * argv[])
#else #else
printf("%s", COLOR_NORMAL); printf("%s", COLOR_NORMAL);
#endif #endif
std::cout << (uFormat("%s%s\n", uPad(iter->first + "=", padding).c_str(), iter->second.c_str())); std::cout << (uFormat("%s%s\n", uPad(iter->first + "=", padding).c_str(), displayValue(iter->first, iter->second).c_str()));
} }
#ifdef _WIN32 #ifdef _WIN32
SetConsoleTextAttribute(H,COLOR_NORMAL); SetConsoleTextAttribute(H,COLOR_NORMAL);
@@ -246,7 +255,7 @@ int main(int argc, char * argv[])
#else #else
printf("%s", COLOR_RED); printf("%s", COLOR_RED);
#endif #endif
std::cout << (uFormat("%sNA (%s=\"%s\")\n", uPad(iter->first + "=", padding).c_str(), otherDatabasePath.empty()?"default":otherDatabasePathName.c_str(), iter->second.c_str())); std::cout << (uFormat("%sNA (%s=%s)\n", uPad(iter->first + "=", padding).c_str(), otherDatabasePath.empty()?"default":otherDatabasePathName.c_str(), displayValue(iter->first, iter->second).c_str()));
#ifdef _WIN32 #ifdef _WIN32
SetConsoleTextAttribute(H,COLOR_NORMAL); SetConsoleTextAttribute(H,COLOR_NORMAL);