14b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng/*
24b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng * Copyright (C) 2011 The Android Open Source Project
34b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng *
44b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng * Licensed under the Apache License, Version 2.0 (the "License");
54b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng * you may not use this file except in compliance with the License.
64b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng * You may obtain a copy of the License at
74b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng *
84b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng *      http://www.apache.org/licenses/LICENSE-2.0
94b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng *
104b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng * Unless required by applicable law or agreed to in writing, software
114b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng * distributed under the License is distributed on an "AS IS" BASIS,
124b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng * See the License for the specific language governing permissions and
144b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng * limitations under the License.
154b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng */
164b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
174b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng// $Id: dbregtest.cpp,v 1.24 2011/06/17 14:04:33 mbansal Exp $
184b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng#include "stdafx.h"
194b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng#include "PgmImage.h"
204b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng#include "../dbreg/dbreg.h"
214b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng#include "../dbreg/dbstabsmooth.h"
224b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng#include <db_utilities_camera.h>
234b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
244b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng#include <iostream>
254b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng#include <iomanip>
264b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
274b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng#if PROFILE
284b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    #include <sys/time.h>
294b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng#endif
304b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
314b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
324b5b3887b9e375a0d0bd5774718375dce4a616aaBen Chengusing namespace std;
334b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
344b5b3887b9e375a0d0bd5774718375dce4a616aaBen Chengconst int DEFAULT_NR_CORNERS=500;
354b5b3887b9e375a0d0bd5774718375dce4a616aaBen Chengconst double DEFAULT_MAX_DISPARITY=0.2;
364b5b3887b9e375a0d0bd5774718375dce4a616aaBen Chengconst int DEFAULT_MOTION_MODEL=DB_HOMOGRAPHY_TYPE_AFFINE;
374b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng//const int DEFAULT_MOTION_MODEL=DB_HOMOGRAPHY_TYPE_R_T;
384b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng//const int DEFAULT_MOTION_MODEL=DB_HOMOGRAPHY_TYPE_TRANSLATION;
394b5b3887b9e375a0d0bd5774718375dce4a616aaBen Chengconst bool DEFAULT_QUARTER_RESOLUTION=false;
404b5b3887b9e375a0d0bd5774718375dce4a616aaBen Chengconst unsigned int DEFAULT_REFERENCE_UPDATE_PERIOD=3;
414b5b3887b9e375a0d0bd5774718375dce4a616aaBen Chengconst bool DEFAULT_DO_MOTION_SMOOTHING = false;
424b5b3887b9e375a0d0bd5774718375dce4a616aaBen Chengconst double DEFAULT_MOTION_SMOOTHING_GAIN = 0.75;
434b5b3887b9e375a0d0bd5774718375dce4a616aaBen Chengconst bool DEFAULT_LINEAR_POLISH = false;
444b5b3887b9e375a0d0bd5774718375dce4a616aaBen Chengconst int DEFAULT_MAX_ITERATIONS = 10;
454b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
464b5b3887b9e375a0d0bd5774718375dce4a616aaBen Chengvoid usage(string name) {
474b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
484b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  const char *helpmsg[] = {
494b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    "Function: point-based frame to reference registration.",
504b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    "  -m [rt,a,p]  : motion model, rt = rotation+translation, a = affine (default = affine).",
514b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    "  -c <int>   : number of corners (default 1000).",
524b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    "  -d <double>: search disparity as portion of image size (default 0.1).",
534b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    "  -q         : quarter the image resolution (i.e. half of each dimension) (default on)",
544b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    "  -r <int>   : the period (in nr of frames) for reference frame updates (default = 5)",
554b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    "  -s <0/1>   : motion smoothing (1 activates motion smoothing, 0 turns it off - default value = 1)",
564b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    "  -g <double>: motion smoothing gain, only used if smoothing is on (default value =0.75)",
574b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    NULL
584b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  };
594b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
604b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  cerr << "Usage: " << name << " [options] image_list.txt" << endl;
614b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
624b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  const char **p = helpmsg;
634b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
644b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  while (*p)
654b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  {
664b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    cerr << *p++ << endl;
674b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  }
684b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng}
694b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
704b5b3887b9e375a0d0bd5774718375dce4a616aaBen Chengvoid parse_cmd_line(stringstream& cmdline,
714b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng            const int argc,
724b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng            const string& progname,
734b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng            string& image_list_file_name,
744b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng            int& nr_corners,
754b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng            double& max_disparity,
764b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng            int& motion_model_type,
774b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng            bool& quarter_resolution,
784b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng            unsigned int& reference_update_period,
794b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng            bool& do_motion_smoothing,
804b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng            double& motion_smoothing_gain
814b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng            );
824b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
834b5b3887b9e375a0d0bd5774718375dce4a616aaBen Chengint main(int argc, char* argv[])
844b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng{
854b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  int    nr_corners = DEFAULT_NR_CORNERS;
864b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  double max_disparity = DEFAULT_MAX_DISPARITY;
874b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  int    motion_model_type = DEFAULT_MOTION_MODEL;
884b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  bool   quarter_resolution = DEFAULT_QUARTER_RESOLUTION;
894b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
904b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  unsigned int reference_update_period = DEFAULT_REFERENCE_UPDATE_PERIOD;
914b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
924b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  bool   do_motion_smoothing = DEFAULT_DO_MOTION_SMOOTHING;
934b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  double motion_smoothing_gain = DEFAULT_MOTION_SMOOTHING_GAIN;
944b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  const bool DEFAULT_USE_SMALLER_MATCHING_WINDOW = true;
954b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
964b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  int default_nr_samples = DB_DEFAULT_NR_SAMPLES/5;
974b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
984b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  bool   use_smaller_matching_window = DEFAULT_USE_SMALLER_MATCHING_WINDOW;
994b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
1004b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
1014b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  bool   linear_polish = DEFAULT_LINEAR_POLISH;
1024b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
1034b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  if (argc < 2) {
1044b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    usage(argv[0]);
1054b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    exit(1);
1064b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  }
1074b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
1084b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  stringstream cmdline;
1094b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  string progname(argv[0]);
1104b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  string image_list_file_name;
1114b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
1124b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng#if PROFILE
1134b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  timeval ts1, ts2, ts3, ts4;
1144b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng#endif
1154b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
1164b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  // put the options and image list file name into the cmdline stringstream
1174b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  for (int c = 1; c < argc; c++)
1184b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  {
1194b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    cmdline << argv[c] << " ";
1204b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  }
1214b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
1224b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  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);
1234b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
1244b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  ifstream in(image_list_file_name.c_str(),ios::in);
1254b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
1264b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  if ( !in.is_open() )
1274b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  {
1284b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    cerr << "Could not open file " << image_list_file_name << ".  Exiting" << endl;
1294b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
1304b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    return false;
1314b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  }
1324b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
1334b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  // feature-based image registration class:
1344b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  db_FrameToReferenceRegistration reg;
1354b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng//  db_StabilizationSmoother stab_smoother;
1364b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
1374b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  // input file name:
1384b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  string file_name;
1394b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
1404b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  // look-up tables for image warping:
1414b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  float ** lut_x = NULL, **lut_y = NULL;
1424b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
1434b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  // if the images are color, the input is saved in color_ref:
1444b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  PgmImage color_ref(0,0);
1454b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
1464b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  // image width, height:
1474b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  int w,h;
1484b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
1494b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  int frame_number = 0;
1504b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
1514b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  while ( !in.eof() )
1524b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  {
1534b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    getline(in,file_name);
1544b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
1554b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    PgmImage ref(file_name);
1564b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
1574b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    if ( ref.GetDataPointer() == NULL )
1584b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    {
1594b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng      cerr << "Could not open image" << file_name << ". Exiting." << endl;
1604b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng      return -1;
1614b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    }
1624b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
1634b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    cout << ref << endl;
1644b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
1654b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    // color format:
1664b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    int format = ref.GetFormat();
1674b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
1684b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    // is the input image color?:
1694b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    bool color = format == PgmImage::PGM_BINARY_PIXMAP;
1704b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
1714b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    w = ref.GetWidth();
1724b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    h = ref.GetHeight();
1734b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
1744b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    if ( !reg.Initialized() )
1754b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    {
1764b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng      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);
1774b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng      lut_x = db_AllocImage_f(w,h);
1784b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng      lut_y = db_AllocImage_f(w,h);
1794b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
1804b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    }
1814b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
1824b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    if ( color )
1834b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    {
1844b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng      // save the color image:
1854b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng      color_ref = ref;
1864b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    }
1874b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
1884b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    // make a grayscale image:
1894b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    ref.ConvertToGray();
1904b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
1914b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    // compute the homography:
1924b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    double H[9],Hinv[9];
1934b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    db_Identity3x3(Hinv);
1944b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    db_Identity3x3(H);
1954b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
1964b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    bool force_reference = false;
1974b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
1984b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng#if PROFILE
1994b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    gettimeofday(&ts1, NULL);
2004b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng#endif
2014b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
2024b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    reg.AddFrame(ref.GetRowPointers(),H,false,false);
2034b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    cout << reg.profile_string << std::endl;
2044b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
2054b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng#if PROFILE
2064b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    gettimeofday(&ts2, NULL);
2074b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
2084b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    double elapsedTime = (ts2.tv_sec - ts1.tv_sec)*1000.0; // sec to ms
2094b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    elapsedTime += (ts2.tv_usec - ts1.tv_usec)/1000.0; // us to ms
2104b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    cout <<"\nelapsedTime for Reg<< "<<elapsedTime<<" ms >>>>>>>>>>>>>\n";
2114b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng#endif
2124b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
2134b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    if (frame_number == 0)
2144b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    {
2154b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng      reg.UpdateReference(ref.GetRowPointers());
2164b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    }
2174b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
2184b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
2194b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    //std::vector<int> &inlier_indices = reg.GetInliers();
2204b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    int *inlier_indices = reg.GetInliers();
2214b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    int num_inlier_indices = reg.GetNrInliers();
2224b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    printf("[%d] #Inliers = %d\n",frame_number,num_inlier_indices);
2234b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
2244b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    reg.Get_H_dref_to_ins(H);
2254b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
2264b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    db_GenerateHomographyLut(lut_x,lut_y,w,h,H);
2274b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
2284b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    // create a new image and warp:
2294b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    PgmImage warped(w,h,format);
2304b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
2314b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng#if PROFILE
2324b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    gettimeofday(&ts3, NULL);
2334b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng#endif
2344b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
2354b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    if ( color )
2364b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng      db_WarpImageLutBilinear_rgb(color_ref.GetRowPointers(),warped.GetRowPointers(),w,h,lut_x,lut_y);
2374b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    else
2384b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng      db_WarpImageLut_u(ref.GetRowPointers(),warped.GetRowPointers(),w,h,lut_x,lut_y,DB_WARP_FAST);
2394b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
2404b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng#if PROFILE
2414b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    gettimeofday(&ts4, NULL);
2424b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    elapsedTime = (ts4.tv_sec - ts3.tv_sec)*1000.0; // sec to ms
2434b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    elapsedTime += (ts4.tv_usec - ts3.tv_usec)/1000.0;     // us to ms
2444b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    cout <<"\nelapsedTime for Warp <<"<<elapsedTime<<" ms >>>>>>>>>>>>>\n";
2454b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng#endif
2464b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
2474b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    // write aligned image: name is aligned_<corresponding input file name>
2484b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    stringstream s;
2494b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    s << "aligned_" << file_name;
2504b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    warped.WritePGM(s.str());
2514b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
2524b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    /*
2534b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    // Get the reference and inspection corners to write to file
2544b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    double *ref_corners = reg.GetRefCorners();
2554b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    double *ins_corners = reg.GetInsCorners();
2564b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
2574b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    // get the image file name (without extension), so we
2584b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    // can generate the corresponding filenames for matches
2594b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    // and inliers
2604b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    string file_name_root(file_name.substr(0,file_name.rfind(".")));
2614b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
2624b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    // write matches to file
2634b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    s.str(string(""));
2644b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    s << "Matches_" << file_name_root << ".txt";
2654b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
2664b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    ofstream  match_file(s.str().c_str());
2674b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
2684b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    for (int i = 0; i < reg.GetNrMatches(); i++)
2694b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    {
2704b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng      match_file << ref_corners[3*i] << " " << ref_corners[3*i+1] << " " << ins_corners[3*i] << " " << ins_corners[3*i+1] << endl;
2714b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    }
2724b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
2734b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    match_file.close();
2744b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
2754b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    // write the inlier matches to file
2764b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    s.str(string(""));
2774b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    s << "InlierMatches_" << file_name_root << ".txt";
2784b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
2794b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    ofstream inlier_match_file(s.str().c_str());
2804b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
2814b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    for(int i=0; i<num_inlier_indices; i++)
2824b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    {
2834b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng      int k = inlier_indices[i];
2844b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng      inlier_match_file << ref_corners[3*k] << " "
2854b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng            << ref_corners[3*k+1] << " "
2864b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng            << ins_corners[3*k] << " "
2874b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng            << ins_corners[3*k+1] << endl;
2884b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    }
2894b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    inlier_match_file.close();
2904b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    */
2914b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
2924b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    frame_number++;
2934b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  }
2944b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
2954b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  if ( reg.Initialized() )
2964b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  {
2974b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    db_FreeImage_f(lut_x,h);
2984b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    db_FreeImage_f(lut_y,h);
2994b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  }
3004b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
3014b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  return 0;
3024b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng}
3034b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
3044b5b3887b9e375a0d0bd5774718375dce4a616aaBen Chengvoid parse_cmd_line(stringstream& cmdline,
3054b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng            const int argc,
3064b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng            const string& progname,
3074b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng            string& image_list_file_name,
3084b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng            int& nr_corners,
3094b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng            double& max_disparity,
3104b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng            int& motion_model_type,
3114b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng            bool& quarter_resolution,
3124b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng            unsigned int& reference_update_period,
3134b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng            bool& do_motion_smoothing,
3144b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng            double& motion_smoothing_gain)
3154b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng{
3164b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  // for counting down the parsed arguments.
3174b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  int c = argc;
3184b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
3194b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  // a holder
3204b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  string token;
3214b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
3224b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  while (cmdline >> token)
3234b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  {
3244b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    --c;
3254b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
3264b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    int pos = token.find("-");
3274b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
3284b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    if (pos == 0)
3294b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    {
3304b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng      switch (token[1])
3314b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng      {
3324b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng      case 'm':
3334b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    --c; cmdline >> token;
3344b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    if (token.compare("rt") == 0)
3354b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    {
3364b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng      motion_model_type = DB_HOMOGRAPHY_TYPE_R_T;
3374b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    }
3384b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    else if (token.compare("a") == 0)
3394b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    {
3404b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng      motion_model_type = DB_HOMOGRAPHY_TYPE_AFFINE;
3414b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    }
3424b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    else if (token.compare("p") == 0)
3434b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    {
3444b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng      motion_model_type = DB_HOMOGRAPHY_TYPE_PROJECTIVE;
3454b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    }
3464b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    else
3474b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    {
3484b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng      usage(progname);
3494b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng      exit(1);
3504b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    }
3514b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    break;
3524b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng      case 'c':
3534b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    --c; cmdline >> nr_corners;
3544b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    break;
3554b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng      case 'd':
3564b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    --c; cmdline >> max_disparity;
3574b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    break;
3584b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng      case 'q':
3594b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    quarter_resolution = true;
3604b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    break;
3614b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng      case 'r':
3624b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    --c; cmdline >> reference_update_period;
3634b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    break;
3644b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng      case 's':
3654b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    --c; cmdline >> do_motion_smoothing;
3664b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    break;
3674b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng      case 'g':
3684b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    --c; cmdline >> motion_smoothing_gain;
3694b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    break;
3704b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng      default:
3714b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    cerr << progname << "illegal option " << token << endl;
3724b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng      case 'h':
3734b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    usage(progname);
3744b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    exit(1);
3754b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    break;
3764b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng      }
3774b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    }
3784b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    else
3794b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    {
3804b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng      if (c != 1)
3814b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng      {
3824b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    usage(progname);
3834b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    exit(1);
3844b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng      }
3854b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng      else
3864b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng      {
3874b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    --c;
3884b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    image_list_file_name = token;
3894b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng      }
3904b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    }
3914b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  }
3924b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
3934b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  if (c != 0)
3944b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  {
3954b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    usage(progname);
3964b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng    exit(1);
3974b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng  }
3984b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng}
3994b5b3887b9e375a0d0bd5774718375dce4a616aaBen Cheng
400