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