diff --git a/corelib/src/Signature.cpp b/corelib/src/Signature.cpp index ee08ab6804..3e4f491f0c 100644 --- a/corelib/src/Signature.cpp +++ b/corelib/src/Signature.cpp @@ -221,17 +221,37 @@ void Signature::removeVirtualLinks() float Signature::compareTo(const Signature & s) const { + UASSERT(this->sensorData().globalDescriptors().size() == s.sensorData().globalDescriptors().size()); + float similarity = 0.0f; - const std::multimap & words = s.getWords(); + int totalDescs = 0; + + for(size_t i=0; isensorData().globalDescriptors().size(); ++i) + { + if(this->sensorData().globalDescriptors()[i].type()==1 && s.sensorData().globalDescriptors()[i].type()==1) + { + similarity += this->sensorData().globalDescriptors()[i].data().dot(s.sensorData().globalDescriptors()[i].data()); + totalDescs += 1; + } + } - if(!s.isBadSignature() && !this->isBadSignature()) + if(totalDescs) { - std::list > > pairs; - int totalWords = ((int)_words.size()-_invalidWordsCount)>((int)words.size()-s.getInvalidWordsCount())?((int)_words.size()-_invalidWordsCount):((int)words.size()-s.getInvalidWordsCount()); - UASSERT(totalWords > 0); - EpipolarGeometry::findPairs(words, _words, pairs); + similarity /= totalDescs; + } + else + { + const std::multimap & words = s.getWords(); - similarity = float(pairs.size()) / float(totalWords); + if(!s.isBadSignature() && !this->isBadSignature()) + { + std::list > > pairs; + int totalWords = ((int)_words.size()-_invalidWordsCount)>((int)words.size()-s.getInvalidWordsCount())?((int)_words.size()-_invalidWordsCount):((int)words.size()-s.getInvalidWordsCount()); + UASSERT(totalWords > 0); + EpipolarGeometry::findPairs(words, _words, pairs); + + similarity = float(pairs.size()) / float(totalWords); + } } return similarity; }