Fixed GUI crash when using rectified RGB only (with odometry). Fixed empty local map when loading a fixed local map for OdometryF2M.

This commit is contained in:
matlabbe
2016-11-25 19:52:34 -05:00
parent da1cac1e55
commit 693f623e5e
6 changed files with 23 additions and 66 deletions

View File

@@ -98,10 +98,11 @@ OdometryF2M::OdometryF2M(const ParametersMap & parameters) :
{
UERROR("Error initializing the memory for BOW Odometry.");
}
else
else if(memory.getLastWorkingSignature())
{
// get the graph
std::map<int, int> ids = memory.getNeighborsId(memory.getLastSignatureId(), 0, -1);
std::map<int, int> ids = memory.getNeighborsId(memory.getLastWorkingSignature()->id(), 0, -1);
UDEBUG("ids=%d", (int)ids.size());
std::map<int, Transform> poses;
std::multimap<int, Link> links;
memory.getMetricConstraints(uKeysSet(ids), poses, links, true);
@@ -113,6 +114,8 @@ OdometryF2M::OdometryF2M(const ParametersMap & parameters) :
std::map<int, Transform> optimizedPoses = optimizer->optimize(poses.begin()->first, poses, links);
delete optimizer;
UDEBUG("optimizedPoses=%d", (int)optimizedPoses.size());
std::multimap<int, cv::Point3f> words3D;
std::multimap<int, cv::Mat> wordsDescriptors;
@@ -124,6 +127,7 @@ OdometryF2M::OdometryF2M(const ParametersMap & parameters) :
const Signature * s = memory.getSignature(posesIter->first);
if(s)
{
UDEBUG("%d has %d words", posesIter->first, (int)s->getWords3().size());
// Transform 3D points accordingly to pose and add them to local map
for(std::multimap<int, cv::Point3f>::const_iterator pointsIter=s->getWords3().begin();
pointsIter!=s->getWords3().end();
@@ -148,6 +152,7 @@ OdometryF2M::OdometryF2M(const ParametersMap & parameters) :
}
}
UASSERT(words3D.size() == wordsDescriptors.size());
UDEBUG("words3D=%d", (int)words3D.size());
map_->setWords3(words3D);
map_->setWordsDescriptors(wordsDescriptors);
}

View File

@@ -776,7 +776,11 @@ void Parameters::writeINI(const std::string & configFile, const ParametersMap &
{
std::string key = (*i).first;
key = uReplaceChar(key, '/', '\\'); // Ini files use \ by default for separators, so replace the /
ini.SetValue("Core", key.c_str(), (*i).second.c_str(), NULL, true);
std::string value = (*i).second.c_str();
value = uReplaceChar(value, '\\', '/'); // use always slash for values
ini.SetValue("Core", key.c_str(), value.c_str(), NULL, true);
}
ini.SaveFile(configFile.c_str());

View File

@@ -552,7 +552,7 @@ Transform RegistrationVis::computeTransformationImpl(
// create 3D keypoints
std::vector<cv::Point3f> kptsFrom3D;
std::vector<cv::Point3f> kptsTo3D;
if(fromSignature.getWords3().empty() || kptsFrom.size() != fromSignature.getWords3().size())
if(fromSignature.getWords3().empty() || (kptsFrom.size() && kptsFrom.size() != fromSignature.getWords3().size()))
{
if(fromSignature.getWords3().size() && kptsFrom.size() != fromSignature.getWords3().size())
{
@@ -890,9 +890,9 @@ Transform RegistrationVis::computeTransformationImpl(
// match between all descriptors
VWDictionary dictionary(_featureParameters);
std::list<int> fromWordIds;
for(unsigned int i=0; i<kptsFrom.size(); ++i)
for (unsigned int i = 0; i < descriptorsFrom.rows; ++i)
{
int id = orignalWordsFromIds.size()?orignalWordsFromIds[i]:i;
int id = orignalWordsFromIds.size() ? orignalWordsFromIds[i] : i;
dictionary.addWord(new VisualWord(id, descriptorsFrom.row(i), 1));
fromWordIds.push_back(id);
}
@@ -915,7 +915,10 @@ Transform RegistrationVis::computeTransformationImpl(
{
if(fromWordIdsSet.count(*iter) == 1)
{
wordsFrom.insert(std::make_pair(*iter, kptsFrom[i]));
if (kptsFrom.size())
{
wordsFrom.insert(std::make_pair(*iter, kptsFrom[i]));
}
if(kptsFrom3D.size())
{
words3From.insert(std::make_pair(*iter, kptsFrom3D[i]));