Skip to content

Commit 02697d3

Browse files
committed
Removed a bug in the MultiRansac which caused it to stop too early and with not enough inliers.
1 parent f52f401 commit 02697d3

File tree

3 files changed

+27
-24
lines changed

3 files changed

+27
-24
lines changed

include/opengv/sac/implementation/MultiRansac.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ opengv::sac::MultiRansac<PROBLEM_T>::computeModel(
107107

108108
size_t multiSelectionSize = 0;
109109
for( size_t multiIter = 0; multiIter < selection.size(); multiIter++ )
110-
multiSelectionSize += selection.size();
110+
multiSelectionSize += selection[multiIter].size();
111111

112112
// Compute the k parameter (k=log(z)/log(1-w^n))
113113
double w = static_cast<double> (n_best_inliers_count) /
@@ -143,7 +143,7 @@ opengv::sac::MultiRansac<PROBLEM_T>::computeModel(
143143
multiModelSize += model_[modelIter].size();
144144
fprintf(stdout,
145145
"[sm::RandomSampleConsensus::computeModel] Model: %zu size, %d inliers.\n",
146-
model_.size(), n_best_inliers_count );
146+
multiModelSize, n_best_inliers_count );
147147
}
148148

149149
if(model_.empty())

src/sac_problems/relative_pose/MultiNoncentralRelativePoseSacProblem.cpp

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,7 @@ opengv::sac_problems::relative_pose::MultiNoncentralRelativePoseSacProblem::
251251
opengv::sac_problems::relative_pose::CentralRelativePoseSacProblem
252252
centralProblem(_adapter, algorithm);
253253
returnValue = centralProblem.computeModelCoefficients(
254-
_adapter.convertMultiIndices(indices),outModel);
254+
_adapter.convertMultiIndices(indices),outModel);
255255

256256
//The transformation has been computed from cam to cam now, so transform
257257
//that into the body frame
@@ -281,30 +281,30 @@ opengv::sac_problems::relative_pose::
281281

282282
for( size_t camIndex = 0; camIndex < indices.size(); camIndex++ )
283283
{
284+
translation_t cam1Offset = _adapter.getCamOffset(camIndex);
285+
rotation_t cam1Rotation = _adapter.getCamRotation(camIndex);
286+
translation_t cam2Offset = _adapter.getCamOffset(camIndex);
287+
rotation_t cam2Rotation = _adapter.getCamRotation(camIndex);
288+
289+
translation_t directTranslation =
290+
cam1Rotation.transpose() *
291+
((translation - cam1Offset) + rotation * cam2Offset);
292+
rotation_t directRotation =
293+
cam1Rotation.transpose() * rotation * cam2Rotation;
294+
295+
_adapter.sett12(directTranslation);
296+
_adapter.setR12(directRotation);
297+
298+
transformation_t inverseSolution;
299+
inverseSolution.block<3,3>(0,0) = directRotation.transpose();
300+
inverseSolution.col(3) =
301+
-inverseSolution.block<3,3>(0,0)*directTranslation;
302+
284303
for(
285304
size_t correspondenceIndex = 0;
286305
correspondenceIndex < indices[camIndex].size();
287306
correspondenceIndex++ )
288307
{
289-
translation_t cam1Offset = _adapter.getCamOffset(camIndex);
290-
rotation_t cam1Rotation = _adapter.getCamRotation(camIndex);
291-
translation_t cam2Offset = _adapter.getCamOffset(camIndex);
292-
rotation_t cam2Rotation = _adapter.getCamRotation(camIndex);
293-
294-
translation_t directTranslation =
295-
cam1Rotation.transpose() *
296-
((translation - cam1Offset) + rotation * cam2Offset);
297-
rotation_t directRotation =
298-
cam1Rotation.transpose() * rotation * cam2Rotation;
299-
300-
_adapter.sett12(directTranslation);
301-
_adapter.setR12(directRotation);
302-
303-
transformation_t inverseSolution;
304-
inverseSolution.block<3,3>(0,0) = directRotation.transpose();
305-
inverseSolution.col(3) =
306-
-inverseSolution.block<3,3>(0,0)*directTranslation;
307-
308308
p_hom.block<3,1>(0,0) =
309309
opengv::triangulation::triangulate2(
310310
_adapter,

test/test_relative_pose_sac.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@
3838
#include <opengv/relative_pose/CentralRelativeAdapter.hpp>
3939
#include <opengv/sac/Ransac.hpp>
4040
#include <opengv/sac_problems/relative_pose/CentralRelativePoseSacProblem.hpp>
41+
#include <opengv/relative_pose/NoncentralRelativeMultiAdapter.hpp>
42+
#include <opengv/sac/MultiRansac.hpp>
43+
#include <opengv/sac_problems/relative_pose/MultiNoncentralRelativePoseSacProblem.hpp>
4144
#include <sstream>
4245
#include <fstream>
4346

@@ -110,7 +113,7 @@ int main( int argc, char** argv )
110113
sac_problems::relative_pose::CentralRelativePoseSacProblem> relposeproblem_ptr(
111114
new sac_problems::relative_pose::CentralRelativePoseSacProblem(
112115
adapter,
113-
sac_problems::relative_pose::CentralRelativePoseSacProblem::NISTER));
116+
sac_problems::relative_pose::CentralRelativePoseSacProblem::STEWENIUS));
114117
ransac.sac_model_ = relposeproblem_ptr;
115118
ransac.threshold_ = 2.0*(1.0 - cos(atan(sqrt(2.0)*0.5/800.0)));
116119
ransac.max_iterations_ = 50;
@@ -123,7 +126,7 @@ int main( int argc, char** argv )
123126
gettimeofday( &toc, 0 );
124127
double ransac_time = TIMETODOUBLE(timeval_minus(toc,tic));
125128

126-
//print results
129+
//print results for ransac 1
127130
std::cout << "the ransac threshold is: " << ransac.threshold_ << std::endl;
128131
std::cout << "the ransac results is: " << std::endl;
129132
std::cout << ransac.model_coefficients_ << std::endl << std::endl;

0 commit comments

Comments
 (0)