82 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C++
		
	
	
		
		
			
		
	
	
			82 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C++
		
	
	
| 
								 | 
							
								/* ----------------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								 * GTSAM Copyright 2010, Georgia Tech Research Corporation,
							 | 
						||
| 
								 | 
							
								 * Atlanta, Georgia 30332-0415
							 | 
						||
| 
								 | 
							
								 * All Rights Reserved
							 | 
						||
| 
								 | 
							
								 * Authors: Frank Dellaert, et al. (see THANKS for the full author list)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								 * See LICENSE for the license information
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								 * -------------------------------------------------------------------------- */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @file triangulation.cpp
							 | 
						||
| 
								 | 
							
								 * @brief Functions for triangulation
							 | 
						||
| 
								 | 
							
								 * @author Chris Beall
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <gtsam_unstable/geometry/triangulation.h>
							 | 
						||
| 
								 | 
							
								#include <gtsam/geometry/SimpleCamera.h>
							 | 
						||
| 
								 | 
							
								#include <boost/foreach.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/assign.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/assign/std/vector.hpp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								using namespace std;
							 | 
						||
| 
								 | 
							
								using namespace boost::assign;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace gtsam {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* ************************************************************************* */
							 | 
						||
| 
								 | 
							
								// See Hartley and Zisserman, 2nd Ed., page 312
							 | 
						||
| 
								 | 
							
								Point3 triangulateDLT(const vector<Matrix>& projection_matrices,
							 | 
						||
| 
								 | 
							
								    const vector<Point2>& measurements) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Matrix A = Matrix_(projection_matrices.size() *2, 4);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  for(size_t i=0; i< projection_matrices.size(); i++) {
							 | 
						||
| 
								 | 
							
								    size_t row = i*2;
							 | 
						||
| 
								 | 
							
								    const Matrix& projection = projection_matrices.at(i);
							 | 
						||
| 
								 | 
							
								    const Point2& p = measurements.at(i);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // build system of equations
							 | 
						||
| 
								 | 
							
								    A.row(row) = p.x() * projection.row(2) - projection.row(0);
							 | 
						||
| 
								 | 
							
								    A.row(row+1) = p.y() * projection.row(2) - projection.row(1);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  int rank;
							 | 
						||
| 
								 | 
							
								  double error;
							 | 
						||
| 
								 | 
							
								  Vector v;
							 | 
						||
| 
								 | 
							
								  boost::tie(rank, error, v) = DLT(A);
							 | 
						||
| 
								 | 
							
								  return Point3(sub( (v / v(3)),0,3));
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* ************************************************************************* */
							 | 
						||
| 
								 | 
							
								boost::optional<Point3> triangulatePoint3(const vector<Pose3>& poses,
							 | 
						||
| 
								 | 
							
								    const vector<Point2>& measurements, const Cal3_S2& K) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  assert(poses.size() == measurements.size());
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if(poses.size() < 2)
							 | 
						||
| 
								 | 
							
								    return boost::none;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  vector<Matrix> projection_matrices;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // construct projection matrices from poses & calibration
							 | 
						||
| 
								 | 
							
								  BOOST_FOREACH(const Pose3& pose, poses)
							 | 
						||
| 
								 | 
							
								    projection_matrices += K.matrix() * sub(pose.inverse().matrix(),0,3,0,4);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Point3 triangulated_point = triangulateDLT(projection_matrices, measurements);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // verify that the triangulated point lies infront of all cameras
							 | 
						||
| 
								 | 
							
								  BOOST_FOREACH(const Pose3& pose, poses) {
							 | 
						||
| 
								 | 
							
								    const Point3& p_local = pose.transform_to(triangulated_point);
							 | 
						||
| 
								 | 
							
								    if(p_local.z() <= 0)
							 | 
						||
| 
								 | 
							
								      return boost::none;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return triangulated_point;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* ************************************************************************* */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								} // namespace gtsam
							 |