GSoC2011SfM  0.1
Google Summer of Code 2011: Structure from motion
D:/Travail/These/Determination caracteristiques camera/GSoC/SfM/src/StructureEstimator.cpp
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 }
 All Classes Functions Variables