Updated videostab module
authorAlexey Spizhevoy <no@email>
Mon, 2 Apr 2012 12:26:05 +0000 (12:26 +0000)
committerAlexey Spizhevoy <no@email>
Mon, 2 Apr 2012 12:26:05 +0000 (12:26 +0000)
modules/videostab/include/opencv2/videostab/frame_source.hpp
modules/videostab/include/opencv2/videostab/motion_stabilizing.hpp
modules/videostab/include/opencv2/videostab/stabilizer.hpp
modules/videostab/src/motion_stabilizing.cpp
modules/videostab/src/stabilizer.cpp
samples/cpp/videostab.cpp

index c22c0a4..3ecf6c6 100644 (file)
@@ -76,7 +76,9 @@ public:
     virtual void reset();
     virtual Mat nextFrame();
 
-    int frameCount() { return static_cast<int>(reader_.get(CV_CAP_PROP_FRAME_COUNT)); }
+    int width() { return static_cast<int>(reader_.get(CV_CAP_PROP_FRAME_WIDTH)); }
+    int height() { return static_cast<int>(reader_.get(CV_CAP_PROP_FRAME_HEIGHT)); }
+    int count() { return static_cast<int>(reader_.get(CV_CAP_PROP_FRAME_COUNT)); }
     double fps() { return reader_.get(CV_CAP_PROP_FPS); }
 
 private:
index c942de1..fa6aeb2 100644 (file)
@@ -54,46 +54,31 @@ namespace videostab
 class CV_EXPORTS IMotionStabilizer
 {
 public:
+    virtual ~IMotionStabilizer() {}
     virtual void stabilize(const Mat *motions, int size, Mat *stabilizationMotions) const = 0;
 };
 
 class CV_EXPORTS MotionFilterBase : public IMotionStabilizer
 {
 public:
-    MotionFilterBase() : radius_(0) {}
     virtual ~MotionFilterBase() {}
-
-    virtual void setRadius(int val) { radius_ = val; }
-    virtual int radius() const { return radius_; }
-
-    virtual void update() {}
-
     virtual Mat stabilize(int index, const Mat *motions, int size) const = 0;
     virtual void stabilize(const Mat *motions, int size, Mat *stabilizationMotions) const;
-
-protected:
-    int radius_;
 };
 
 class CV_EXPORTS GaussianMotionFilter : public MotionFilterBase
 {
 public:
-    GaussianMotionFilter() : stdev_(-1.f) {}
-    GaussianMotionFilter(int radius, float stdev = -1.f)
-    {
-        setRadius(radius);
-        setStdev(stdev);
-        update();
-    }
+    GaussianMotionFilter(int radius = 15, float stdev = -1.f) { setParams(radius, stdev); }
 
-    void setStdev(float val) { stdev_ = val; }
+    void setParams(int radius, float stdev = -1.f);
+    int radius() const { return radius_; }
     float stdev() const { return stdev_; }
 
-    virtual void update();
-
     virtual Mat stabilize(int index, const Mat *motions, int size) const;
 
 private:
+    int radius_;
     float stdev_;
     std::vector<float> weight_;
 };
index c206498..97fa624 100644 (file)
@@ -136,12 +136,10 @@ public:
     void setMotionFilter(Ptr<MotionFilterBase> val) { motionFilter_ = val; }
     Ptr<MotionFilterBase> motionFilter() const { return motionFilter_; }
 
-    virtual void reset() { resetImpl(); }
+    virtual void reset();
     virtual Mat nextFrame() { return nextStabilizedFrame(); }
 
 private:
-    void resetImpl();
-
     virtual void setUp(Mat &firstFrame);
     virtual void estimateMotion();
     virtual void stabilizeFrame();
index 912f567..b35a20a 100644 (file)
@@ -58,13 +58,15 @@ void MotionFilterBase::stabilize(const Mat *motions, int size, Mat *stabilizatio
 }
 
 
-void GaussianMotionFilter::update()
+void GaussianMotionFilter::setParams(int radius, float stdev)
 {
-    float sigma = stdev_ > 0.f ? stdev_ : sqrt(static_cast<float>(radius_));
+    radius_ = radius;
+    stdev_ = stdev > 0.f ? stdev : sqrt(static_cast<float>(radius_));
+
     float sum = 0;
     weight_.resize(2*radius_ + 1);
     for (int i = -radius_; i <= radius_; ++i)
-        sum += weight_[radius_ + i] = std::exp(-i*i/(sigma*sigma));
+        sum += weight_[radius_ + i] = std::exp(-i*i/(stdev_*stdev_));
     for (int i = -radius_; i <= radius_; ++i)
         weight_[radius_ + i] /= sum;
 }
index 0e6a855..bca316c 100644 (file)
@@ -199,11 +199,11 @@ void StabilizerBase::stabilizeFrame(const Mat &stabilizationMotion)
 OnePassStabilizer::OnePassStabilizer()
 {
     setMotionFilter(new GaussianMotionFilter());
-    resetImpl();
+    reset();
 }
 
 
-void OnePassStabilizer::resetImpl()
+void OnePassStabilizer::reset()
 {
     curPos_ = -1;
     curStabilizedPos_ = -1;
@@ -238,8 +238,6 @@ void OnePassStabilizer::setUp(Mat &firstFrame)
 
     at(0, frames_) = firstFrame;
 
-    motionFilter_->update();
-
     StabilizerBase::setUp(cacheSize, firstFrame);
 }
 
@@ -327,11 +325,6 @@ void TwoPassStabilizer::runPrePassIfNecessary()
             motions_.push_back(Mat::eye(3, 3, CV_32F));
         log_->print("\n");
 
-        IMotionStabilizer *motionStabilizer = static_cast<IMotionStabilizer*>(motionStabilizer_);
-        MotionFilterBase *motionFilterBase = dynamic_cast<MotionFilterBase*>(motionStabilizer);
-        if (motionFilterBase)
-            motionFilterBase->update();
-
         stabilizationMotions_.resize(frameCount_);
         motionStabilizer_->stabilize(&motions_[0], frameCount_, &stabilizationMotions_[0]);
 
index 0b966df..13c96d8 100644 (file)
@@ -148,7 +148,7 @@ void printHelp()
             "  --deblur-sens=<float_number>\n"
             "      Set deblurring sensitivity (from 0 to +inf). The default is 0.1.\n\n"
             "  -t, --trim-ratio=<float_number>\n"
-            "      Set trimming ratio (from 0 to 0.5). The default is 0.0.\n"
+            "      Set trimming ratio (from 0 to 0.5). The default is 0.1.\n"
             "  --est-trim=(yes|no)\n"
             "      Estimate trim ratio automatically. The default is yes (that leads to two passes,\n"
             "      you can turn it off if you want to use one pass only).\n"
@@ -197,7 +197,7 @@ int main(int argc, const char **argv)
                 "{ | deblur | no | }"
                 "{ | deblur-sens | 0.1 | }"
                 "{ | est-trim | yes | }"
-                "{ t | trim-ratio | 0.0 | }"
+                "{ t | trim-ratio | 0.1 | }"
                 "{ | incl-constr | no | }"
                 "{ | border-mode | replicate | }"
                 "{ | mosaic | no | }"
@@ -248,7 +248,7 @@ int main(int argc, const char **argv)
         if (inputPath.empty()) throw runtime_error("specify video file path");
 
         VideoFileSource *source = new VideoFileSource(inputPath);
-        cout << "frame count: " << source->frameCount() << endl;
+        cout << "frame count: " << source->count() << endl;
         if (arg("fps") == "auto") outputFps = source->fps();  else outputFps = argd("fps");
         stabilizer->setFrameSource(source);