Unverified Commit a0d9138a authored by Igor Murzov's avatar Igor Murzov Committed by GitHub
Browse files

Merge pull request #2424 from GArik:master

videostab: Fix out of range data usage

* videostab: Add simple UTs for video stabilizers

Reproduces issue #5178

* videostab: Fix out of range data usage

Fixes issue #5178

* videostab: Use cv::Range for ranges instead of std::pair
parent bdfd1e75
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -66,7 +66,7 @@ public:
    virtual void setRadius(int val) { radius_ = val; }
    virtual int radius() const { return radius_; }

    virtual void deblur(int idx, Mat &frame) = 0;
    virtual void deblur(int idx, Mat &frame, const Range &range) = 0;


    // data from stabilizer
@@ -90,7 +90,7 @@ protected:
class CV_EXPORTS NullDeblurer : public DeblurerBase
{
public:
    virtual void deblur(int /*idx*/, Mat &/*frame*/) CV_OVERRIDE {}
    virtual void deblur(int /*idx*/, Mat &/*frame*/, const Range &/*range*/) CV_OVERRIDE {}
};

class CV_EXPORTS WeightingDeblurer : public DeblurerBase
@@ -101,7 +101,7 @@ public:
    void setSensitivity(float val) { sensitivity_ = val; }
    float sensitivity() const { return sensitivity_; }

    virtual void deblur(int idx, Mat &frame) CV_OVERRIDE;
    virtual void deblur(int idx, Mat &frame, const Range &range) CV_OVERRIDE;

private:
    float sensitivity_;
+6 −6
Original line number Diff line number Diff line
@@ -63,7 +63,7 @@ public:

    //! 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,
            int size, const std::vector<Mat> &motions, const Range &range,
            Mat *stabilizationMotions) = 0;
};

@@ -74,7 +74,7 @@ public:
    bool empty() const { return stabilizers_.empty(); }

    virtual void stabilize(
            int size, const std::vector<Mat> &motions, std::pair<int,int> range,
            int size, const std::vector<Mat> &motions, const Range &range,
            Mat *stabilizationMotions) CV_OVERRIDE;

private:
@@ -87,10 +87,10 @@ public:
    virtual ~MotionFilterBase() {}

    virtual Mat stabilize(
            int idx, const std::vector<Mat> &motions, std::pair<int,int> range) = 0;
            int idx, const std::vector<Mat> &motions, const Range &range) = 0;

    virtual void stabilize(
            int size, const std::vector<Mat> &motions, std::pair<int,int> range,
            int size, const std::vector<Mat> &motions, const Range &range,
            Mat *stabilizationMotions) CV_OVERRIDE;
};

@@ -104,7 +104,7 @@ public:
    float stdev() const { return stdev_; }

    virtual Mat stabilize(
            int idx, const std::vector<Mat> &motions, std::pair<int,int> range) CV_OVERRIDE;
            int idx, const std::vector<Mat> &motions, const Range &range) CV_OVERRIDE;

private:
    int radius_;
@@ -141,7 +141,7 @@ public:
    float weight4() const { return w4_; }

    virtual void stabilize(
            int size, const std::vector<Mat> &motions, std::pair<int,int> range,
            int size, const std::vector<Mat> &motions, const Range &range,
            Mat *stabilizationMotions) CV_OVERRIDE;

private:
+2 −2
Original line number Diff line number Diff line
@@ -125,9 +125,9 @@ void printHelp()
            "  -bm=, --border-mode=(replicate|reflect|const)\n"
            "      Set border extrapolation mode. The default is replicate.\n\n"
            "  --mosaic=(yes|no)\n"
            "      Do consistent mosaicing. The default is no.\n"
            "      Do consistent mosaicking. The default is no.\n"
            "  --mosaic-stdev=<float_number>\n"
            "      Consistent mosaicing stdev threshold. The default is 10.0.\n\n"
            "      Consistent mosaicking stdev threshold. The default is 10.0.\n\n"
            "  -mi=, --motion-inpaint=(yes|no)\n"
            "      Do motion inpainting (requires CUDA support). The default is no.\n"
            "  --mi-dist-thresh=<float_number>\n"
+4 −2
Original line number Diff line number Diff line
@@ -70,7 +70,7 @@ WeightingDeblurer::WeightingDeblurer()
}


void WeightingDeblurer::deblur(int idx, Mat &frame)
void WeightingDeblurer::deblur(int idx, Mat &frame, const Range &range)
{
    CV_INSTRUMENT_REGION();

@@ -93,7 +93,9 @@ void WeightingDeblurer::deblur(int idx, Mat &frame)
        }
    }

    for (int k = idx - radius_; k <= idx + radius_; ++k)
    int iMin = std::max(idx - radius_, range.start);
    int iMax = std::min(idx + radius_, range.end);
    for (int k = iMin; k <= iMax; ++k)
    {
        const Mat &neighbor = at(k, *frames_);
        float bRatio = at(idx, *blurrinessRates_) / at(k, *blurrinessRates_);
+7 −7
Original line number Diff line number Diff line
@@ -52,7 +52,7 @@ namespace videostab
{

void MotionStabilizationPipeline::stabilize(
        int size, const std::vector<Mat> &motions, std::pair<int,int> range, Mat *stabilizationMotions)
        int size, const std::vector<Mat> &motions, const Range &range, Mat *stabilizationMotions)
{
    std::vector<Mat> updatedMotions(motions.size());
    for (size_t i = 0; i < motions.size(); ++i)
@@ -81,7 +81,7 @@ void MotionStabilizationPipeline::stabilize(


void MotionFilterBase::stabilize(
        int size, const std::vector<Mat> &motions, std::pair<int,int> range, Mat *stabilizationMotions)
        int size, const std::vector<Mat> &motions, const Range &range, Mat *stabilizationMotions)
{
    for (int i = 0; i < size; ++i)
        stabilizationMotions[i] = stabilize(i, motions, range);
@@ -102,13 +102,13 @@ void GaussianMotionFilter::setParams(int _radius, float _stdev)
}


Mat GaussianMotionFilter::stabilize(int idx, const std::vector<Mat> &motions, std::pair<int,int> range)
Mat GaussianMotionFilter::stabilize(int idx, const std::vector<Mat> &motions, const Range &range)
{
    const Mat &cur = at(idx, motions);
    Mat res = Mat::zeros(cur.size(), cur.type());
    float sum = 0.f;
    int iMin = std::max(idx - radius_, range.first);
    int iMax = std::min(idx + radius_, range.second);
    int iMin = std::max(idx - radius_, range.start);
    int iMax = std::min(idx + radius_, range.end);
    for (int i = iMin; i <= iMax; ++i)
    {
        res += weight_[radius_ + i - idx] * getMotion(idx, i, motions);
@@ -132,7 +132,7 @@ LpMotionStabilizer::LpMotionStabilizer(MotionModel model)

#ifndef HAVE_CLP

void LpMotionStabilizer::stabilize(int, const std::vector<Mat>&, std::pair<int,int>, Mat*)
void LpMotionStabilizer::stabilize(int, const std::vector<Mat>&, const Range &, Mat*)
{
    CV_Error(Error::StsError, "The library is built without Clp support");
}
@@ -140,7 +140,7 @@ void LpMotionStabilizer::stabilize(int, const std::vector<Mat>&, std::pair<int,i
#else

void LpMotionStabilizer::stabilize(
        int size, const std::vector<Mat> &motions, std::pair<int,int> /*range*/, Mat *stabilizationMotions)
        int size, const std::vector<Mat> &motions, const Range &/*range*/, Mat *stabilizationMotions)
{
    CV_Assert(model_ <= MM_AFFINE);

Loading