diff --git a/modules/videostab/include/opencv2/videostab/frame_source.hpp b/modules/videostab/include/opencv2/videostab/frame_source.hpp index c22c0a4cce..3ecf6c6e40 100644 --- a/modules/videostab/include/opencv2/videostab/frame_source.hpp +++ b/modules/videostab/include/opencv2/videostab/frame_source.hpp @@ -76,7 +76,9 @@ public: virtual void reset(); virtual Mat nextFrame(); - int frameCount() { return static_cast(reader_.get(CV_CAP_PROP_FRAME_COUNT)); } + int width() { return static_cast(reader_.get(CV_CAP_PROP_FRAME_WIDTH)); } + int height() { return static_cast(reader_.get(CV_CAP_PROP_FRAME_HEIGHT)); } + int count() { return static_cast(reader_.get(CV_CAP_PROP_FRAME_COUNT)); } double fps() { return reader_.get(CV_CAP_PROP_FPS); } private: diff --git a/modules/videostab/include/opencv2/videostab/motion_stabilizing.hpp b/modules/videostab/include/opencv2/videostab/motion_stabilizing.hpp index c942de1ff0..fa6aeb2be6 100644 --- a/modules/videostab/include/opencv2/videostab/motion_stabilizing.hpp +++ b/modules/videostab/include/opencv2/videostab/motion_stabilizing.hpp @@ -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 weight_; }; diff --git a/modules/videostab/include/opencv2/videostab/stabilizer.hpp b/modules/videostab/include/opencv2/videostab/stabilizer.hpp index c20649876c..97fa62473b 100644 --- a/modules/videostab/include/opencv2/videostab/stabilizer.hpp +++ b/modules/videostab/include/opencv2/videostab/stabilizer.hpp @@ -136,12 +136,10 @@ public: void setMotionFilter(Ptr val) { motionFilter_ = val; } Ptr 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(); diff --git a/modules/videostab/src/motion_stabilizing.cpp b/modules/videostab/src/motion_stabilizing.cpp index 912f5675f1..b35a20ab49 100644 --- a/modules/videostab/src/motion_stabilizing.cpp +++ b/modules/videostab/src/motion_stabilizing.cpp @@ -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(radius_)); + radius_ = radius; + stdev_ = stdev > 0.f ? stdev : sqrt(static_cast(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; } diff --git a/modules/videostab/src/stabilizer.cpp b/modules/videostab/src/stabilizer.cpp index 0e6a855a26..bca316cec8 100644 --- a/modules/videostab/src/stabilizer.cpp +++ b/modules/videostab/src/stabilizer.cpp @@ -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(motionStabilizer_); - MotionFilterBase *motionFilterBase = dynamic_cast(motionStabilizer); - if (motionFilterBase) - motionFilterBase->update(); - stabilizationMotions_.resize(frameCount_); motionStabilizer_->stabilize(&motions_[0], frameCount_, &stabilizationMotions_[0]); diff --git a/samples/cpp/videostab.cpp b/samples/cpp/videostab.cpp index 0b966df4bb..13c96d89dd 100644 --- a/samples/cpp/videostab.cpp +++ b/samples/cpp/videostab.cpp @@ -148,7 +148,7 @@ void printHelp() " --deblur-sens=\n" " Set deblurring sensitivity (from 0 to +inf). The default is 0.1.\n\n" " -t, --trim-ratio=\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);