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/////////////////////////////////////////////////// 18e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen// Align.h 19e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen// S.O. # : 20e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen// Author(s): zkira 21e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen// $Id: AlignFeatures.h,v 1.13 2011/06/17 13:35:47 mbansal Exp $ 22e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 23e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#ifndef ALIGN_H 24e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#define ALIGN_H 25e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 26e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#include "dbreg/dbreg.h" 27e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#include <db_utilities_camera.h> 28e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 29e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#include "ImageUtils.h" 30e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#include "MatrixUtils.h" 31e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 32e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenclass Align { 33e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 34e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenpublic: 35e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen // Types of alignment possible 36e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen static const int ALIGN_TYPE_PAN = 1; 37e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 38e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen // Return codes 39dd28e1cc00373c02adf88dff878dbbe5d8be9e59mbansal static const int ALIGN_RET_LOW_TEXTURE = -2; 40e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen static const int ALIGN_RET_ERROR = -1; 41e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen static const int ALIGN_RET_OK = 0; 42dd28e1cc00373c02adf88dff878dbbe5d8be9e59mbansal static const int ALIGN_RET_FEW_INLIERS = 1; 43e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 44e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen ///// Settings for feature-based alignment 45e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen // Number of features to use from corner detection 46e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen static const int DEFAULT_NR_CORNERS=750; 47e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen static const double DEFAULT_MAX_DISPARITY=0.1;//0.4; 48e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen // Type of homography to model 49e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen static const int DEFAULT_MOTION_MODEL=DB_HOMOGRAPHY_TYPE_R_T; 50e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen// static const int DEFAULT_MOTION_MODEL=DB_HOMOGRAPHY_TYPE_PROJECTIVE; 51e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen// static const int DEFAULT_MOTION_MODEL=DB_HOMOGRAPHY_TYPE_AFFINE; 52e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen static const unsigned int DEFAULT_REFERENCE_UPDATE_PERIOD=1500; // Manual reference frame update so set this to a large number 53e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 54dd28e1cc00373c02adf88dff878dbbe5d8be9e59mbansal static const int MIN_NR_REF_CORNERS = 25; 55dd28e1cc00373c02adf88dff878dbbe5d8be9e59mbansal static const int MIN_NR_INLIERS = 10; 56dd28e1cc00373c02adf88dff878dbbe5d8be9e59mbansal 57e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen Align(); 58e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen ~Align(); 59e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 60e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen // Initialization of structures, etc. 61e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen int initialize(int width, int height, bool quarter_res, float thresh_still); 62e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 63e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen // Add a frame. Note: The alignment computation is performed 64e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen // in this function 65e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen int addFrameRGB(ImageType image); 66e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen int addFrame(ImageType image); 67e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 68e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen // Obtain the TRS matrix from the last two frames 69e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen int getLastTRS(double trs[3][3]); 70e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen char* getRegProfileString(); 71e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 72e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenprotected: 73e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 74e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen db_FrameToReferenceRegistration reg; 75e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 76e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen int frame_number; 77dd28e1cc00373c02adf88dff878dbbe5d8be9e59mbansal 78dd28e1cc00373c02adf88dff878dbbe5d8be9e59mbansal double Hcurr[9]; // Homography from the alignment reference to the frame-t 79dd28e1cc00373c02adf88dff878dbbe5d8be9e59mbansal double Hprev[9]; // Homography from frame-0 to the frame-(t-1) 80dd28e1cc00373c02adf88dff878dbbe5d8be9e59mbansal 81dd28e1cc00373c02adf88dff878dbbe5d8be9e59mbansal int reference_frame_index; // Index of the reference frame from all captured frames 82dd28e1cc00373c02adf88dff878dbbe5d8be9e59mbansal int num_frames_captured; // Total number of frames captured (different from frame_number) 83dd28e1cc00373c02adf88dff878dbbe5d8be9e59mbansal double average_tx_per_frame; // Average pixel translation per captured frame 84e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 85e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen int width,height; 86e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 87e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen bool quarter_res; // Whether to process at quarter resolution 88e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen float thresh_still; // Translation threshold in pixels to detect still camera 89e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen ImageType imageGray; 90e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}; 91e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 92e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 93e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#endif 94