34 #include <Eigen/Geometry>
47 CHECK_GE(min_tri_angle, 0);
48 min_tri_angle_ = min_tri_angle;
52 residual_type_ = residual_type;
56 const std::vector<X_t>& point_data,
57 const std::vector<Y_t>& pose_data)
const {
58 CHECK_GE(point_data.size(), 2);
59 CHECK_EQ(point_data.size(), pose_data.size());
61 if (point_data.size() == 2) {
65 pose_data[0].proj_matrix, pose_data[1].proj_matrix,
66 point_data[0].point_normalized, point_data[1].point_normalized);
71 pose_data[1].proj_center,
72 xyz) >= min_tri_angle_) {
73 return std::vector<M_t>{xyz};
78 std::vector<Eigen::Matrix3x4d> proj_matrices;
79 proj_matrices.reserve(point_data.size());
80 std::vector<Eigen::Vector2d>
points;
81 points.reserve(point_data.size());
82 for (
size_t i = 0; i < point_data.size(); ++i) {
83 proj_matrices.push_back(pose_data[i].proj_matrix);
84 points.push_back(point_data[i].point_normalized);
90 for (
const auto& pose : pose_data) {
92 return std::vector<M_t>();
97 for (
size_t i = 0; i < pose_data.size(); ++i) {
98 for (
size_t j = 0; j < i; ++j) {
100 pose_data[i].proj_center, pose_data[j].proj_center, xyz);
101 if (tri_angle >= min_tri_angle_) {
102 return std::vector<M_t>{xyz};
108 return std::vector<M_t>();
112 const std::vector<Y_t>& pose_data,
114 std::vector<double>* residuals)
const {
115 CHECK_EQ(point_data.size(), pose_data.size());
117 residuals->resize(point_data.size());
119 for (
size_t i = 0; i < point_data.size(); ++i) {
122 point_data[i].point, xyz, pose_data[i].proj_matrix,
123 *pose_data[i].camera);
126 point_data[i].point_normalized, xyz, pose_data[i].proj_matrix);
127 (*residuals)[i] = angular_error * angular_error;
134 const std::vector<TriangulationEstimator::PointData>& point_data,
135 const std::vector<TriangulationEstimator::PoseData>& pose_data,
136 std::vector<char>* inlier_mask, Eigen::Vector3d* xyz) {
137 CHECK_NOTNULL(inlier_mask);
139 CHECK_GE(point_data.size(), 2);
140 CHECK_EQ(point_data.size(), pose_data.size());
149 ransac.local_estimator.SetMinTriAngle(options.
min_tri_angle);
150 ransac.local_estimator.SetResidualType(options.
residual_type);
151 const auto report = ransac.Estimate(point_data, pose_data);
152 if (!report.success) {
156 *inlier_mask = report.inlier_mask;
159 return report.success;
void Residuals(const std::vector< X_t > &point_data, const std::vector< Y_t > &pose_data, const M_t &xyz, std::vector< double > *residuals) const
void SetResidualType(const ResidualType residual_type)
void SetMinTriAngle(const double min_tri_angle)
std::vector< M_t > Estimate(const std::vector< X_t > &point_data, const std::vector< Y_t > &pose_data) const
double CalculateSquaredReprojectionError(const Eigen::Vector2d &point2D, const Eigen::Vector3d &point3D, const Eigen::Vector4d &qvec, const Eigen::Vector3d &tvec, const Camera &camera)
bool EstimateTriangulation(const EstimateTriangulationOptions &options, const std::vector< TriangulationEstimator::PointData > &point_data, const std::vector< TriangulationEstimator::PoseData > &pose_data, std::vector< char > *inlier_mask, Eigen::Vector3d *xyz)
bool HasPointPositiveDepth(const Eigen::Matrix3x4d &proj_matrix, const Eigen::Vector3d &point3D)
Eigen::Vector3d TriangulateMultiViewPoint(const std::vector< Eigen::Matrix3x4d > &proj_matrices, const std::vector< Eigen::Vector2d > &points)
Eigen::Vector3d TriangulatePoint(const Eigen::Matrix3x4d &proj_matrix1, const Eigen::Matrix3x4d &proj_matrix2, const Eigen::Vector2d &point1, const Eigen::Vector2d &point2)
double CalculateNormalizedAngularError(const Eigen::Vector2d &point2D, const Eigen::Vector3d &point3D, const Eigen::Vector4d &qvec, const Eigen::Vector3d &tvec)
double CalculateTriangulationAngle(const Eigen::Vector3d &proj_center1, const Eigen::Vector3d &proj_center2, const Eigen::Vector3d &point3D)
RANSACOptions ransac_options
TriangulationEstimator::ResidualType residual_type