mirror of https://github.com/opencv/opencv.git
parent
e5437e5486
commit
7225f89ea2
32 changed files with 597 additions and 3446 deletions
@ -1,3 +1,3 @@ |
||||
set(the_description "Video stabilization") |
||||
ocv_define_module(videostab opencv_imgproc opencv_features2d opencv_video opencv_photo opencv_calib3d OPTIONAL opencv_gpu opencv_highgui) |
||||
ocv_define_module(videostab opencv_imgproc opencv_features2d opencv_video opencv_photo opencv_calib3d opencv_highgui OPTIONAL opencv_gpu) |
||||
|
||||
|
@ -1,56 +0,0 @@ |
||||
Fast Marching Method |
||||
==================== |
||||
|
||||
.. highlight:: cpp |
||||
|
||||
The Fast Marching Method [T04]_ is used in of the video stabilization routines to do motion and color inpainting. The method is implemented is a flexible way and it's made public for other users. |
||||
|
||||
videostab::FastMarchingMethod |
||||
----------------------------- |
||||
|
||||
.. ocv:class:: videostab::FastMarchingMethod |
||||
|
||||
Describes the Fast Marching Method implementation. |
||||
|
||||
:: |
||||
|
||||
class CV_EXPORTS FastMarchingMethod |
||||
{ |
||||
public: |
||||
FastMarchingMethod(); |
||||
|
||||
template <typename Inpaint> |
||||
Inpaint run(const Mat &mask, Inpaint inpaint); |
||||
|
||||
Mat distanceMap() const; |
||||
}; |
||||
|
||||
|
||||
videostab::FastMarchingMethod::FastMarchingMethod |
||||
------------------------------------------------- |
||||
|
||||
Constructor. |
||||
|
||||
.. ocv:function:: videostab::FastMarchingMethod::FastMarchingMethod() |
||||
|
||||
|
||||
videostab::FastMarchingMethod::run |
||||
---------------------------------- |
||||
|
||||
Template method that runs the Fast Marching Method. |
||||
|
||||
.. ocv:function:: Inpaint FastMarchingMethod::run(const Mat &mask, Inpaint inpaint) |
||||
|
||||
:param mask: Image mask. ``0`` value indicates that the pixel value must be inpainted, ``255`` indicates that the pixel value is known, other values aren't acceptable. |
||||
|
||||
:param inpaint: Inpainting functor that overloads ``void operator ()(int x, int y)``. |
||||
|
||||
:return: Inpainting functor. |
||||
|
||||
|
||||
videostab::FastMarchingMethod::distanceMap |
||||
------------------------------------------ |
||||
|
||||
.. ocv:function:: Mat videostab::FastMarchingMethod::distanceMap() const |
||||
|
||||
:return: Distance map that's created during working of the method. |
@ -1,301 +0,0 @@ |
||||
Global Motion Estimation |
||||
======================== |
||||
|
||||
.. highlight:: cpp |
||||
|
||||
The video stabilization module contains a set of functions and classes for global motion estimation between point clouds or between images. In the last case features are extracted and matched internally. For the sake of convenience the motion estimation functions are wrapped into classes. Both the functions and the classes are available. |
||||
|
||||
videostab::MotionModel |
||||
---------------------- |
||||
|
||||
.. ocv:class:: videostab::MotionModel |
||||
|
||||
Describes motion model between two point clouds. |
||||
|
||||
:: |
||||
|
||||
enum MotionModel |
||||
{ |
||||
MM_TRANSLATION = 0, |
||||
MM_TRANSLATION_AND_SCALE = 1, |
||||
MM_ROTATION = 2, |
||||
MM_RIGID = 3, |
||||
MM_SIMILARITY = 4, |
||||
MM_AFFINE = 5, |
||||
MM_HOMOGRAPHY = 6, |
||||
MM_UNKNOWN = 7 |
||||
}; |
||||
|
||||
|
||||
videostab::RansacParams |
||||
----------------------- |
||||
|
||||
.. ocv:class:: videostab::RansacParams |
||||
|
||||
Describes RANSAC method parameters. |
||||
|
||||
:: |
||||
|
||||
struct CV_EXPORTS RansacParams |
||||
{ |
||||
int size; // subset size |
||||
float thresh; // max error to classify as inlier |
||||
float eps; // max outliers ratio |
||||
float prob; // probability of success |
||||
|
||||
RansacParams() : size(0), thresh(0), eps(0), prob(0) {} |
||||
RansacParams(int size, float thresh, float eps, float prob); |
||||
|
||||
int niters() const; |
||||
|
||||
static RansacParams default2dMotion(MotionModel model); |
||||
}; |
||||
|
||||
|
||||
videostab::RansacParams::RansacParams |
||||
------------------------------------- |
||||
|
||||
.. ocv:function:: RansacParams::RansacParams() |
||||
|
||||
:return: RANSAC method empty parameters object. |
||||
|
||||
|
||||
videostab::RansacParams::RansacParams |
||||
------------------------------------- |
||||
|
||||
.. ocv:function:: RansacParams::RansacParams(int size, float thresh, float eps, float prob) |
||||
|
||||
:param size: Subset size. |
||||
|
||||
:param thresh: Maximum re-projection error value to classify as inlier. |
||||
|
||||
:param eps: Maximum ratio of incorrect correspondences. |
||||
|
||||
:param prob: Required success probability. |
||||
|
||||
:return: RANSAC method parameters object. |
||||
|
||||
|
||||
videostab::RansacParams::niters |
||||
------------------------------- |
||||
|
||||
.. ocv:function:: int RansacParams::niters() const |
||||
|
||||
:return: Number of iterations that'll be performed by RANSAC method. |
||||
|
||||
|
||||
videostab::RansacParams::default2dMotion |
||||
---------------------------------------- |
||||
|
||||
.. ocv:function:: static RansacParams RansacParams::default2dMotion(MotionModel model) |
||||
|
||||
:param model: Motion model. See :ocv:class:`videostab::MotionModel`. |
||||
|
||||
:return: Default RANSAC method parameters for the given motion model. |
||||
|
||||
|
||||
videostab::estimateGlobalMotionLeastSquares |
||||
------------------------------------------- |
||||
|
||||
Estimates best global motion between two 2D point clouds in the least-squares sense. |
||||
|
||||
.. note:: Works in-place and changes input point arrays. |
||||
|
||||
.. ocv:function:: Mat estimateGlobalMotionLeastSquares(InputOutputArray points0, InputOutputArray points1, int model = MM_AFFINE, float *rmse = 0) |
||||
|
||||
:param points0: Source set of 2D points (``32F``). |
||||
|
||||
:param points1: Destination set of 2D points (``32F``). |
||||
|
||||
:param model: Motion model (up to ``MM_AFFINE``). |
||||
|
||||
:param rmse: Final root-mean-square error. |
||||
|
||||
:return: 3x3 2D transformation matrix (``32F``). |
||||
|
||||
|
||||
videostab::estimateGlobalMotionRansac |
||||
------------------------------------- |
||||
|
||||
Estimates best global motion between two 2D point clouds robustly (using RANSAC method). |
||||
|
||||
.. ocv:function:: Mat estimateGlobalMotionRansac(InputArray points0, InputArray points1, int model = MM_AFFINE, const RansacParams ¶ms = RansacParams::default2dMotion(MM_AFFINE), float *rmse = 0, int *ninliers = 0) |
||||
|
||||
:param points0: Source set of 2D points (``32F``). |
||||
|
||||
:param points1: Destination set of 2D points (``32F``). |
||||
|
||||
:param model: Motion model. See :ocv:class:`videostab::MotionModel`. |
||||
|
||||
:param params: RANSAC method parameters. See :ocv:class:`videostab::RansacParams`. |
||||
|
||||
:param rmse: Final root-mean-square error. |
||||
|
||||
:param ninliers: Final number of inliers. |
||||
|
||||
|
||||
videostab::getMotion |
||||
-------------------- |
||||
|
||||
Computes motion between two frames assuming that all the intermediate motions are known. |
||||
|
||||
.. ocv:function:: Mat getMotion(int from, int to, const std::vector<Mat> &motions) |
||||
|
||||
:param from: Source frame index. |
||||
|
||||
:param to: Destination frame index. |
||||
|
||||
:param motions: Pair-wise motions. ``motions[i]`` denotes motion from the frame ``i`` to the frame ``i+1`` |
||||
|
||||
:return: Motion from the frame ``from`` to the frame ``to``. |
||||
|
||||
|
||||
videostab::MotionEstimatorBase |
||||
------------------------------ |
||||
|
||||
.. ocv:class:: videostab::MotionEstimatorBase |
||||
|
||||
Base class for all global motion estimation methods. |
||||
|
||||
:: |
||||
|
||||
class CV_EXPORTS MotionEstimatorBase |
||||
{ |
||||
public: |
||||
virtual ~MotionEstimatorBase(); |
||||
|
||||
virtual void setMotionModel(MotionModel val); |
||||
virtual MotionModel motionModel() const; |
||||
|
||||
virtual Mat estimate(InputArray points0, InputArray points1, bool *ok = 0) = 0; |
||||
}; |
||||
|
||||
|
||||
videostab::MotionEstimatorBase::setMotionModel |
||||
---------------------------------------------- |
||||
|
||||
Sets motion model. |
||||
|
||||
.. ocv:function:: void MotionEstimatorBase::setMotionModel(MotionModel val) |
||||
|
||||
:param val: Motion model. See :ocv:class:`videostab::MotionModel`. |
||||
|
||||
|
||||
|
||||
videostab::MotionEstimatorBase::motionModel |
||||
---------------------------------------------- |
||||
|
||||
.. ocv:function:: MotionModel MotionEstimatorBase::motionModel() const |
||||
|
||||
:return: Motion model. See :ocv:class:`videostab::MotionModel`. |
||||
|
||||
|
||||
videostab::MotionEstimatorBase::estimate |
||||
---------------------------------------- |
||||
|
||||
Estimates global motion between two 2D point clouds. |
||||
|
||||
.. ocv:function:: Mat MotionEstimatorBase::estimate(InputArray points0, InputArray points1, bool *ok = 0) |
||||
|
||||
:param points0: Source set of 2D points (``32F``). |
||||
|
||||
:param points1: Destination set of 2D points (``32F``). |
||||
|
||||
:param ok: Indicates whether motion was estimated successfully. |
||||
|
||||
:return: 3x3 2D transformation matrix (``32F``). |
||||
|
||||
|
||||
videostab::MotionEstimatorRansacL2 |
||||
---------------------------------- |
||||
|
||||
.. ocv:class:: videostab::MotionEstimatorRansacL2 |
||||
|
||||
Describes a robust RANSAC-based global 2D motion estimation method which minimizes L2 error. |
||||
|
||||
:: |
||||
|
||||
class CV_EXPORTS MotionEstimatorRansacL2 : public MotionEstimatorBase |
||||
{ |
||||
public: |
||||
MotionEstimatorRansacL2(MotionModel model = MM_AFFINE); |
||||
|
||||
void setRansacParams(const RansacParams &val); |
||||
RansacParams ransacParams() const; |
||||
|
||||
void setMinInlierRatio(float val); |
||||
float minInlierRatio() const; |
||||
|
||||
virtual Mat estimate(InputArray points0, InputArray points1, bool *ok = 0); |
||||
}; |
||||
|
||||
|
||||
videostab::MotionEstimatorL1 |
||||
---------------------------- |
||||
|
||||
.. ocv:class:: videostab::MotionEstimatorL1 |
||||
|
||||
Describes a global 2D motion estimation method which minimizes L1 error. |
||||
|
||||
.. note:: To be able to use this method you must build OpenCV with CLP library support. |
||||
|
||||
:: |
||||
|
||||
class CV_EXPORTS MotionEstimatorL1 : public MotionEstimatorBase |
||||
{ |
||||
public: |
||||
MotionEstimatorL1(MotionModel model = MM_AFFINE); |
||||
|
||||
virtual Mat estimate(InputArray points0, InputArray points1, bool *ok = 0); |
||||
}; |
||||
|
||||
|
||||
videostab::ImageMotionEstimatorBase |
||||
----------------------------------- |
||||
|
||||
.. ocv:class:: videostab::ImageMotionEstimatorBase |
||||
|
||||
Base class for global 2D motion estimation methods which take frames as input. |
||||
|
||||
:: |
||||
|
||||
class CV_EXPORTS ImageMotionEstimatorBase |
||||
{ |
||||
public: |
||||
virtual ~ImageMotionEstimatorBase(); |
||||
|
||||
virtual void setMotionModel(MotionModel val); |
||||
virtual MotionModel motionModel() const; |
||||
|
||||
virtual Mat estimate(const Mat &frame0, const Mat &frame1, bool *ok = 0) = 0; |
||||
}; |
||||
|
||||
|
||||
videostab::KeypointBasedMotionEstimator |
||||
--------------------------------------- |
||||
|
||||
.. ocv:class:: videostab::KeypointBasedMotionEstimator |
||||
|
||||
Describes a global 2D motion estimation method which uses keypoints detection and optical flow for matching. |
||||
|
||||
:: |
||||
|
||||
class CV_EXPORTS KeypointBasedMotionEstimator : public ImageMotionEstimatorBase |
||||
{ |
||||
public: |
||||
KeypointBasedMotionEstimator(Ptr<MotionEstimatorBase> estimator); |
||||
|
||||
virtual void setMotionModel(MotionModel val); |
||||
virtual MotionModel motionModel() const; |
||||
|
||||
void setDetector(Ptr<FeatureDetector> val); |
||||
Ptr<FeatureDetector> detector() const; |
||||
|
||||
void setOpticalFlowEstimator(Ptr<ISparseOptFlowEstimator> val); |
||||
Ptr<ISparseOptFlowEstimator> opticalFlowEstimator() const; |
||||
|
||||
void setOutlierRejector(Ptr<IOutlierRejector> val); |
||||
Ptr<IOutlierRejector> outlierRejector() const; |
||||
|
||||
virtual Mat estimate(const Mat &frame0, const Mat &frame1, bool *ok = 0); |
||||
}; |
@ -1,13 +0,0 @@ |
||||
Introduction |
||||
============ |
||||
|
||||
The video stabilization module contains a set of functions and classes that can be used to solve the problem of video stabilization. There are a few methods implemented, most of them are descibed in the papers [OF06]_ and [G11]_. However, there are some extensions and deviations from the orginal paper methods. |
||||
|
||||
References |
||||
---------- |
||||
|
||||
.. [OF06] Full-Frame Video Stabilization with Motion Inpainting. Matsushita, Y. Ofek, E. Ge, W. Tang, X. Shum, H.-Y., IEEE TRANSACTIONS ON PATTERN ANALYSIS AND MACHINE INTELLIGENCE, 2006 |
||||
|
||||
.. [G11] Auto-directed video stabilization with robust L1 optimal camera paths, M. Grundmann, V. Kwatra, I. Essa, Computer Vision and Pattern Recognition (CVPR), 2011 |
||||
|
||||
.. [T04] An Image Inpainting Technique Based on the Fast Marching Method, Alexandru Telea, Journal of graphics tools, 2004 |
@ -1,10 +0,0 @@ |
||||
****************************** |
||||
videostab. Video Stabilization |
||||
****************************** |
||||
|
||||
.. toctree:: |
||||
:maxdepth: 2 |
||||
|
||||
introduction |
||||
global_motion |
||||
fast_marching |
@ -1,108 +0,0 @@ |
||||
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||
//
|
||||
// By downloading, copying, installing or using the software you agree to this license.
|
||||
// If you do not agree to this license, do not download, install,
|
||||
// copy or use the software.
|
||||
//
|
||||
//
|
||||
// License Agreement
|
||||
// For Open Source Computer Vision Library
|
||||
//
|
||||
// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
|
||||
// Copyright (C) 2009-2011, Willow Garage Inc., all rights reserved.
|
||||
// Third party copyrights are property of their respective owners.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistribution's of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// * Redistribution's in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
//
|
||||
// * The name of the copyright holders may not be used to endorse or promote products
|
||||
// derived from this software without specific prior written permission.
|
||||
//
|
||||
// This software is provided by the copyright holders and contributors "as is" and
|
||||
// any express or implied warranties, including, but not limited to, the implied
|
||||
// warranties of merchantability and fitness for a particular purpose are disclaimed.
|
||||
// In no event shall the Intel Corporation or contributors be liable for any direct,
|
||||
// indirect, incidental, special, exemplary, or consequential damages
|
||||
// (including, but not limited to, procurement of substitute goods or services;
|
||||
// loss of use, data, or profits; or business interruption) however caused
|
||||
// and on any theory of liability, whether in contract, strict liability,
|
||||
// or tort (including negligence or otherwise) arising in any way out of
|
||||
// the use of this software, even if advised of the possibility of such damage.
|
||||
//
|
||||
//M*/
|
||||
|
||||
#ifndef __OPENCV_VIDEOSTAB_MOTION_CORE_HPP__ |
||||
#define __OPENCV_VIDEOSTAB_MOTION_CORE_HPP__ |
||||
|
||||
#include <cmath> |
||||
#include "opencv2/core/core.hpp" |
||||
|
||||
namespace cv |
||||
{ |
||||
namespace videostab |
||||
{ |
||||
|
||||
enum MotionModel |
||||
{ |
||||
MM_TRANSLATION = 0, |
||||
MM_TRANSLATION_AND_SCALE = 1, |
||||
MM_ROTATION = 2, |
||||
MM_RIGID = 3, |
||||
MM_SIMILARITY = 4, |
||||
MM_AFFINE = 5, |
||||
MM_HOMOGRAPHY = 6, |
||||
MM_UNKNOWN = 7 |
||||
}; |
||||
|
||||
struct CV_EXPORTS RansacParams |
||||
{ |
||||
int size; // subset size
|
||||
float thresh; // max error to classify as inlier
|
||||
float eps; // max outliers ratio
|
||||
float prob; // probability of success
|
||||
|
||||
RansacParams() : size(0), thresh(0), eps(0), prob(0) {} |
||||
RansacParams(int size, float thresh, float eps, float prob); |
||||
|
||||
int niters() const |
||||
{ |
||||
return static_cast<int>( |
||||
std::ceil(std::log(1 - prob) / std::log(1 - std::pow(1 - eps, size)))); |
||||
} |
||||
|
||||
static RansacParams default2dMotion(MotionModel model) |
||||
{ |
||||
CV_Assert(model < MM_UNKNOWN); |
||||
if (model == MM_TRANSLATION) |
||||
return RansacParams(1, 0.5f, 0.5f, 0.99f); |
||||
if (model == MM_TRANSLATION_AND_SCALE) |
||||
return RansacParams(2, 0.5f, 0.5f, 0.99f); |
||||
if (model == MM_ROTATION) |
||||
return RansacParams(1, 0.5f, 0.5f, 0.99f); |
||||
if (model == MM_RIGID) |
||||
return RansacParams(2, 0.5f, 0.5f, 0.99f); |
||||
if (model == MM_SIMILARITY) |
||||
return RansacParams(2, 0.5f, 0.5f, 0.99f); |
||||
if (model == MM_AFFINE) |
||||
return RansacParams(3, 0.5f, 0.5f, 0.99f); |
||||
return RansacParams(4, 0.5f, 0.5f, 0.99f); |
||||
} |
||||
}; |
||||
|
||||
inline RansacParams::RansacParams(int _size, float _thresh, float _eps, float _prob) |
||||
: size(_size), thresh(_thresh), eps(_eps), prob(_prob) {} |
||||
|
||||
|
||||
} // namespace videostab
|
||||
} // namespace cv
|
||||
|
||||
#endif |
@ -1,96 +0,0 @@ |
||||
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||
//
|
||||
// By downloading, copying, installing or using the software you agree to this license.
|
||||
// If you do not agree to this license, do not download, install,
|
||||
// copy or use the software.
|
||||
//
|
||||
//
|
||||
// License Agreement
|
||||
// For Open Source Computer Vision Library
|
||||
//
|
||||
// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
|
||||
// Copyright (C) 2009-2011, Willow Garage Inc., all rights reserved.
|
||||
// Third party copyrights are property of their respective owners.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistribution's of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// * Redistribution's in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
//
|
||||
// * The name of the copyright holders may not be used to endorse or promote products
|
||||
// derived from this software without specific prior written permission.
|
||||
//
|
||||
// This software is provided by the copyright holders and contributors "as is" and
|
||||
// any express or implied warranties, including, but not limited to, the implied
|
||||
// warranties of merchantability and fitness for a particular purpose are disclaimed.
|
||||
// In no event shall the Intel Corporation or contributors be liable for any direct,
|
||||
// indirect, incidental, special, exemplary, or consequential damages
|
||||
// (including, but not limited to, procurement of substitute goods or services;
|
||||
// loss of use, data, or profits; or business interruption) however caused
|
||||
// and on any theory of liability, whether in contract, strict liability,
|
||||
// or tort (including negligence or otherwise) arising in any way out of
|
||||
// the use of this software, even if advised of the possibility of such damage.
|
||||
//
|
||||
//M*/
|
||||
|
||||
#ifndef __OPENCV_VIDEOSTAB_OUTLIER_REJECTION_HPP__ |
||||
#define __OPENCV_VIDEOSTAB_OUTLIER_REJECTION_HPP__ |
||||
|
||||
#include <vector> |
||||
#include "opencv2/core/core.hpp" |
||||
#include "opencv2/videostab/motion_core.hpp" |
||||
|
||||
namespace cv |
||||
{ |
||||
namespace videostab |
||||
{ |
||||
|
||||
class CV_EXPORTS IOutlierRejector |
||||
{ |
||||
public: |
||||
virtual ~IOutlierRejector() {} |
||||
|
||||
virtual void process( |
||||
Size frameSize, InputArray points0, InputArray points1, OutputArray mask) = 0; |
||||
}; |
||||
|
||||
class CV_EXPORTS NullOutlierRejector : public IOutlierRejector |
||||
{ |
||||
public: |
||||
virtual void process( |
||||
Size frameSize, InputArray points0, InputArray points1, OutputArray mask); |
||||
}; |
||||
|
||||
class CV_EXPORTS TranslationBasedLocalOutlierRejector : public IOutlierRejector |
||||
{ |
||||
public: |
||||
TranslationBasedLocalOutlierRejector(); |
||||
|
||||
void setCellSize(Size val) { cellSize_ = val; } |
||||
Size cellSize() const { return cellSize_; } |
||||
|
||||
void setRansacParams(RansacParams val) { ransacParams_ = val; } |
||||
RansacParams ransacParams() const { return ransacParams_; } |
||||
|
||||
virtual void process( |
||||
Size frameSize, InputArray points0, InputArray points1, OutputArray mask); |
||||
|
||||
private: |
||||
Size cellSize_; |
||||
RansacParams ransacParams_; |
||||
|
||||
typedef std::vector<int> Cell; |
||||
std::vector<Cell> grid_; |
||||
}; |
||||
|
||||
} // namespace videostab
|
||||
} // namespace cv
|
||||
|
||||
#endif |
@ -1,67 +0,0 @@ |
||||
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||
//
|
||||
// By downloading, copying, installing or using the software you agree to this license.
|
||||
// If you do not agree to this license, do not download, install,
|
||||
// copy or use the software.
|
||||
//
|
||||
//
|
||||
// License Agreement
|
||||
// For Open Source Computer Vision Library
|
||||
//
|
||||
// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
|
||||
// Copyright (C) 2009-2011, Willow Garage Inc., all rights reserved.
|
||||
// Third party copyrights are property of their respective owners.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistribution's of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// * Redistribution's in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
//
|
||||
// * The name of the copyright holders may not be used to endorse or promote products
|
||||
// derived from this software without specific prior written permission.
|
||||
//
|
||||
// This software is provided by the copyright holders and contributors "as is" and
|
||||
// any express or implied warranties, including, but not limited to, the implied
|
||||
// warranties of merchantability and fitness for a particular purpose are disclaimed.
|
||||
// In no event shall the Intel Corporation or contributors be liable for any direct,
|
||||
// indirect, incidental, special, exemplary, or consequential damages
|
||||
// (including, but not limited to, procurement of substitute goods or services;
|
||||
// loss of use, data, or profits; or business interruption) however caused
|
||||
// and on any theory of liability, whether in contract, strict liability,
|
||||
// or tort (including negligence or otherwise) arising in any way out of
|
||||
// the use of this software, even if advised of the possibility of such damage.
|
||||
//
|
||||
//M*/
|
||||
|
||||
#ifndef __OPENCV_VIDEOSTAB_RING_BUFFER_HPP__ |
||||
#define __OPENCV_VIDEOSTAB_RING_BUFFER_HPP__ |
||||
|
||||
#include <vector> |
||||
#include "opencv2/imgproc/imgproc.hpp" |
||||
|
||||
namespace cv |
||||
{ |
||||
namespace videostab |
||||
{ |
||||
|
||||
template <typename T> inline T& at(int idx, std::vector<T> &items) |
||||
{ |
||||
return items[cv::borderInterpolate(idx, static_cast<int>(items.size()), cv::BORDER_WRAP)]; |
||||
} |
||||
|
||||
template <typename T> inline const T& at(int idx, const std::vector<T> &items) |
||||
{ |
||||
return items[cv::borderInterpolate(idx, static_cast<int>(items.size()), cv::BORDER_WRAP)]; |
||||
} |
||||
|
||||
} // namespace videostab
|
||||
} // namespace cv
|
||||
|
||||
#endif |
@ -1,139 +0,0 @@ |
||||
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||
//
|
||||
// By downloading, copying, installing or using the software you agree to this license.
|
||||
// If you do not agree to this license, do not download, install,
|
||||
// copy or use the software.
|
||||
//
|
||||
//
|
||||
// License Agreement
|
||||
// For Open Source Computer Vision Library
|
||||
//
|
||||
// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
|
||||
// Copyright (C) 2009-2011, Willow Garage Inc., all rights reserved.
|
||||
// Third party copyrights are property of their respective owners.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistribution's of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// * Redistribution's in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
//
|
||||
// * The name of the copyright holders may not be used to endorse or promote products
|
||||
// derived from this software without specific prior written permission.
|
||||
//
|
||||
// This software is provided by the copyright holders and contributors "as is" and
|
||||
// any express or implied warranties, including, but not limited to, the implied
|
||||
// warranties of merchantability and fitness for a particular purpose are disclaimed.
|
||||
// In no event shall the Intel Corporation or contributors be liable for any direct,
|
||||
// indirect, incidental, special, exemplary, or consequential damages
|
||||
// (including, but not limited to, procurement of substitute goods or services;
|
||||
// loss of use, data, or profits; or business interruption) however caused
|
||||
// and on any theory of liability, whether in contract, strict liability,
|
||||
// or tort (including negligence or otherwise) arising in any way out of
|
||||
// the use of this software, even if advised of the possibility of such damage.
|
||||
//
|
||||
//M*/
|
||||
|
||||
#ifndef __OPENCV_VIDEOSTAB_WOBBLE_SUPPRESSION_HPP__ |
||||
#define __OPENCV_VIDEOSTAB_WOBBLE_SUPPRESSION_HPP__ |
||||
|
||||
#include <vector> |
||||
#include "opencv2/core/core.hpp" |
||||
#include "opencv2/videostab/global_motion.hpp" |
||||
#include "opencv2/videostab/log.hpp" |
||||
|
||||
#ifdef HAVE_OPENCV_GPU |
||||
#include "opencv2/gpu/gpu.hpp" |
||||
#endif |
||||
|
||||
namespace cv |
||||
{ |
||||
namespace videostab |
||||
{ |
||||
|
||||
class CV_EXPORTS WobbleSuppressorBase |
||||
{ |
||||
public: |
||||
WobbleSuppressorBase(); |
||||
|
||||
virtual ~WobbleSuppressorBase() {} |
||||
|
||||
void setMotionEstimator(Ptr<ImageMotionEstimatorBase> val) { motionEstimator_ = val; } |
||||
Ptr<ImageMotionEstimatorBase> motionEstimator() const { return motionEstimator_; } |
||||
|
||||
virtual void suppress(int idx, const Mat &frame, Mat &result) = 0; |
||||
|
||||
|
||||
// data from stabilizer
|
||||
|
||||
virtual void setFrameCount(int val) { frameCount_ = val; } |
||||
virtual int frameCount() const { return frameCount_; } |
||||
|
||||
virtual void setMotions(const std::vector<Mat> &val) { motions_ = &val; } |
||||
virtual const std::vector<Mat>& motions() const { return *motions_; } |
||||
|
||||
virtual void setMotions2(const std::vector<Mat> &val) { motions2_ = &val; } |
||||
virtual const std::vector<Mat>& motions2() const { return *motions2_; } |
||||
|
||||
virtual void setStabilizationMotions(const std::vector<Mat> &val) { stabilizationMotions_ = &val; } |
||||
virtual const std::vector<Mat>& stabilizationMotions() const { return *stabilizationMotions_; } |
||||
|
||||
protected: |
||||
Ptr<ImageMotionEstimatorBase> motionEstimator_; |
||||
int frameCount_; |
||||
const std::vector<Mat> *motions_; |
||||
const std::vector<Mat> *motions2_; |
||||
const std::vector<Mat> *stabilizationMotions_; |
||||
}; |
||||
|
||||
class CV_EXPORTS NullWobbleSuppressor : public WobbleSuppressorBase |
||||
{ |
||||
public: |
||||
virtual void suppress(int idx, const Mat &frame, Mat &result); |
||||
}; |
||||
|
||||
class CV_EXPORTS MoreAccurateMotionWobbleSuppressorBase : public WobbleSuppressorBase |
||||
{ |
||||
public: |
||||
virtual void setPeriod(int val) { period_ = val; } |
||||
virtual int period() const { return period_; } |
||||
|
||||
protected: |
||||
MoreAccurateMotionWobbleSuppressorBase() { setPeriod(30); } |
||||
|
||||
int period_; |
||||
}; |
||||
|
||||
class CV_EXPORTS MoreAccurateMotionWobbleSuppressor : public MoreAccurateMotionWobbleSuppressorBase |
||||
{ |
||||
public: |
||||
virtual void suppress(int idx, const Mat &frame, Mat &result); |
||||
|
||||
private: |
||||
Mat_<float> mapx_, mapy_; |
||||
}; |
||||
|
||||
#ifdef HAVE_OPENCV_GPU |
||||
class CV_EXPORTS MoreAccurateMotionWobbleSuppressorGpu : public MoreAccurateMotionWobbleSuppressorBase |
||||
{ |
||||
public: |
||||
void suppress(int idx, const gpu::GpuMat &frame, gpu::GpuMat &result); |
||||
virtual void suppress(int idx, const Mat &frame, Mat &result); |
||||
|
||||
private: |
||||
gpu::GpuMat frameDevice_, resultDevice_; |
||||
gpu::GpuMat mapx_, mapy_; |
||||
}; |
||||
#endif |
||||
|
||||
} // namespace videostab
|
||||
} // namespace cv
|
||||
|
||||
#endif |
||||
|
@ -1,76 +0,0 @@ |
||||
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||
//
|
||||
// By downloading, copying, installing or using the software you agree to this license.
|
||||
// If you do not agree to this license, do not download, install,
|
||||
// copy or use the software.
|
||||
//
|
||||
//
|
||||
// License Agreement
|
||||
// For Open Source Computer Vision Library
|
||||
//
|
||||
// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
|
||||
// Copyright (C) 2009-2011, Willow Garage Inc., all rights reserved.
|
||||
// Third party copyrights are property of their respective owners.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistribution's of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// * Redistribution's in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
//
|
||||
// * The name of the copyright holders may not be used to endorse or promote products
|
||||
// derived from this software without specific prior written permission.
|
||||
//
|
||||
// This software is provided by the copyright holders and contributors "as is" and
|
||||
// any express or implied warranties, including, but not limited to, the implied
|
||||
// warranties of merchantability and fitness for a particular purpose are disclaimed.
|
||||
// In no event shall the Intel Corporation or contributors be liable for any direct,
|
||||
// indirect, incidental, special, exemplary, or consequential damages
|
||||
// (including, but not limited to, procurement of substitute goods or services;
|
||||
// loss of use, data, or profits; or business interruption) however caused
|
||||
// and on any theory of liability, whether in contract, strict liability,
|
||||
// or tort (including negligence or otherwise) arising in any way out of
|
||||
// the use of this software, even if advised of the possibility of such damage.
|
||||
//
|
||||
//M*/
|
||||
|
||||
#ifndef __OPENCV_VIDEOSTAB_CLP_HPP__ |
||||
#define __OPENCV_VIDEOSTAB_CLP_HPP__ |
||||
|
||||
#ifdef HAVE_CLP |
||||
# undef PACKAGE |
||||
# undef PACKAGE_BUGREPORT |
||||
# undef PACKAGE_NAME |
||||
# undef PACKAGE_STRING |
||||
# undef PACKAGE_TARNAME |
||||
# undef PACKAGE_VERSION |
||||
# undef VERSION |
||||
|
||||
# define COIN_BIG_INDEX 0 |
||||
# define DEBUG_COIN 0 |
||||
# define PRESOLVE_DEBUG 0 |
||||
# define PRESOLVE_CONSISTENCY 0 |
||||
|
||||
# include "ClpSimplex.hpp" |
||||
# include "ClpPresolve.hpp" |
||||
# include "ClpPrimalColumnSteepest.hpp" |
||||
# include "ClpDualRowSteepest.hpp" |
||||
# define INF 1e10 |
||||
#endif |
||||
|
||||
// Clp replaces min and max with ?: globally, we can't use std::min and std::max in case
|
||||
// when HAVE_CLP is true. We create the defines by ourselves when HAVE_CLP == 0.
|
||||
#ifndef min |
||||
#define min(a,b) std::min(a,b) |
||||
#endif |
||||
#ifndef max |
||||
#define max(a,b) std::max(a,b) |
||||
#endif |
||||
|
||||
#endif |
@ -1,201 +0,0 @@ |
||||
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||
//
|
||||
// By downloading, copying, installing or using the software you agree to this license.
|
||||
// If you do not agree to this license, do not download, install,
|
||||
// copy or use the software.
|
||||
//
|
||||
//
|
||||
// License Agreement
|
||||
// For Open Source Computer Vision Library
|
||||
//
|
||||
// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
|
||||
// Copyright (C) 2009-2011, Willow Garage Inc., all rights reserved.
|
||||
// Third party copyrights are property of their respective owners.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistribution's of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// * Redistribution's in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
//
|
||||
// * The name of the copyright holders may not be used to endorse or promote products
|
||||
// derived from this software without specific prior written permission.
|
||||
//
|
||||
// This software is provided by the copyright holders and contributors "as is" and
|
||||
// any express or implied warranties, including, but not limited to, the implied
|
||||
// warranties of merchantability and fitness for a particular purpose are disclaimed.
|
||||
// In no event shall the Intel Corporation or contributors be liable for any direct,
|
||||
// indirect, incidental, special, exemplary, or consequential damages
|
||||
// (including, but not limited to, procurement of substitute goods or services;
|
||||
// loss of use, data, or profits; or business interruption) however caused
|
||||
// and on any theory of liability, whether in contract, strict liability,
|
||||
// or tort (including negligence or otherwise) arising in any way out of
|
||||
// the use of this software, even if advised of the possibility of such damage.
|
||||
//
|
||||
//M*/
|
||||
|
||||
#include "precomp.hpp" |
||||
#include "opencv2/core/core.hpp" |
||||
#include "opencv2/videostab/outlier_rejection.hpp" |
||||
|
||||
using namespace std; |
||||
|
||||
namespace cv |
||||
{ |
||||
namespace videostab |
||||
{ |
||||
|
||||
void NullOutlierRejector::process( |
||||
Size /*frameSize*/, InputArray points0, InputArray points1, OutputArray mask) |
||||
{ |
||||
CV_Assert(points0.type() == points1.type()); |
||||
CV_Assert(points0.getMat().checkVector(2) == points1.getMat().checkVector(2)); |
||||
|
||||
int npoints = points0.getMat().checkVector(2); |
||||
mask.create(1, npoints, CV_8U); |
||||
Mat mask_ = mask.getMat(); |
||||
mask_.setTo(1); |
||||
} |
||||
|
||||
TranslationBasedLocalOutlierRejector::TranslationBasedLocalOutlierRejector() |
||||
{ |
||||
setCellSize(Size(50, 50)); |
||||
setRansacParams(RansacParams::default2dMotion(MM_TRANSLATION)); |
||||
} |
||||
|
||||
|
||||
void TranslationBasedLocalOutlierRejector::process( |
||||
Size frameSize, InputArray points0, InputArray points1, OutputArray mask) |
||||
{ |
||||
CV_Assert(points0.type() == points1.type()); |
||||
CV_Assert(points0.getMat().checkVector(2) == points1.getMat().checkVector(2)); |
||||
|
||||
int npoints = points0.getMat().checkVector(2); |
||||
|
||||
const Point2f* points0_ = points0.getMat().ptr<Point2f>(); |
||||
const Point2f* points1_ = points1.getMat().ptr<Point2f>(); |
||||
|
||||
mask.create(1, npoints, CV_8U); |
||||
uchar* mask_ = mask.getMat().ptr<uchar>(); |
||||
|
||||
Size ncells((frameSize.width + cellSize_.width - 1) / cellSize_.width, |
||||
(frameSize.height + cellSize_.height - 1) / cellSize_.height); |
||||
|
||||
int cx, cy; |
||||
|
||||
// fill grid cells
|
||||
|
||||
grid_.assign(ncells.area(), Cell()); |
||||
|
||||
for (int i = 0; i < npoints; ++i) |
||||
{ |
||||
cx = std::min(cvRound(points0_[i].x / cellSize_.width), ncells.width - 1); |
||||
cy = std::min(cvRound(points0_[i].y / cellSize_.height), ncells.height - 1); |
||||
grid_[cy * ncells.width + cx].push_back(i); |
||||
} |
||||
|
||||
// process each cell
|
||||
|
||||
RNG rng(0); |
||||
int niters = ransacParams_.niters(); |
||||
int ninliers, ninliersMax; |
||||
vector<int> inliers; |
||||
float dx, dy, dxBest, dyBest; |
||||
float x1, y1; |
||||
int idx; |
||||
|
||||
for (size_t ci = 0; ci < grid_.size(); ++ci) |
||||
{ |
||||
// estimate translation model at the current cell using RANSAC
|
||||
|
||||
const Cell &cell = grid_[ci]; |
||||
ninliersMax = 0; |
||||
dxBest = dyBest = 0.f; |
||||
|
||||
// find the best hypothesis
|
||||
|
||||
if (!cell.empty()) |
||||
{ |
||||
for (int iter = 0; iter < niters; ++iter) |
||||
{ |
||||
idx = cell[static_cast<unsigned>(rng) % cell.size()]; |
||||
dx = points1_[idx].x - points0_[idx].x; |
||||
dy = points1_[idx].y - points0_[idx].y; |
||||
|
||||
ninliers = 0; |
||||
for (size_t i = 0; i < cell.size(); ++i) |
||||
{ |
||||
x1 = points0_[cell[i]].x + dx; |
||||
y1 = points0_[cell[i]].y + dy; |
||||
if (sqr(x1 - points1_[cell[i]].x) + sqr(y1 - points1_[cell[i]].y) < |
||||
sqr(ransacParams_.thresh)) |
||||
{ |
||||
ninliers++; |
||||
} |
||||
} |
||||
|
||||
if (ninliers > ninliersMax) |
||||
{ |
||||
ninliersMax = ninliers; |
||||
dxBest = dx; |
||||
dyBest = dy; |
||||
} |
||||
} |
||||
} |
||||
|
||||
// get the best hypothesis inliers
|
||||
|
||||
ninliers = 0; |
||||
inliers.resize(ninliersMax); |
||||
for (size_t i = 0; i < cell.size(); ++i) |
||||
{ |
||||
x1 = points0_[cell[i]].x + dxBest; |
||||
y1 = points0_[cell[i]].y + dyBest; |
||||
if (sqr(x1 - points1_[cell[i]].x) + sqr(y1 - points1_[cell[i]].y) < |
||||
sqr(ransacParams_.thresh)) |
||||
{ |
||||
inliers[ninliers++] = cell[i]; |
||||
} |
||||
} |
||||
|
||||
// refine the best hypothesis
|
||||
|
||||
dxBest = dyBest = 0.f; |
||||
for (size_t i = 0; i < inliers.size(); ++i) |
||||
{ |
||||
dxBest += points1_[inliers[i]].x - points0_[inliers[i]].x; |
||||
dyBest += points1_[inliers[i]].y - points0_[inliers[i]].y; |
||||
} |
||||
if (!inliers.empty()) |
||||
{ |
||||
dxBest /= inliers.size(); |
||||
dyBest /= inliers.size(); |
||||
} |
||||
|
||||
// set mask elements for refined model inliers
|
||||
|
||||
for (size_t i = 0; i < cell.size(); ++i) |
||||
{ |
||||
x1 = points0_[cell[i]].x + dxBest; |
||||
y1 = points0_[cell[i]].y + dyBest; |
||||
if (sqr(x1 - points1_[cell[i]].x) + sqr(y1 - points1_[cell[i]].y) < |
||||
sqr(ransacParams_.thresh)) |
||||
{ |
||||
mask_[cell[i]] = 1; |
||||
} |
||||
else |
||||
{ |
||||
mask_[cell[i]] = 0; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
} // namespace videostab
|
||||
} // namespace cv
|
@ -1,156 +0,0 @@ |
||||
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||
//
|
||||
// By downloading, copying, installing or using the software you agree to this license.
|
||||
// If you do not agree to this license, do not download, install,
|
||||
// copy or use the software.
|
||||
//
|
||||
//
|
||||
// License Agreement
|
||||
// For Open Source Computer Vision Library
|
||||
//
|
||||
// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
|
||||
// Copyright (C) 2009-2011, Willow Garage Inc., all rights reserved.
|
||||
// Third party copyrights are property of their respective owners.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistribution's of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// * Redistribution's in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
//
|
||||
// * The name of the copyright holders may not be used to endorse or promote products
|
||||
// derived from this software without specific prior written permission.
|
||||
//
|
||||
// This software is provided by the copyright holders and contributors "as is" and
|
||||
// any express or implied warranties, including, but not limited to, the implied
|
||||
// warranties of merchantability and fitness for a particular purpose are disclaimed.
|
||||
// In no event shall the Intel Corporation or contributors be liable for any direct,
|
||||
// indirect, incidental, special, exemplary, or consequential damages
|
||||
// (including, but not limited to, procurement of substitute goods or services;
|
||||
// loss of use, data, or profits; or business interruption) however caused
|
||||
// and on any theory of liability, whether in contract, strict liability,
|
||||
// or tort (including negligence or otherwise) arising in any way out of
|
||||
// the use of this software, even if advised of the possibility of such damage.
|
||||
//
|
||||
//M*/
|
||||
|
||||
#include "precomp.hpp" |
||||
#include "opencv2/videostab/wobble_suppression.hpp" |
||||
#include "opencv2/videostab/ring_buffer.hpp" |
||||
|
||||
using namespace std; |
||||
|
||||
namespace cv |
||||
{ |
||||
namespace videostab |
||||
{ |
||||
|
||||
WobbleSuppressorBase::WobbleSuppressorBase() : motions_(0), stabilizationMotions_(0) |
||||
{ |
||||
setMotionEstimator(new KeypointBasedMotionEstimator(new MotionEstimatorRansacL2(MM_HOMOGRAPHY))); |
||||
} |
||||
|
||||
|
||||
void NullWobbleSuppressor::suppress(int /*idx*/, const Mat &frame, Mat &result) |
||||
{ |
||||
result = frame; |
||||
} |
||||
|
||||
|
||||
void MoreAccurateMotionWobbleSuppressor::suppress(int idx, const Mat &frame, Mat &result) |
||||
{ |
||||
CV_Assert(motions_ && stabilizationMotions_); |
||||
|
||||
if (idx % period_ == 0) |
||||
{ |
||||
result = frame; |
||||
return; |
||||
} |
||||
|
||||
int k1 = idx / period_ * period_; |
||||
int k2 = std::min(k1 + period_, frameCount_ - 1); |
||||
|
||||
Mat S1 = (*stabilizationMotions_)[idx]; |
||||
|
||||
Mat_<float> ML = S1 * getMotion(k1, idx, *motions2_) * getMotion(k1, idx, *motions_).inv() * S1.inv(); |
||||
Mat_<float> MR = S1 * getMotion(idx, k2, *motions2_).inv() * getMotion(idx, k2, *motions_) * S1.inv(); |
||||
|
||||
mapx_.create(frame.size()); |
||||
mapy_.create(frame.size()); |
||||
|
||||
float xl, yl, zl, wl; |
||||
float xr, yr, zr, wr; |
||||
|
||||
for (int y = 0; y < frame.rows; ++y) |
||||
{ |
||||
for (int x = 0; x < frame.cols; ++x) |
||||
{ |
||||
xl = ML(0,0)*x + ML(0,1)*y + ML(0,2); |
||||
yl = ML(1,0)*x + ML(1,1)*y + ML(1,2); |
||||
zl = ML(2,0)*x + ML(2,1)*y + ML(2,2); |
||||
xl /= zl; yl /= zl; |
||||
wl = float(idx - k1); |
||||
|
||||
xr = MR(0,0)*x + MR(0,1)*y + MR(0,2); |
||||
yr = MR(1,0)*x + MR(1,1)*y + MR(1,2); |
||||
zr = MR(2,0)*x + MR(2,1)*y + MR(2,2); |
||||
xr /= zr; yr /= zr; |
||||
wr = float(k2 - idx); |
||||
|
||||
mapx_(y,x) = (wr * xl + wl * xr) / (wl + wr); |
||||
mapy_(y,x) = (wr * yl + wl * yr) / (wl + wr); |
||||
} |
||||
} |
||||
|
||||
if (result.data == frame.data) |
||||
result = Mat(frame.size(), frame.type()); |
||||
|
||||
remap(frame, result, mapx_, mapy_, INTER_LINEAR, BORDER_REPLICATE); |
||||
} |
||||
|
||||
|
||||
#ifdef HAVE_OPENCV_GPU |
||||
void MoreAccurateMotionWobbleSuppressorGpu::suppress(int idx, const gpu::GpuMat &frame, gpu::GpuMat &result) |
||||
{ |
||||
CV_Assert(motions_ && stabilizationMotions_); |
||||
|
||||
if (idx % period_ == 0) |
||||
{ |
||||
result = frame; |
||||
return; |
||||
} |
||||
|
||||
int k1 = idx / period_ * period_; |
||||
int k2 = std::min(k1 + period_, frameCount_ - 1); |
||||
|
||||
Mat S1 = (*stabilizationMotions_)[idx]; |
||||
|
||||
Mat ML = S1 * getMotion(k1, idx, *motions2_) * getMotion(k1, idx, *motions_).inv() * S1.inv(); |
||||
Mat MR = S1 * getMotion(idx, k2, *motions2_).inv() * getMotion(idx, k2, *motions_) * S1.inv(); |
||||
|
||||
gpu::calcWobbleSuppressionMaps(k1, idx, k2, frame.size(), ML, MR, mapx_, mapy_); |
||||
|
||||
if (result.data == frame.data) |
||||
result = gpu::GpuMat(frame.size(), frame.type()); |
||||
|
||||
gpu::remap(frame, result, mapx_, mapy_, INTER_LINEAR, BORDER_REPLICATE); |
||||
} |
||||
|
||||
|
||||
void MoreAccurateMotionWobbleSuppressorGpu::suppress(int idx, const Mat &frame, Mat &result) |
||||
{ |
||||
frameDevice_.upload(frame); |
||||
suppress(idx, frameDevice_, resultDevice_); |
||||
resultDevice_.download(result); |
||||
} |
||||
#endif |
||||
|
||||
} // namespace videostab
|
||||
} // namespace cv
|
||||
|
Loading…
Reference in new issue