Added motion stabilization pipeline (videostab module)
authorAlexey Spizhevoy <no@email>
Wed, 4 Apr 2012 13:58:38 +0000 (13:58 +0000)
committerAlexey Spizhevoy <no@email>
Wed, 4 Apr 2012 13:58:38 +0000 (13:58 +0000)
modules/videostab/include/opencv2/videostab/motion_stabilizing.hpp
modules/videostab/src/motion_stabilizing.cpp

index f9775b1..d51f3a5 100644 (file)
@@ -57,12 +57,26 @@ class CV_EXPORTS IMotionStabilizer
 public:
     virtual ~IMotionStabilizer() {}
 
-    // assumes that [range.first, range.second) is in or equals to [0, size-2]
+    // assumes that [0, size-1) is in or equals to [range.first, range.second)
     virtual void stabilize(
             int size, const std::vector<Mat> &motions, std::pair<int,int> range,
             Mat *stabilizationMotions) const = 0;
 };
 
+class CV_EXPORTS MotionStabilizationPipeline : public IMotionStabilizer
+{
+public:
+    void pushBack(Ptr<IMotionStabilizer> stabilizer) { stabilizers_.push_back(stabilizer); }
+    bool empty() const { return stabilizers_.empty(); }
+
+    virtual void stabilize(
+            int size, const std::vector<Mat> &motions, std::pair<int,int> range,
+            Mat *stabilizationMotions) const;
+
+private:
+    std::vector<Ptr<IMotionStabilizer> > stabilizers_;
+};
+
 class CV_EXPORTS MotionFilterBase : public IMotionStabilizer
 {
 public:
index eb16749..e255ff8 100644 (file)
@@ -52,6 +52,33 @@ namespace cv
 namespace videostab
 {
 
+void MotionStabilizationPipeline::stabilize(
+        int size, const vector<Mat> &motions, pair<int,int> range,
+        Mat *stabilizationMotions) const
+{
+    vector<Mat> updatedMotions(motions);
+    vector<Mat> stabilizationMotions_(size);
+
+    for (int i = 0; i < size; ++i)
+        stabilizationMotions[i] = Mat::eye(3, 3, CV_32F);
+
+    for (size_t i = 0; i < stabilizers_.size(); ++i)
+    {
+        stabilizers_[i]->stabilize(size, updatedMotions, range, &stabilizationMotions_[0]);
+
+        for (int i = 0; i < size; ++i)
+            stabilizationMotions[i] = stabilizationMotions_[i] * stabilizationMotions[i];
+
+        for (int j = 0; j + 1 < size; ++j)
+        {
+            Mat S0 = stabilizationMotions[j];
+            Mat S1 = stabilizationMotions[j+1];
+            at(j, updatedMotions) = S1 * at(j, updatedMotions) * S0.inv();
+        }
+    }
+}
+
+
 void MotionFilterBase::stabilize(
         int size, const vector<Mat> &motions, pair<int,int> range, Mat *stabilizationMotions) const
 {