1e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/* 2e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Copyright (C) 2011 The Android Open Source Project 3e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * 4e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Licensed under the Apache License, Version 2.0 (the "License"); 5e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * you may not use this file except in compliance with the License. 6e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * You may obtain a copy of the License at 7e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * 8e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * http://www.apache.org/licenses/LICENSE-2.0 9e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * 10e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Unless required by applicable law or agreed to in writing, software 11e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * distributed under the License is distributed on an "AS IS" BASIS, 12e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * See the License for the specific language governing permissions and 14e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * limitations under the License. 15e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */ 16e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 17e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen// $Id: dbregtest.cpp,v 1.24 2011/06/17 14:04:33 mbansal Exp $ 18e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#include "stdafx.h" 19e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#include "PgmImage.h" 20e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#include "../dbreg/dbreg.h" 21e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#include "../dbreg/dbstabsmooth.h" 22e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#include <db_utilities_camera.h> 23e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 24e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#include <iostream> 25e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#include <iomanip> 26e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 27e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#if PROFILE 28e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen #include <sys/time.h> 29e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#endif 30e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 31e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 32e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenusing namespace std; 33e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 34e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenconst int DEFAULT_NR_CORNERS=500; 35e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenconst double DEFAULT_MAX_DISPARITY=0.2; 36e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenconst int DEFAULT_MOTION_MODEL=DB_HOMOGRAPHY_TYPE_AFFINE; 37e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen//const int DEFAULT_MOTION_MODEL=DB_HOMOGRAPHY_TYPE_R_T; 38e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen//const int DEFAULT_MOTION_MODEL=DB_HOMOGRAPHY_TYPE_TRANSLATION; 39e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenconst bool DEFAULT_QUARTER_RESOLUTION=false; 40e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenconst unsigned int DEFAULT_REFERENCE_UPDATE_PERIOD=3; 41e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenconst bool DEFAULT_DO_MOTION_SMOOTHING = false; 42e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenconst double DEFAULT_MOTION_SMOOTHING_GAIN = 0.75; 43e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenconst bool DEFAULT_LINEAR_POLISH = false; 44e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenconst int DEFAULT_MAX_ITERATIONS = 10; 45e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 46e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenvoid usage(string name) { 47e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 48e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen const char *helpmsg[] = { 49e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen "Function: point-based frame to reference registration.", 50e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen " -m [rt,a,p] : motion model, rt = rotation+translation, a = affine (default = affine).", 51e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen " -c <int> : number of corners (default 1000).", 52e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen " -d <double>: search disparity as portion of image size (default 0.1).", 53e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen " -q : quarter the image resolution (i.e. half of each dimension) (default on)", 54e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen " -r <int> : the period (in nr of frames) for reference frame updates (default = 5)", 55e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen " -s <0/1> : motion smoothing (1 activates motion smoothing, 0 turns it off - default value = 1)", 56e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen " -g <double>: motion smoothing gain, only used if smoothing is on (default value =0.75)", 57e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen NULL 58e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen }; 59e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 60e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen cerr << "Usage: " << name << " [options] image_list.txt" << endl; 61e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 62e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen const char **p = helpmsg; 63e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 64e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen while (*p) 65e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen { 66e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen cerr << *p++ << endl; 67e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen } 68e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen} 69e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 70e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenvoid parse_cmd_line(stringstream& cmdline, 71e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen const int argc, 72e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen const string& progname, 73e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen string& image_list_file_name, 74e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen int& nr_corners, 75e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen double& max_disparity, 76e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen int& motion_model_type, 77e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen bool& quarter_resolution, 78e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen unsigned int& reference_update_period, 79e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen bool& do_motion_smoothing, 80e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen double& motion_smoothing_gain 81e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen ); 82e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 83e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenint main(int argc, char* argv[]) 84e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{ 85e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen int nr_corners = DEFAULT_NR_CORNERS; 86e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen double max_disparity = DEFAULT_MAX_DISPARITY; 87e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen int motion_model_type = DEFAULT_MOTION_MODEL; 88e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen bool quarter_resolution = DEFAULT_QUARTER_RESOLUTION; 89e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 90e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen unsigned int reference_update_period = DEFAULT_REFERENCE_UPDATE_PERIOD; 91e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 92e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen bool do_motion_smoothing = DEFAULT_DO_MOTION_SMOOTHING; 93e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen double motion_smoothing_gain = DEFAULT_MOTION_SMOOTHING_GAIN; 94e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen const bool DEFAULT_USE_SMALLER_MATCHING_WINDOW = true; 95e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 96e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen int default_nr_samples = DB_DEFAULT_NR_SAMPLES/5; 97e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 98e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen bool use_smaller_matching_window = DEFAULT_USE_SMALLER_MATCHING_WINDOW; 99e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 100e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 101e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen bool linear_polish = DEFAULT_LINEAR_POLISH; 102e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 103e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen if (argc < 2) { 104e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen usage(argv[0]); 105e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen exit(1); 106e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen } 107e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 108e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen stringstream cmdline; 109e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen string progname(argv[0]); 110e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen string image_list_file_name; 111e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 112e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#if PROFILE 113e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen timeval ts1, ts2, ts3, ts4; 114e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#endif 115e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 116e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen // put the options and image list file name into the cmdline stringstream 117e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen for (int c = 1; c < argc; c++) 118e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen { 119e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen cmdline << argv[c] << " "; 120e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen } 121e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 122e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen parse_cmd_line(cmdline, argc, progname, image_list_file_name, nr_corners, max_disparity, motion_model_type,quarter_resolution,reference_update_period,do_motion_smoothing,motion_smoothing_gain); 123e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 124e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen ifstream in(image_list_file_name.c_str(),ios::in); 125e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 126e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen if ( !in.is_open() ) 127e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen { 128e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen cerr << "Could not open file " << image_list_file_name << ". Exiting" << endl; 129e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 130e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen return false; 131e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen } 132e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 133e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen // feature-based image registration class: 134e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen db_FrameToReferenceRegistration reg; 135e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen// db_StabilizationSmoother stab_smoother; 136e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 137e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen // input file name: 138e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen string file_name; 139e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 140e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen // look-up tables for image warping: 141e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen float ** lut_x = NULL, **lut_y = NULL; 142e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 143e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen // if the images are color, the input is saved in color_ref: 144e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen PgmImage color_ref(0,0); 145e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 146e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen // image width, height: 147e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen int w,h; 148e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 149e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen int frame_number = 0; 150e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 151e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen while ( !in.eof() ) 152e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen { 153e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen getline(in,file_name); 154e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 155e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen PgmImage ref(file_name); 156e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 157e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen if ( ref.GetDataPointer() == NULL ) 158e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen { 159e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen cerr << "Could not open image" << file_name << ". Exiting." << endl; 160e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen return -1; 161e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen } 162e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 163e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen cout << ref << endl; 164e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 165e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen // color format: 166e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen int format = ref.GetFormat(); 167e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 168e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen // is the input image color?: 169e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen bool color = format == PgmImage::PGM_BINARY_PIXMAP; 170e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 171e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen w = ref.GetWidth(); 172e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen h = ref.GetHeight(); 173e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 174e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen if ( !reg.Initialized() ) 175e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen { 176e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen reg.Init(w,h,motion_model_type,DEFAULT_MAX_ITERATIONS,linear_polish,quarter_resolution,DB_POINT_STANDARDDEV,reference_update_period,do_motion_smoothing,motion_smoothing_gain,default_nr_samples,DB_DEFAULT_CHUNK_SIZE,nr_corners,max_disparity,use_smaller_matching_window); 177e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen lut_x = db_AllocImage_f(w,h); 178e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen lut_y = db_AllocImage_f(w,h); 179e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 180e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen } 181e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 182e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen if ( color ) 183e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen { 184e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen // save the color image: 185e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen color_ref = ref; 186e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen } 187e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 188e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen // make a grayscale image: 189e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen ref.ConvertToGray(); 190e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 191e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen // compute the homography: 192e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen double H[9],Hinv[9]; 193e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen db_Identity3x3(Hinv); 194e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen db_Identity3x3(H); 195e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 196e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen bool force_reference = false; 197e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 198e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#if PROFILE 199e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen gettimeofday(&ts1, NULL); 200e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#endif 201e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 202e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen reg.AddFrame(ref.GetRowPointers(),H,false,false); 203e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen cout << reg.profile_string << std::endl; 204e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 205e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#if PROFILE 206e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen gettimeofday(&ts2, NULL); 207e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 208e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen double elapsedTime = (ts2.tv_sec - ts1.tv_sec)*1000.0; // sec to ms 209e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen elapsedTime += (ts2.tv_usec - ts1.tv_usec)/1000.0; // us to ms 210e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen cout <<"\nelapsedTime for Reg<< "<<elapsedTime<<" ms >>>>>>>>>>>>>\n"; 211e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#endif 212e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 213e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen if (frame_number == 0) 214e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen { 215e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen reg.UpdateReference(ref.GetRowPointers()); 216e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen } 217e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 218e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 219e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen //std::vector<int> &inlier_indices = reg.GetInliers(); 220e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen int *inlier_indices = reg.GetInliers(); 221e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen int num_inlier_indices = reg.GetNrInliers(); 222e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen printf("[%d] #Inliers = %d\n",frame_number,num_inlier_indices); 223e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 224e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen reg.Get_H_dref_to_ins(H); 225e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 226e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen db_GenerateHomographyLut(lut_x,lut_y,w,h,H); 227e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 228e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen // create a new image and warp: 229e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen PgmImage warped(w,h,format); 230e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 231e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#if PROFILE 232e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen gettimeofday(&ts3, NULL); 233e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#endif 234e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 235e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen if ( color ) 236e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen db_WarpImageLutBilinear_rgb(color_ref.GetRowPointers(),warped.GetRowPointers(),w,h,lut_x,lut_y); 237e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen else 238e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen db_WarpImageLut_u(ref.GetRowPointers(),warped.GetRowPointers(),w,h,lut_x,lut_y,DB_WARP_FAST); 239e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 240e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#if PROFILE 241e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen gettimeofday(&ts4, NULL); 242e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen elapsedTime = (ts4.tv_sec - ts3.tv_sec)*1000.0; // sec to ms 243e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen elapsedTime += (ts4.tv_usec - ts3.tv_usec)/1000.0; // us to ms 244e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen cout <<"\nelapsedTime for Warp <<"<<elapsedTime<<" ms >>>>>>>>>>>>>\n"; 245e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#endif 246e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 247e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen // write aligned image: name is aligned_<corresponding input file name> 248e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen stringstream s; 249e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen s << "aligned_" << file_name; 250e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen warped.WritePGM(s.str()); 251e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 252e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen /* 253e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen // Get the reference and inspection corners to write to file 254e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen double *ref_corners = reg.GetRefCorners(); 255e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen double *ins_corners = reg.GetInsCorners(); 256e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 257e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen // get the image file name (without extension), so we 258e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen // can generate the corresponding filenames for matches 259e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen // and inliers 260e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen string file_name_root(file_name.substr(0,file_name.rfind("."))); 261e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 262e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen // write matches to file 263e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen s.str(string("")); 264e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen s << "Matches_" << file_name_root << ".txt"; 265e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 266e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen ofstream match_file(s.str().c_str()); 267e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 268e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen for (int i = 0; i < reg.GetNrMatches(); i++) 269e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen { 270e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen match_file << ref_corners[3*i] << " " << ref_corners[3*i+1] << " " << ins_corners[3*i] << " " << ins_corners[3*i+1] << endl; 271e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen } 272e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 273e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen match_file.close(); 274e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 275e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen // write the inlier matches to file 276e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen s.str(string("")); 277e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen s << "InlierMatches_" << file_name_root << ".txt"; 278e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 279e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen ofstream inlier_match_file(s.str().c_str()); 280e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 281e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen for(int i=0; i<num_inlier_indices; i++) 282e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen { 283e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen int k = inlier_indices[i]; 284e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen inlier_match_file << ref_corners[3*k] << " " 285e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen << ref_corners[3*k+1] << " " 286e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen << ins_corners[3*k] << " " 287e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen << ins_corners[3*k+1] << endl; 288e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen } 289e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen inlier_match_file.close(); 290e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */ 291e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 292e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen frame_number++; 293e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen } 294e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 295e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen if ( reg.Initialized() ) 296e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen { 297e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen db_FreeImage_f(lut_x,h); 298e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen db_FreeImage_f(lut_y,h); 299e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen } 300e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 301e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen return 0; 302e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen} 303e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 304e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenvoid parse_cmd_line(stringstream& cmdline, 305e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen const int argc, 306e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen const string& progname, 307e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen string& image_list_file_name, 308e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen int& nr_corners, 309e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen double& max_disparity, 310e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen int& motion_model_type, 311e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen bool& quarter_resolution, 312e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen unsigned int& reference_update_period, 313e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen bool& do_motion_smoothing, 314e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen double& motion_smoothing_gain) 315e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{ 316e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen // for counting down the parsed arguments. 317e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen int c = argc; 318e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 319e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen // a holder 320e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen string token; 321e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 322e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen while (cmdline >> token) 323e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen { 324e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen --c; 325e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 326e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen int pos = token.find("-"); 327e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 328e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen if (pos == 0) 329e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen { 330e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen switch (token[1]) 331e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen { 332e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen case 'm': 333e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen --c; cmdline >> token; 334e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen if (token.compare("rt") == 0) 335e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen { 336e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen motion_model_type = DB_HOMOGRAPHY_TYPE_R_T; 337e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen } 338e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen else if (token.compare("a") == 0) 339e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen { 340e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen motion_model_type = DB_HOMOGRAPHY_TYPE_AFFINE; 341e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen } 342e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen else if (token.compare("p") == 0) 343e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen { 344e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen motion_model_type = DB_HOMOGRAPHY_TYPE_PROJECTIVE; 345e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen } 346e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen else 347e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen { 348e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen usage(progname); 349e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen exit(1); 350e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen } 351e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen break; 352e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen case 'c': 353e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen --c; cmdline >> nr_corners; 354e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen break; 355e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen case 'd': 356e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen --c; cmdline >> max_disparity; 357e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen break; 358e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen case 'q': 359e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen quarter_resolution = true; 360e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen break; 361e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen case 'r': 362e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen --c; cmdline >> reference_update_period; 363e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen break; 364e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen case 's': 365e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen --c; cmdline >> do_motion_smoothing; 366e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen break; 367e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen case 'g': 368e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen --c; cmdline >> motion_smoothing_gain; 369e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen break; 370e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen default: 371e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen cerr << progname << "illegal option " << token << endl; 372e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen case 'h': 373e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen usage(progname); 374e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen exit(1); 375e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen break; 376e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen } 377e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen } 378e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen else 379e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen { 380e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen if (c != 1) 381e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen { 382e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen usage(progname); 383e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen exit(1); 384e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen } 385e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen else 386e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen { 387e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen --c; 388e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen image_list_file_name = token; 389e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen } 390e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen } 391e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen } 392e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 393e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen if (c != 0) 394e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen { 395e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen usage(progname); 396e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen exit(1); 397e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen } 398e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen} 399e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 400