60 const std::vector<Observation::Ptr>& matches)
75 double error_tolerance) {
84 if (error <= error_tolerance)
93 CHECK_NOTNULL(observation.get());
98 CHECK_NOTNULL(landmark.get());
101 Point3D point = landmark->Position();
104 double u = 0.0, v = 0.0;
105 const bool in_camera =
110 return std::numeric_limits<double>::infinity();
113 double delta_u = u - feature.u_;
114 double delta_v = v - feature.v_;
115 double error = delta_u*delta_u + delta_v*delta_v;
133 unsigned int num_samples) {
136 std::random_shuffle(
data_.begin(),
data_.end());
139 if (static_cast<size_t>(num_samples) >
data_.size()) {
140 VLOG(1) <<
"Requested more RANSAC data samples than are available. "
141 <<
"Returning all data.";
142 num_samples =
data_.size();
146 std::vector<Observation::Ptr> samples(
147 data_.begin(),
data_.begin() +
static_cast<size_t>(num_samples));
154 unsigned int num_sampled_previously)
const {
157 if (num_sampled_previously >=
data_.size()) {
158 VLOG(1) <<
"No remaining RANSAC data to sample.";
159 return std::vector<Observation::Ptr>();
162 return std::vector<Observation::Ptr>(
163 data_.begin() + num_sampled_previously,
data_.end());
168 const std::vector<Observation::Ptr>& input_data)
const {
173 points_2d.reserve(input_data.size());
174 points_3d.reserve(input_data.size());
176 for (
const auto& observation : input_data) {
177 CHECK_NOTNULL(observation.get());
180 points_2d.push_back(observation->Feature());
184 CHECK_NOTNULL(landmark.get());
185 points_3d.push_back(landmark->Position());
193 Pose calculated_pose;
194 if (!solver.
Solve(calculated_pose)) {
195 VLOG(1) <<
"Could not estimate a pose using the PnP solver. "
196 <<
"Assuming identity pose.";
std::shared_ptr< Observation > Ptr
bool WorldToImage(double wx, double wy, double wz, double *u_distorted, double *v_distorted) const
virtual std::vector< Observation::Ptr > SampleData(unsigned int num_samples)
std::vector< Point3D > Point3DList
virtual bool IsGoodFit(const Observation::Ptr &observation, double error_tolerance)
virtual PnPRansacModel FitModel(const std::vector< Observation::Ptr > &input_data) const
bool Initialize(const FeatureList &points_2d, const Point3DList &points_3d, const CameraIntrinsics &intrinsics)
bool Solve(Pose &camera_pose)
double EvaluateReprojectionError(const Observation::Ptr &observation) const
void SetIntrinsics(CameraIntrinsics &intrinsics)
virtual double Error() const
virtual ~PnPRansacProblem()
CameraIntrinsics intrinsics_
std::vector< Feature > FeatureList
std::vector< Observation::Ptr > data_
virtual ~PnPRansacModel()
std::shared_ptr< Landmark > Ptr
virtual std::vector< Observation::Ptr > RemainingData(unsigned int num_sampled_previously) const