30#include "rtabmap/core/rtabmap_core_export.h"
31#include "rtabmap/core/Parameters.h"
33#include <opencv2/core/core.hpp>
34#if CV_MAJOR_VERSION < 5
35#include <opencv2/features2d/features2d.hpp>
37#include <opencv2/features.hpp>
39#include <pcl/point_cloud.h>
40#include <pcl/point_types.h>
57 int getMatchCountMinAccepted()
const {
return _matchCountMinAccepted;}
58 double getRansacParam1()
const {
return _ransacParam1;}
59 double getRansacParam2()
const {
return _ransacParam2;}
61 void setMatchCountMinAccepted(
int matchCountMinAccepted) {_matchCountMinAccepted = matchCountMinAccepted;}
62 void setRansacParam1(
double ransacParam1) {_ransacParam1 = ransacParam1;}
63 void setRansacParam2(
double ransacParam2) {_ransacParam2 = ransacParam2;}
68 static void findEpipolesFromF(
69 const cv::Mat & fundamentalMatrix,
73 static cv::Mat findPFromE(
80 static cv::Mat findFFromWords(
81 const std::list<std::pair<
int, std::pair<cv::KeyPoint, cv::KeyPoint> > > & pairs,
82 std::vector<uchar> & status,
83 double ransacReprojThreshold = 3.0,
84 double ransacConfidence = 0.99);
87 static void findRTFromP(
92 static cv::Mat findFFromCalibratedStereoCameras(
double fx,
double fy,
double cx,
double cy,
double Tx,
double Ty);
101 const std::map<int, T> & wordsA,
102 const std::map<int, T> & wordsB,
103 std::list<std::pair<
int, std::pair<T, T> > > & pairs,
104 bool ignoreNegativeIds =
true)
106 int realPairsCount = 0;
108 for(
typename std::map<int, T>::const_iterator i=wordsA.begin(); i!=wordsA.end(); ++i)
110 if(!ignoreNegativeIds || (ignoreNegativeIds && i->first>=0))
112 std::map<int, cv::KeyPoint>::const_iterator ptB = wordsB.find(i->first);
113 if(ptB != wordsB.end())
115 pairs.push_back(std::pair<
int, std::pair<T, T> >(i->first, std::make_pair(i->second, ptB->second)));
120 return realPairsCount;
129 const std::multimap<int, T> & wordsA,
130 const std::multimap<int, T> & wordsB,
131 std::list<std::pair<
int, std::pair<T, T> > > & pairs,
132 bool ignoreNegativeIds =
true)
135 typename std::multimap<int, T>::const_iterator iterA;
136 typename std::multimap<int, T>::const_iterator iterB;
138 int realPairsCount = 0;
139 for(std::list<int>::const_iterator i=ids.begin(); i!=ids.end(); ++i)
141 if(!ignoreNegativeIds || (ignoreNegativeIds && *i >= 0))
143 iterA = wordsA.find(*i);
144 iterB = wordsB.find(*i);
145 while(iterA != wordsA.end() && iterB != wordsB.end() && (*iterA).first == (*iterB).first && (*iterA).first == *i)
147 pairs.push_back(std::pair<
int, std::pair<T, T> >(*i, std::make_pair((*iterA).second, (*iterB).second)));
154 return realPairsCount;
163 const std::multimap<int, T> & wordsA,
164 const std::multimap<int, T> & wordsB,
165 std::list<std::pair<
int, std::pair<T, T> > > & pairs,
166 bool ignoreNegativeIds =
true)
169 int realPairsCount = 0;
171 for(std::list<int>::const_iterator i=ids.begin(); i!=ids.end(); ++i)
173 if(!ignoreNegativeIds || (ignoreNegativeIds && *i>=0))
175 std::list<T> ptsA =
uValues(wordsA, *i);
176 std::list<T> ptsB =
uValues(wordsB, *i);
177 if(ptsA.size() == 1 && ptsB.size() == 1)
179 pairs.push_back(std::pair<
int, std::pair<T, T> >(*i, std::pair<T, T>(ptsA.front(), ptsB.front())));
182 else if(ptsA.size()>1 && ptsB.size()>1)
185 realPairsCount += ptsA.size() > ptsB.size() ? ptsB.size() : ptsA.size();
189 return realPairsCount;
198 const std::multimap<int, T> & wordsA,
199 const std::multimap<int, T> & wordsB,
200 std::list<std::pair<
int, std::pair<T, T> > > & pairs,
201 bool ignoreNegativeIds =
true)
205 int realPairsCount = 0;;
206 for(std::list<int>::const_iterator iter=ids.begin(); iter!=ids.end(); ++iter)
208 if(!ignoreNegativeIds || (ignoreNegativeIds && *iter>=0))
210 std::list<T> ptsA =
uValues(wordsA, *iter);
211 std::list<T> ptsB =
uValues(wordsB, *iter);
213 realPairsCount += ptsA.size() > ptsB.size() ? ptsB.size() : ptsA.size();
215 for(
typename std::list<T>::iterator jter=ptsA.begin(); jter!=ptsA.end(); ++jter)
217 for(
typename std::list<T>::iterator kter=ptsB.begin(); kter!=ptsB.end(); ++kter)
219 pairs.push_back(std::pair<
int, std::pair<T, T> >(*iter, std::pair<T, T>(*jter, *kter)));
224 return realPairsCount;
227 static cv::Mat linearLSTriangulation(
233 static cv::Mat iterativeLinearLSTriangulation(
235 const cv::Matx34d & P,
237 const cv::Matx34d & P1);
239 static double triangulatePoints(
240 const cv::Mat& pt_set1,
241 const cv::Mat& pt_set2,
244 pcl::PointCloud<pcl::PointXYZ>::Ptr & pointcloud,
245 std::vector<double> & reproj_errors);
248 int _matchCountMinAccepted;
249 double _ransacParam1;
250 double _ransacParam2;
Wrappers of STL for convenient functions.
std::list< K > uUniqueKeys(const std::multimap< K, V > &mm)
std::vector< V > uValues(const std::multimap< K, V > &mm)
static int findPairsUnique(const std::multimap< int, T > &wordsA, const std::multimap< int, T > &wordsB, std::list< std::pair< int, std::pair< T, T > > > &pairs, bool ignoreNegativeIds=true)
static int findPairs(const std::multimap< int, T > &wordsA, const std::multimap< int, T > &wordsB, std::list< std::pair< int, std::pair< T, T > > > &pairs, bool ignoreNegativeIds=true)
static int findPairs(const std::map< int, T > &wordsA, const std::map< int, T > &wordsB, std::list< std::pair< int, std::pair< T, T > > > &pairs, bool ignoreNegativeIds=true)
static int findPairsAll(const std::multimap< int, T > &wordsA, const std::multimap< int, T > &wordsB, std::list< std::pair< int, std::pair< T, T > > > &pairs, bool ignoreNegativeIds=true)
Represents a node in RTAB-Map's pose graph.
std::map< std::string, std::string > ParametersMap
Parameter keys mapped to their values, as used by every configurable class (see Parameters).