GSoC2011SfM
0.1
Google Summer of Code 2011: Structure from motion
|
00001 00002 #include "StructureEstimator.h" 00003 #include "SequenceAnalyzer.h" 00004 #include "PointOfView.h" 00005 #include "PointsToTrack.h" 00006 #include "Camera.h" 00007 00008 namespace OpencvSfM{ 00009 using std::vector; 00010 using cv::Ptr; 00011 00012 vector<char> StructureEstimator::computeStructure( unsigned int max_error ) 00013 { 00014 vector<char> output_mask; 00015 vector<TrackOfPoints>& tracks = sequence_->getTracks( ); 00016 vector< Ptr< PointsToTrack > > points_to_track = sequence_->getPoints( ); 00017 00018 //for each points: 00019 vector<TrackOfPoints>::size_type key_size = tracks.size( ); 00020 vector<PointOfView>::size_type num_camera = cameras_->size( ); 00021 int idImage=-1, idPoint=-1; 00022 vector<TrackOfPoints>::size_type i; 00023 00024 for ( i=0; i < key_size; i++ ) 00025 { 00026 TrackOfPoints &track = tracks[ i ]; 00027 unsigned int nviews = track.getNbTrack( ); 00028 00029 CV_DbgAssert( nviews <= cameras_->size( ) ); 00030 00031 cv::Vec3d point_final; 00032 double distance=track.triangulateRobust( *cameras_,points_to_track, point_final ); 00033 //double distance=track.triangulateLinear( *cameras_,points_to_track, point_final ); 00034 00035 //tests: 00036 00037 00039 00040 //this is used to take only correct 3D points: 00041 output_mask.push_back( ( distance<max_error ) ); 00042 } 00043 return output_mask; 00044 } 00045 00046 std::vector< TrackOfPoints > StructureEstimator::computeStructure( 00047 const std::vector<int>& list_of_images, unsigned int max_error ) 00048 { 00049 CV_Assert( list_of_images.size( ) > 1 ); 00050 00051 std::vector< TrackOfPoints > points3D; 00052 vector<TrackOfPoints>& tracks = sequence_->getTracks( ); 00053 vector< Ptr< PointsToTrack > > &points_to_track = sequence_->getPoints( ); 00054 00055 //for each points: 00056 vector<TrackOfPoints>::size_type key_size = tracks.size( ); 00057 vector<PointOfView>::size_type num_camera = cameras_->size( ); 00058 int idImage=-1, idPoint=-1; 00059 vector<TrackOfPoints>::size_type i; 00060 vector<int>::size_type images_size =list_of_images.size( ); 00061 00062 for ( i=0; i < key_size; i++ ) 00063 { 00064 TrackOfPoints &track = tracks[ i ]; 00065 int nbLinks = 0; 00066 for( size_t it_img = 0; it_img<images_size ; ++it_img ) 00067 if( track.containImage( list_of_images[ it_img ] ) ) 00068 nbLinks++; 00069 00070 if( nbLinks > 1 ) 00071 { 00072 unsigned int nviews = track.getNbTrack( ); 00073 vector<bool> mask; 00074 for( unsigned int j=0; j<nviews; ++j ) 00075 { 00076 if( std::find( list_of_images.begin( ),list_of_images.end( ), 00077 track.getImageIndex( j ) ) != list_of_images.end( ) ) 00078 mask.push_back( true ); 00079 else 00080 mask.push_back( false ); 00081 } 00082 00083 cv::Vec3d point_final; 00084 double distance=track.triangulateRobust( *cameras_,points_to_track, point_final, 00085 4, mask ); 00086 00087 if( distance<max_error ) 00088 points3D.push_back( track );//only keep correct points 00089 } 00090 00091 } 00092 return points3D; 00093 } 00094 00095 void StructureEstimator::removeOutliersTracks( double max_error, 00096 std::vector< TrackOfPoints >* list_of_tracks ) 00097 { 00098 vector<char> output_mask; 00099 if(list_of_tracks==NULL) 00100 list_of_tracks = &sequence_->getTracks( ); 00101 vector<TrackOfPoints>& tracks = *list_of_tracks; 00102 vector< Ptr< PointsToTrack > > &points_to_track = sequence_->getPoints( ); 00103 00104 //for each points: 00105 vector<TrackOfPoints>::size_type key_size = tracks.size( ); 00106 vector<PointOfView>::size_type num_camera = cameras_->size( ); 00107 int idImage=-1, idPoint=-1; 00108 vector<TrackOfPoints>::size_type i; 00109 00110 for ( i=0; i < key_size; i++ ) 00111 { 00112 TrackOfPoints &track = tracks[ i ]; 00113 unsigned int nviews = track.getNbTrack( ); 00114 00115 CV_DbgAssert( nviews <= cameras_->size( ) ); 00116 00117 cv::Ptr<cv::Vec3d> point_final = track.get3DPosition(); 00118 if(point_final.empty()) 00119 { 00120 cv::Vec3d *pt = new cv::Vec3d; 00121 track.triangulateRobust( *cameras_,points_to_track, *pt ); 00122 point_final = cv::Ptr<cv::Vec3d>( pt ); 00123 } 00124 00125 track.removeOutliers( *cameras_, points_to_track, max_error ); 00126 } 00127 00128 } 00129 }