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