/* * 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; };