39 #include <cvsba/cvsba.h> 58 const std::map<int, Transform> & posesIn,
59 const std::multimap<int, Link> & links,
60 const std::map<
int, std::vector<CameraModel> > & models,
61 std::map<int, cv::Point3f> & points3DMap,
62 const std::map<
int, std::map<int, FeatureBA> > & wordReferences,
63 std::set<int> * outliers)
69 std::map<int, Transform> poses(posesIn.lower_bound(1), posesIn.end());
72 cvsba::Sba::Params
params ;
73 params.type = cvsba::Sba::MOTIONSTRUCTURE;
75 params.minError = this->
epsilon();
76 params.fixedIntrinsics = 5;
77 params.fixedDistortion = 5;
79 sba.setParams(params);
81 std::vector<cv::Mat> cameraMatrix(poses.size());
82 std::vector<cv::Mat> R(poses.size());
83 std::vector<cv::Mat>
T(poses.size());
84 std::vector<cv::Mat> distCoeffs(poses.size());
85 std::map<int, int> frameIdToIndex;
87 for(std::map<int, Transform>::const_iterator iter=poses.begin(); iter!=poses.end(); ++iter)
90 std::map<int, CameraModel>::const_iterator iterModel = models.find(iter->first);
91 UASSERT(iterModel != models.end() && iterModel->second.isValidForProjection());
93 frameIdToIndex.insert(std::make_pair(iter->first, oi));
95 cameraMatrix[oi] = iterModel->second.K();
96 if(iterModel->second.D().cols != 5)
98 distCoeffs[oi] = cv::Mat::zeros(1, 5, CV_64FC1);
99 UWARN(
"Camera model %d: Distortion coefficients are not 5, setting all them to 0 (assuming no distortion)", iter->first);
103 distCoeffs[oi] = iterModel->second.D();
106 Transform t = (iter->second * iterModel->second.localTransform()).
inverse();
108 R[oi] = (cv::Mat_<double>(3,3) <<
109 (
double)t.
r11(), (double)t.
r12(), (double)t.
r13(),
110 (double)t.
r21(), (double)t.
r22(), (double)t.
r23(),
111 (double)t.
r31(), (double)t.
r32(), (double)t.
r33());
112 T[oi] = (cv::Mat_<double>(1,3) << (
double)t.
x(), (double)t.
y(), (double)t.
z());
117 cameraMatrix.resize(oi);
120 distCoeffs.resize(oi);
122 UDEBUG(
"points=%d frames=%d", (
int)points3DMap.size(), (int)poses.size());
123 std::vector<cv::Point3f> points(points3DMap.size());
124 std::vector<std::vector<cv::Point2f> > imagePoints(poses.size());
125 std::vector<std::vector<int> > visibility(poses.size());
126 for(
unsigned int i=0; i<poses.size(); ++i)
128 imagePoints[i].resize(wordReferences.size(), cv::Point2f(std::numeric_limits<float>::quiet_NaN(), std::numeric_limits<float>::quiet_NaN()));
129 visibility[i].resize(wordReferences.size(), 0);
132 for(std::map<int, cv::Point3f>::const_iterator kter = points3DMap.begin(); kter!=points3DMap.end(); ++kter)
134 points[i] = kter->second;
136 std::map<int, std::map<int, FeatureBA> >::const_iterator iter = wordReferences.find(kter->first);
137 if(iter != wordReferences.end())
139 for(std::map<int, FeatureBA>::const_iterator jter=iter->second.begin(); jter!=iter->second.end(); ++jter)
141 if(frameIdToIndex.find(jter->first) != frameIdToIndex.end())
143 imagePoints[frameIdToIndex.at(jter->first)][i] = cv::Point2f(jter->second.kpt.pt.x, jter->second.kpt.pt.y);
144 visibility[frameIdToIndex.at(jter->first)][i] = 1;
154 sba.run( points, imagePoints, visibility, cameraMatrix, R,
T, distCoeffs);
156 catch(cv::Exception &
e)
158 UERROR(
"Running SBA... error! %s", e.what());
159 return std::map<int, Transform>();
164 std::map<int, Transform> newPoses = poses;
165 for(std::map<int, Transform>::iterator iter=newPoses.begin(); iter!=newPoses.end(); ++iter)
167 Transform t(R[i].at<double>(0,0), R[i].at<double>(0,1), R[i].at<double>(0,2),
T[i].at<double>(0),
168 R[i].at<double>(1,0), R[i].at<double>(1,1), R[i].at<double>(1,2),
T[i].at<double>(1),
169 R[i].at<double>(2,0), R[i].at<double>(2,1), R[i].at<double>(2,2),
T[i].at<double>(2));
175 t = (models.at(iter->first).localTransform() * t).
inverse();
176 t = iter->second.
inverse() * t;
177 iter->second *= t.
to3DoF();
181 iter->second = (models.at(iter->first).localTransform() * t).
inverse();
189 for(std::map<int, cv::Point3f>::iterator kter = points3DMap.begin(); kter!=points3DMap.end(); ++kter)
191 kter->second = points[i++];
197 UERROR(
"RTAB-Map is not built with cvsba!");
198 return std::map<int, Transform>();
GLM_FUNC_DECL genType e()
Basic mathematics functions.
Some conversion functions.
#define UASSERT(condition)
Wrappers of STL for convenient functions.
static ULogger::Level level()
ULogger class and convenient macros.
virtual std::map< int, Transform > optimizeBA(int rootId, const std::map< int, Transform > &poses, const std::multimap< int, Link > &links, const std::map< int, std::vector< CameraModel > > &models, std::map< int, cv::Point3f > &points3DMap, const std::map< int, std::map< int, FeatureBA > > &wordReferences, std::set< int > *outliers=0)
GLM_FUNC_DECL matType< T, P > inverse(matType< T, P > const &m)