/*
* Copyright (C) 2011 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma once
#ifdef _WIN32
#ifdef DBREG_EXPORTS
#define DBREG_API __declspec(dllexport)
#else
#define DBREG_API __declspec(dllimport)
#endif
#else
#define DBREG_API
#endif
extern "C" {
#include "vp_motionmodel.h"
}
#define MOTION_ARRAY 5
/*!
* Performs smoothing on the motion estimate from feature_stab.
*/
class DBREG_API db_StabilizationSmoother
{
public:
db_StabilizationSmoother();
~db_StabilizationSmoother();
/*!
* Initialize parameters for stab-smoother.
*/
void Init();
//! Smothing type
typedef enum {
SimpleSmooth = 0, //!< simple smooth
AdaptSmooth = 1, //!< adaptive smooth
PanSmooth = 2 //!< pan motion smooth
} SmoothType;
/*!
* Smooth-motion is to do a weight-average between the current affine and
* motLF. The way to change the affine is only for the display purpose.
* It removes the high frequency motion and keep the low frequency motion
* to the display. IIR implmentation.
* \param inmot input motion parameters
* \param outmot smoothed output motion parameters
*/
bool smoothMotion(VP_MOTION *inmot, VP_MOTION *outmot);
/*!
* The adaptive smoothing version of the above fixed smoothing function.
* \param hsize width of the image being aligned
* \param vsize height of the image being aligned
* \param inmot input motion parameters
* \param outmot smoothed output motion parameters
*/
bool smoothMotionAdaptive(/*VP_BIMG *bimg,*/int hsize, int vsize, VP_MOTION *inmot, VP_MOTION *outmot);
bool smoothPanMotion_1(VP_MOTION *inmot, VP_MOTION *outmot);
bool smoothPanMotion_2(VP_MOTION *inmot, VP_MOTION *outmot);
/*!
* Set the smoothing factor for the stab-smoother.
* \param factor the factor value to set
*/
inline void setSmoothingFactor(float factor) { f_smoothFactor = factor; }
/*!
* Reset smoothing
*/
inline void resetSmoothing(bool flag) { f_smoothReset = flag; }
/*!
* Set the zoom factor value.
* \param zoom the value to set to
*/
inline void setZoomFactor(float zoom) { f_zoom = zoom; }
/*!
* Set the minimum damping factor value.
* \param factor the value to set to
*/
inline void setminDampingFactor(float factor) { f_minDampingFactor = factor; }
/*!
* Returns the current smoothing factor.
*/
inline float getSmoothingFactor(void) { return f_smoothFactor; }
/*!
* Returns the current zoom factor.
*/
inline float getZoomFactor(void) { return f_zoom; }
/*!
* Returns the current minimum damping factor.
*/
inline float getminDampingFactor(void) { return f_minDampingFactor; }
/*!
* Returns the current state of the smoothing reset flag.
*/
inline bool getSmoothReset(void) { return f_smoothReset; }
/*!
* Returns the current low frequency motion parameters.
*/
inline VP_MOTION getMotLF(void) { return f_motLF; }
/*!
* Returns the inverse of the current low frequency motion parameters.
*/
inline VP_MOTION getImotLF(void) { return f_imotLF; }
/*!
* Set the dimensions of the alignment image.
* \param hsize width of the image
* \param vsize height of the image
*/
inline void setSize(int hsize, int vsize) { f_hsize = hsize; f_vsize = vsize; }
protected:
bool smoothMotion(VP_MOTION *inmot, VP_MOTION *outmot, double smooth_factor);
bool smoothMotion1(VP_MOTION *inmot, VP_MOTION *outmot, VP_MOTION *motLF, VP_MOTION *imotLF, double smooth_factor);
void iterativeSmooth(VP_MOTION *input, VP_MOTION *output, double border_factor);
bool is_point_in_rect(double px, double py, double rx, double ry, double w, double h);
private:
int f_hsize;
int f_vsize;
bool f_smoothOn;
bool f_smoothReset;
float f_smoothFactor;
float f_minDampingFactor;
float f_zoom;
VP_MOTION f_motLF;
VP_MOTION f_imotLF;
VP_MOTION f_hist_mot[MOTION_ARRAY];
VP_MOTION f_hist_mot_speed[MOTION_ARRAY-1];
VP_MOTION f_hist_diff_mot[MOTION_ARRAY-1];
VP_MOTION f_disp_mot;
VP_MOTION f_src_mot;
VP_MOTION f_diff_avg;
};