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