Go to the documentation of this file.00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 #include <iostream>
00030 #include <string>
00031 #include <vector>
00032 #include <stdint.h>
00033 
00034 #include <viso_stereo.h>
00035 #include <png++/png.hpp>
00036 
00037 using namespace std;
00038 
00039 int main (int argc, char** argv) {
00040 
00041   
00042   if (argc<2) {
00043     cerr << "Usage: ./viso2 path/to/sequence/2010_03_09_drive_0019" << endl;
00044     return 1;
00045   }
00046 
00047   
00048   string dir = argv[1];
00049   
00050   
00051   
00052   VisualOdometryStereo::parameters param;
00053   
00054   
00055   param.calib.f  = 645.24; 
00056   param.calib.cu = 661.96; 
00057   param.calib.cv = 194.13; 
00058   param.base     = 0.5707; 
00059   
00060   
00061   VisualOdometryStereo viso(param);
00062   
00063   
00064   
00065   Matrix pose = Matrix::eye(4);
00066     
00067   
00068   for (int32_t i=0; i<373; i++) {
00069 
00070     
00071     char base_name[256]; sprintf(base_name,"%06d.png",i);
00072     string left_img_file_name  = dir + "/I1_" + base_name;
00073     string right_img_file_name = dir + "/I2_" + base_name;
00074     
00075     
00076     try {
00077 
00078       
00079       png::image< png::gray_pixel > left_img(left_img_file_name);
00080       png::image< png::gray_pixel > right_img(right_img_file_name);
00081 
00082       
00083       int32_t width  = left_img.get_width();
00084       int32_t height = left_img.get_height();
00085 
00086       
00087       uint8_t* left_img_data  = (uint8_t*)malloc(width*height*sizeof(uint8_t));
00088       uint8_t* right_img_data = (uint8_t*)malloc(width*height*sizeof(uint8_t));
00089       int32_t k=0;
00090       for (int32_t v=0; v<height; v++) {
00091         for (int32_t u=0; u<width; u++) {
00092           left_img_data[k]  = left_img.get_pixel(u,v);
00093           right_img_data[k] = right_img.get_pixel(u,v);
00094           k++;
00095         }
00096       }
00097 
00098       
00099       cout << "Processing: Frame: " << i;
00100       
00101       
00102       int32_t dims[] = {width,height,width};
00103       if (viso.process(left_img_data,right_img_data,dims)) {
00104       
00105         
00106         pose = pose * Matrix::inv(viso.getMotion());
00107       
00108         
00109         double num_matches = viso.getNumberOfMatches();
00110         double num_inliers = viso.getNumberOfInliers();
00111         cout << ", Matches: " << num_matches;
00112         cout << ", Inliers: " << 100.0*num_inliers/num_matches << " %" << ", Current pose: " << endl;
00113         cout << pose << endl << endl;
00114 
00115       } else {
00116         cout << " ... failed!" << endl;
00117       }
00118 
00119       
00120       free(left_img_data);
00121       free(right_img_data);
00122 
00123     
00124     } catch (...) {
00125       cerr << "ERROR: Couldn't read input files!" << endl;
00126       return 1;
00127     }
00128   }
00129   
00130   
00131   cout << "Demo complete! Exiting ..." << endl;
00132 
00133   
00134   return 0;
00135 }
00136