18bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling/* 28bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling * Copyright (C) 2011 The Android Open Source Project 38bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling * 48bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling * Licensed under the Apache License, Version 2.0 (the "License"); 58bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling * you may not use this file except in compliance with the License. 68bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling * You may obtain a copy of the License at 78bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling * 88bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling * http://www.apache.org/licenses/LICENSE-2.0 98bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling * 108bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling * Unless required by applicable law or agreed to in writing, software 118bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling * distributed under the License is distributed on an "AS IS" BASIS, 128bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling * See the License for the specific language governing permissions and 148bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling * limitations under the License. 158bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling */ 168bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling 178bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling/////////////////////////////////////////////////// 188bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling// Align.h 198bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling// S.O. # : 208bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling// Author(s): zkira 218bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling// $Id: AlignFeatures.h,v 1.13 2011/06/17 13:35:47 mbansal Exp $ 228bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling 238bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling#ifndef ALIGN_H 248bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling#define ALIGN_H 258bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling 268bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling#include "dbreg/dbreg.h" 278bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling#include <db_utilities_camera.h> 288bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling 298bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling#include "ImageUtils.h" 308bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling#include "MatrixUtils.h" 318bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling 328bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberlingclass Align { 338bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling 348bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberlingpublic: 358bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling // Types of alignment possible 368bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling static const int ALIGN_TYPE_PAN = 1; 378bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling 388bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling // Return codes 398bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling static const int ALIGN_RET_LOW_TEXTURE = -2; 408bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling static const int ALIGN_RET_ERROR = -1; 418bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling static const int ALIGN_RET_OK = 0; 428bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling static const int ALIGN_RET_FEW_INLIERS = 1; 438bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling 448bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling ///// Settings for feature-based alignment 458bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling // Number of features to use from corner detection 468bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling static const int DEFAULT_NR_CORNERS=750; 478bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling static const double DEFAULT_MAX_DISPARITY=0.1;//0.4; 488bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling // Type of homography to model 498bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling static const int DEFAULT_MOTION_MODEL=DB_HOMOGRAPHY_TYPE_R_T; 508bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling// static const int DEFAULT_MOTION_MODEL=DB_HOMOGRAPHY_TYPE_PROJECTIVE; 518bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling// static const int DEFAULT_MOTION_MODEL=DB_HOMOGRAPHY_TYPE_AFFINE; 528bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling static const unsigned int DEFAULT_REFERENCE_UPDATE_PERIOD=1500; // Manual reference frame update so set this to a large number 538bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling 548bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling static const int MIN_NR_REF_CORNERS = 25; 558bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling static const int MIN_NR_INLIERS = 10; 568bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling 578bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling Align(); 588bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling ~Align(); 598bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling 608bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling // Initialization of structures, etc. 618bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling int initialize(int width, int height, bool quarter_res, float thresh_still); 628bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling 638bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling // Add a frame. Note: The alignment computation is performed 648bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling // in this function 658bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling int addFrameRGB(ImageType image); 668bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling int addFrame(ImageType image); 678bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling 688bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling // Obtain the TRS matrix from the last two frames 698bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling int getLastTRS(double trs[3][3]); 708bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling char* getRegProfileString(); 718bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling 728bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberlingprotected: 738bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling 748bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling db_FrameToReferenceRegistration reg; 758bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling 768bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling int frame_number; 778bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling 788bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling double Hcurr[9]; // Homography from the alignment reference to the frame-t 798bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling double Hprev[9]; // Homography from frame-0 to the frame-(t-1) 808bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling 818bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling int reference_frame_index; // Index of the reference frame from all captured frames 828bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling int num_frames_captured; // Total number of frames captured (different from frame_number) 838bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling double average_tx_per_frame; // Average pixel translation per captured frame 848bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling 858bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling int width,height; 868bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling 878bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling bool quarter_res; // Whether to process at quarter resolution 888bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling float thresh_still; // Translation threshold in pixels to detect still camera 898bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling ImageType imageGray; 908bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling}; 918bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling 928bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling 938bddf8ce4f3dcbb56edb12cee7e93f3a9daa3f96Sascha Haeberling#endif 94