OpenCV 2.4.8 components for OpenCVgrabber.
[mmanager-3rdparty.git] / OpenCV2.4.8 / build / include / opencv2 / videostab / inpainting.hpp
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_INPAINTINT_HPP__
44 #define __OPENCV_VIDEOSTAB_INPAINTINT_HPP__
45
46 #include <vector>
47 #include "opencv2/core/core.hpp"
48 #include "opencv2/videostab/optical_flow.hpp"
49 #include "opencv2/videostab/fast_marching.hpp"
50 #include "opencv2/photo/photo.hpp"
51
52 namespace cv
53 {
54 namespace videostab
55 {
56
57 class CV_EXPORTS InpainterBase
58 {
59 public:
60     InpainterBase()
61         : radius_(0), frames_(0), motions_(0),
62           stabilizedFrames_(0), stabilizationMotions_(0) {}
63
64     virtual ~InpainterBase() {}
65
66     virtual void setRadius(int val) { radius_ = val; }
67     virtual int radius() const { return radius_; }
68
69     virtual void setFrames(const std::vector<Mat> &val) { frames_ = &val; }
70     virtual const std::vector<Mat>& frames() const { return *frames_; }
71
72     virtual void setMotions(const std::vector<Mat> &val) { motions_ = &val; }
73     virtual const std::vector<Mat>& motions() const { return *motions_; }
74
75     virtual void setStabilizedFrames(const std::vector<Mat> &val) { stabilizedFrames_ = &val; }
76     virtual const std::vector<Mat>& stabilizedFrames() const { return *stabilizedFrames_; }
77
78     virtual void setStabilizationMotions(const std::vector<Mat> &val) { stabilizationMotions_ = &val; }
79     virtual const std::vector<Mat>& stabilizationMotions() const { return *stabilizationMotions_; }
80
81     virtual void update() {}
82
83     virtual void inpaint(int idx, Mat &frame, Mat &mask) = 0;
84
85 protected:
86     int radius_;
87     const std::vector<Mat> *frames_;
88     const std::vector<Mat> *motions_;
89     const std::vector<Mat> *stabilizedFrames_;
90     const std::vector<Mat> *stabilizationMotions_;
91 };
92
93 class CV_EXPORTS NullInpainter : public InpainterBase
94 {
95 public:
96     virtual void inpaint(int /*idx*/, Mat &/*frame*/, Mat &/*mask*/) {}
97 };
98
99 class CV_EXPORTS InpaintingPipeline : public InpainterBase
100 {
101 public:
102     void pushBack(Ptr<InpainterBase> inpainter) { inpainters_.push_back(inpainter); }
103     bool empty() const { return inpainters_.empty(); }
104
105     virtual void setRadius(int val);
106     virtual void setFrames(const std::vector<Mat> &val);
107     virtual void setMotions(const std::vector<Mat> &val);
108     virtual void setStabilizedFrames(const std::vector<Mat> &val);
109     virtual void setStabilizationMotions(const std::vector<Mat> &val);
110
111     virtual void update();
112
113     virtual void inpaint(int idx, Mat &frame, Mat &mask);
114
115 private:
116     std::vector<Ptr<InpainterBase> > inpainters_;
117 };
118
119 class CV_EXPORTS ConsistentMosaicInpainter : public InpainterBase
120 {
121 public:
122     ConsistentMosaicInpainter();
123
124     void setStdevThresh(float val) { stdevThresh_ = val; }
125     float stdevThresh() const { return stdevThresh_; }
126
127     virtual void inpaint(int idx, Mat &frame, Mat &mask);
128
129 private:
130     float stdevThresh_;
131 };
132
133 class CV_EXPORTS MotionInpainter : public InpainterBase
134 {
135 public:
136     MotionInpainter();
137
138     void setOptFlowEstimator(Ptr<IDenseOptFlowEstimator> val) { optFlowEstimator_ = val; }
139     Ptr<IDenseOptFlowEstimator> optFlowEstimator() const { return optFlowEstimator_; }
140
141     void setFlowErrorThreshold(float val) { flowErrorThreshold_ = val; }
142     float flowErrorThreshold() const { return flowErrorThreshold_; }
143
144     void setDistThreshold(float val) { distThresh_ = val; }
145     float distThresh() const { return distThresh_; }
146
147     void setBorderMode(int val) { borderMode_ = val; }
148     int borderMode() const { return borderMode_; }
149
150     virtual void inpaint(int idx, Mat &frame, Mat &mask);
151
152 private:
153     FastMarchingMethod fmm_;
154     Ptr<IDenseOptFlowEstimator> optFlowEstimator_;
155     float flowErrorThreshold_;
156     float distThresh_;
157     int borderMode_;
158
159     Mat frame1_, transformedFrame1_;
160     Mat_<uchar> grayFrame_, transformedGrayFrame1_;
161     Mat_<uchar> mask1_, transformedMask1_;
162     Mat_<float> flowX_, flowY_, flowErrors_;
163     Mat_<uchar> flowMask_;
164 };
165
166 class CV_EXPORTS ColorAverageInpainter : public InpainterBase
167 {
168 public:
169     virtual void inpaint(int idx, Mat &frame, Mat &mask);
170
171 private:
172     FastMarchingMethod fmm_;
173 };
174
175 class CV_EXPORTS ColorInpainter : public InpainterBase
176 {
177 public:
178     ColorInpainter(int method = INPAINT_TELEA, double _radius = 2.)
179         : method_(method), radius_(_radius) {}
180
181     virtual void inpaint(int idx, Mat &frame, Mat &mask);
182
183 private:
184     int method_;
185     double radius_;
186     Mat invMask_;
187 };
188
189 CV_EXPORTS void calcFlowMask(
190         const Mat &flowX, const Mat &flowY, const Mat &errors, float maxError,
191         const Mat &mask0, const Mat &mask1, Mat &flowMask);
192
193 CV_EXPORTS void completeFrameAccordingToFlow(
194         const Mat &flowMask, const Mat &flowX, const Mat &flowY, const Mat &frame1, const Mat &mask1,
195         float distThresh, Mat& frame0, Mat &mask0);
196
197 } // namespace videostab
198 } // namespace cv
199
200 #endif