Skip to content

Commit 2e195a1

Browse files
authored
Merge pull request #1871 from alalek:move_videostab_contrib
2 parents 35fbfdd + ee8cac9 commit 2e195a1

34 files changed

+6833
-0
lines changed

modules/videostab/CMakeLists.txt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
set(the_description "Video stabilization")
2+
3+
if(HAVE_CUDA)
4+
ocv_warnings_disable(CMAKE_CXX_FLAGS -Wundef -Wmissing-declarations -Wshadow -Wunused-parameter)
5+
endif()
6+
7+
if(DEFINED WINRT AND NOT DEFINED ENABLE_WINRT_MODE_NATIVE)
8+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /ZW")
9+
endif()
10+
11+
ocv_define_module(videostab opencv_imgproc opencv_features2d opencv_video opencv_photo opencv_calib3d
12+
OPTIONAL opencv_cudawarping opencv_cudaoptflow opencv_videoio WRAP python)
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
/*M///////////////////////////////////////////////////////////////////////////////////////
2+
//
3+
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
4+
//
5+
// By downloading, copying, installing or using the software you agree to this license.
6+
// If you do not agree to this license, do not download, install,
7+
// copy or use the software.
8+
//
9+
//
10+
// License Agreement
11+
// For Open Source Computer Vision Library
12+
//
13+
// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
14+
// Copyright (C) 2009-2011, Willow Garage Inc., all rights reserved.
15+
// Third party copyrights are property of their respective owners.
16+
//
17+
// Redistribution and use in source and binary forms, with or without modification,
18+
// are permitted provided that the following conditions are met:
19+
//
20+
// * Redistribution's of source code must retain the above copyright notice,
21+
// this list of conditions and the following disclaimer.
22+
//
23+
// * Redistribution's in binary form must reproduce the above copyright notice,
24+
// this list of conditions and the following disclaimer in the documentation
25+
// and/or other materials provided with the distribution.
26+
//
27+
// * The name of the copyright holders may not be used to endorse or promote products
28+
// derived from this software without specific prior written permission.
29+
//
30+
// This software is provided by the copyright holders and contributors "as is" and
31+
// any express or implied warranties, including, but not limited to, the implied
32+
// warranties of merchantability and fitness for a particular purpose are disclaimed.
33+
// In no event shall the Intel Corporation or contributors be liable for any direct,
34+
// indirect, incidental, special, exemplary, or consequential damages
35+
// (including, but not limited to, procurement of substitute goods or services;
36+
// loss of use, data, or profits; or business interruption) however caused
37+
// and on any theory of liability, whether in contract, strict liability,
38+
// or tort (including negligence or otherwise) arising in any way out of
39+
// the use of this software, even if advised of the possibility of such damage.
40+
//
41+
//M*/
42+
43+
#ifndef OPENCV_VIDEOSTAB_HPP
44+
#define OPENCV_VIDEOSTAB_HPP
45+
46+
/**
47+
@defgroup videostab Video Stabilization
48+
49+
The video stabilization module contains a set of functions and classes that can be used to solve the
50+
problem of video stabilization. There are a few methods implemented, most of them are described in
51+
the papers @cite OF06 and @cite G11 . However, there are some extensions and deviations from the original
52+
paper methods.
53+
54+
### References
55+
56+
1. "Full-Frame Video Stabilization with Motion Inpainting"
57+
Yasuyuki Matsushita, Eyal Ofek, Weina Ge, Xiaoou Tang, Senior Member, and Heung-Yeung Shum
58+
2. "Auto-Directed Video Stabilization with Robust L1 Optimal Camera Paths"
59+
Matthias Grundmann, Vivek Kwatra, Irfan Essa
60+
61+
@{
62+
@defgroup videostab_motion Global Motion Estimation
63+
64+
The video stabilization module contains a set of functions and classes for global motion estimation
65+
between point clouds or between images. In the last case features are extracted and matched
66+
internally. For the sake of convenience the motion estimation functions are wrapped into classes.
67+
Both the functions and the classes are available.
68+
69+
@defgroup videostab_marching Fast Marching Method
70+
71+
The Fast Marching Method @cite Telea04 is used in of the video stabilization routines to do motion and
72+
color inpainting. The method is implemented is a flexible way and it's made public for other users.
73+
74+
@}
75+
76+
*/
77+
78+
#include "opencv2/videostab/stabilizer.hpp"
79+
#include "opencv2/videostab/ring_buffer.hpp"
80+
81+
#endif
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
/*M///////////////////////////////////////////////////////////////////////////////////////
2+
//
3+
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
4+
//
5+
// By downloading, copying, installing or using the software you agree to this license.
6+
// If you do not agree to this license, do not download, install,
7+
// copy or use the software.
8+
//
9+
//
10+
// License Agreement
11+
// For Open Source Computer Vision Library
12+
//
13+
// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
14+
// Copyright (C) 2009-2011, Willow Garage Inc., all rights reserved.
15+
// Third party copyrights are property of their respective owners.
16+
//
17+
// Redistribution and use in source and binary forms, with or without modification,
18+
// are permitted provided that the following conditions are met:
19+
//
20+
// * Redistribution's of source code must retain the above copyright notice,
21+
// this list of conditions and the following disclaimer.
22+
//
23+
// * Redistribution's in binary form must reproduce the above copyright notice,
24+
// this list of conditions and the following disclaimer in the documentation
25+
// and/or other materials provided with the distribution.
26+
//
27+
// * The name of the copyright holders may not be used to endorse or promote products
28+
// derived from this software without specific prior written permission.
29+
//
30+
// This software is provided by the copyright holders and contributors "as is" and
31+
// any express or implied warranties, including, but not limited to, the implied
32+
// warranties of merchantability and fitness for a particular purpose are disclaimed.
33+
// In no event shall the Intel Corporation or contributors be liable for any direct,
34+
// indirect, incidental, special, exemplary, or consequential damages
35+
// (including, but not limited to, procurement of substitute goods or services;
36+
// loss of use, data, or profits; or business interruption) however caused
37+
// and on any theory of liability, whether in contract, strict liability,
38+
// or tort (including negligence or otherwise) arising in any way out of
39+
// the use of this software, even if advised of the possibility of such damage.
40+
//
41+
//M*/
42+
43+
#ifndef OPENCV_VIDEOSTAB_DEBLURRING_HPP
44+
#define OPENCV_VIDEOSTAB_DEBLURRING_HPP
45+
46+
#include <vector>
47+
#include "opencv2/core.hpp"
48+
49+
namespace cv
50+
{
51+
namespace videostab
52+
{
53+
54+
//! @addtogroup videostab
55+
//! @{
56+
57+
CV_EXPORTS float calcBlurriness(const Mat &frame);
58+
59+
class CV_EXPORTS DeblurerBase
60+
{
61+
public:
62+
DeblurerBase() : radius_(0), frames_(0), motions_(0), blurrinessRates_(0) {}
63+
64+
virtual ~DeblurerBase() {}
65+
66+
virtual void setRadius(int val) { radius_ = val; }
67+
virtual int radius() const { return radius_; }
68+
69+
virtual void deblur(int idx, Mat &frame) = 0;
70+
71+
72+
// data from stabilizer
73+
74+
virtual void setFrames(const std::vector<Mat> &val) { frames_ = &val; }
75+
virtual const std::vector<Mat>& frames() const { return *frames_; }
76+
77+
virtual void setMotions(const std::vector<Mat> &val) { motions_ = &val; }
78+
virtual const std::vector<Mat>& motions() const { return *motions_; }
79+
80+
virtual void setBlurrinessRates(const std::vector<float> &val) { blurrinessRates_ = &val; }
81+
virtual const std::vector<float>& blurrinessRates() const { return *blurrinessRates_; }
82+
83+
protected:
84+
int radius_;
85+
const std::vector<Mat> *frames_;
86+
const std::vector<Mat> *motions_;
87+
const std::vector<float> *blurrinessRates_;
88+
};
89+
90+
class CV_EXPORTS NullDeblurer : public DeblurerBase
91+
{
92+
public:
93+
virtual void deblur(int /*idx*/, Mat &/*frame*/) CV_OVERRIDE {}
94+
};
95+
96+
class CV_EXPORTS WeightingDeblurer : public DeblurerBase
97+
{
98+
public:
99+
WeightingDeblurer();
100+
101+
void setSensitivity(float val) { sensitivity_ = val; }
102+
float sensitivity() const { return sensitivity_; }
103+
104+
virtual void deblur(int idx, Mat &frame) CV_OVERRIDE;
105+
106+
private:
107+
float sensitivity_;
108+
Mat_<float> bSum_, gSum_, rSum_, wSum_;
109+
};
110+
111+
//! @}
112+
113+
} // namespace videostab
114+
} // namespace cv
115+
116+
#endif
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
/*M///////////////////////////////////////////////////////////////////////////////////////
2+
//
3+
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
4+
//
5+
// By downloading, copying, installing or using the software you agree to this license.
6+
// If you do not agree to this license, do not download, install,
7+
// copy or use the software.
8+
//
9+
//
10+
// License Agreement
11+
// For Open Source Computer Vision Library
12+
//
13+
// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
14+
// Copyright (C) 2009-2011, Willow Garage Inc., all rights reserved.
15+
// Third party copyrights are property of their respective owners.
16+
//
17+
// Redistribution and use in source and binary forms, with or without modification,
18+
// are permitted provided that the following conditions are met:
19+
//
20+
// * Redistribution's of source code must retain the above copyright notice,
21+
// this list of conditions and the following disclaimer.
22+
//
23+
// * Redistribution's in binary form must reproduce the above copyright notice,
24+
// this list of conditions and the following disclaimer in the documentation
25+
// and/or other materials provided with the distribution.
26+
//
27+
// * The name of the copyright holders may not be used to endorse or promote products
28+
// derived from this software without specific prior written permission.
29+
//
30+
// This software is provided by the copyright holders and contributors "as is" and
31+
// any express or implied warranties, including, but not limited to, the implied
32+
// warranties of merchantability and fitness for a particular purpose are disclaimed.
33+
// In no event shall the Intel Corporation or contributors be liable for any direct,
34+
// indirect, incidental, special, exemplary, or consequential damages
35+
// (including, but not limited to, procurement of substitute goods or services;
36+
// loss of use, data, or profits; or business interruption) however caused
37+
// and on any theory of liability, whether in contract, strict liability,
38+
// or tort (including negligence or otherwise) arising in any way out of
39+
// the use of this software, even if advised of the possibility of such damage.
40+
//
41+
//M*/
42+
43+
#ifndef OPENCV_VIDEOSTAB_FAST_MARCHING_HPP
44+
#define OPENCV_VIDEOSTAB_FAST_MARCHING_HPP
45+
46+
#include <cmath>
47+
#include <queue>
48+
#include <algorithm>
49+
#include "opencv2/core.hpp"
50+
51+
namespace cv
52+
{
53+
namespace videostab
54+
{
55+
56+
//! @addtogroup videostab_marching
57+
//! @{
58+
59+
/** @brief Describes the Fast Marching Method implementation.
60+
61+
See http://iwi.eldoc.ub.rug.nl/FILES/root/2004/JGraphToolsTelea/2004JGraphToolsTelea.pdf
62+
*/
63+
class CV_EXPORTS FastMarchingMethod
64+
{
65+
public:
66+
FastMarchingMethod() : inf_(1e6f), size_(0) {}
67+
68+
/** @brief Template method that runs the Fast Marching Method.
69+
70+
@param mask Image mask. 0 value indicates that the pixel value must be inpainted, 255 indicates
71+
that the pixel value is known, other values aren't acceptable.
72+
@param inpaint Inpainting functor that overloads void operator ()(int x, int y).
73+
@return Inpainting functor.
74+
*/
75+
template <typename Inpaint>
76+
Inpaint run(const Mat &mask, Inpaint inpaint);
77+
78+
/**
79+
@return Distance map that's created during working of the method.
80+
*/
81+
Mat distanceMap() const { return dist_; }
82+
83+
private:
84+
enum { INSIDE = 0, BAND = 1, KNOWN = 255 };
85+
86+
struct DXY
87+
{
88+
float dist;
89+
int x, y;
90+
91+
DXY() : dist(0), x(0), y(0) {}
92+
DXY(float _dist, int _x, int _y) : dist(_dist), x(_x), y(_y) {}
93+
bool operator <(const DXY &dxy) const { return dist < dxy.dist; }
94+
};
95+
96+
float solve(int x1, int y1, int x2, int y2) const;
97+
int& indexOf(const DXY &dxy) { return index_(dxy.y, dxy.x); }
98+
99+
void heapUp(int idx);
100+
void heapDown(int idx);
101+
void heapAdd(const DXY &dxy);
102+
void heapRemoveMin();
103+
104+
float inf_;
105+
106+
cv::Mat_<uchar> flag_; // flag map
107+
cv::Mat_<float> dist_; // distance map
108+
109+
cv::Mat_<int> index_; // index of point in the narrow band
110+
std::vector<DXY> narrowBand_; // narrow band heap
111+
int size_; // narrow band size
112+
};
113+
114+
//! @}
115+
116+
} // namespace videostab
117+
} // namespace cv
118+
119+
#include "fast_marching_inl.hpp"
120+
121+
#endif

0 commit comments

Comments
 (0)