diff --git a/modules/videostab/include/opencv2/videostab/global_motion.hpp b/modules/videostab/include/opencv2/videostab/global_motion.hpp index d62456df7..85a37fecb 100644 --- a/modules/videostab/include/opencv2/videostab/global_motion.hpp +++ b/modules/videostab/include/opencv2/videostab/global_motion.hpp @@ -57,7 +57,8 @@ enum MotionModel { TRANSLATION = 0, TRANSLATION_AND_SCALE = 1, - AFFINE = 2 + LINEAR_SIMILARITY = 2, + AFFINE = 3 }; CV_EXPORTS Mat estimateGlobalMotionLeastSquares( @@ -74,9 +75,10 @@ struct CV_EXPORTS RansacParams RansacParams(int size, float thresh, float eps, float prob) : size(size), thresh(thresh), eps(eps), prob(prob) {} - static RansacParams affine2dMotionStd() { return RansacParams(6, 0.5f, 0.5f, 0.99f); } - static RansacParams translationAndScale2dMotionStd() { return RansacParams(3, 0.5f, 0.5f, 0.99f); } static RansacParams translationMotionStd() { return RansacParams(2, 0.5f, 0.5f, 0.99f); } + static RansacParams translationAndScale2dMotionStd() { return RansacParams(3, 0.5f, 0.5f, 0.99f); } + static RansacParams linearSimilarityMotionStd() { return RansacParams(4, 0.5f, 0.5f, 0.99f); } + static RansacParams affine2dMotionStd() { return RansacParams(6, 0.5f, 0.5f, 0.99f); } }; CV_EXPORTS Mat estimateGlobalMotionRobust( diff --git a/modules/videostab/src/global_motion.cpp b/modules/videostab/src/global_motion.cpp index 94292b328..c522a76f4 100644 --- a/modules/videostab/src/global_motion.cpp +++ b/modules/videostab/src/global_motion.cpp @@ -107,6 +107,41 @@ static Mat estimateGlobMotionLeastSquaresTranslationAndScale( } +static Mat estimateGlobMotionLeastSquaresLinearSimilarity( + int npoints, const Point2f *points0, const Point2f *points1, float *rmse) +{ + Mat_ A(2*npoints, 4), b(2*npoints, 1); + float *a0, *a1; + Point2f p0, p1; + + for (int i = 0; i < npoints; ++i) + { + a0 = A[2*i]; + a1 = A[2*i+1]; + p0 = points0[i]; + p1 = points1[i]; + a0[0] = p0.x; a0[1] = p0.y; a0[2] = 1; a0[3] = 0; + a1[0] = p0.y; a1[1] = -p0.x; a1[2] = 0; a1[3] = 1; + b(2*i,0) = p1.x; + b(2*i+1,0) = p1.y; + } + + Mat_ sol; + solve(A, b, sol, DECOMP_SVD); + + if (rmse) + *rmse = static_cast(norm(A*sol, b, NORM_L2) / sqrt(static_cast(npoints))); + + Mat_ M = Mat::eye(3, 3, CV_32F); + M(0,0) = M(1,1) = sol(0,0); + M(0,1) = sol(1,0); + M(1,0) = -sol(1,0); + M(0,2) = sol(2,0); + M(1,2) = sol(3,0); + return M; +} + + static Mat estimateGlobMotionLeastSquaresAffine( int npoints, const Point2f *points0, const Point2f *points1, float *rmse) { @@ -149,6 +184,7 @@ Mat estimateGlobalMotionLeastSquares( typedef Mat (*Impl)(int, const Point2f*, const Point2f*, float*); static Impl impls[] = { estimateGlobMotionLeastSquaresTranslation, estimateGlobMotionLeastSquaresTranslationAndScale, + estimateGlobMotionLeastSquaresLinearSimilarity, estimateGlobMotionLeastSquaresAffine }; int npoints = static_cast(points0.size()); @@ -165,6 +201,7 @@ Mat estimateGlobalMotionRobust( typedef Mat (*Impl)(int, const Point2f*, const Point2f*, float*); static Impl impls[] = { estimateGlobMotionLeastSquaresTranslation, estimateGlobMotionLeastSquaresTranslationAndScale, + estimateGlobMotionLeastSquaresLinearSimilarity, estimateGlobMotionLeastSquaresAffine }; const int npoints = static_cast(points0.size()); diff --git a/modules/videostab/src/stabilizer.cpp b/modules/videostab/src/stabilizer.cpp index 9dab8c09f..93868c215 100644 --- a/modules/videostab/src/stabilizer.cpp +++ b/modules/videostab/src/stabilizer.cpp @@ -266,7 +266,7 @@ void OnePassStabilizer::stabilizeFrame() TwoPassStabilizer::TwoPassStabilizer() { setMotionStabilizer(new GaussianMotionFilter()); - setEstimateTrimRatio(true); + setEstimateTrimRatio(false); resetImpl(); } diff --git a/samples/cpp/videostab.cpp b/samples/cpp/videostab.cpp index 0c84701ec..cbcc22a58 100644 --- a/samples/cpp/videostab.cpp +++ b/samples/cpp/videostab.cpp @@ -121,7 +121,7 @@ void printHelp() cout << "OpenCV video stabilizer.\n" "Usage: videostab [arguments]\n\n" "Arguments:\n" - " -m, --model=(transl|transl_and_scale|affine)\n" + " -m, --model=(transl|transl_and_scale|linear_sim|affine)\n" " Set motion model. The default is affine.\n" " --outlier-ratio=\n" " Outliers ratio in motion estimation. The default is 0.5.\n" @@ -259,6 +259,8 @@ int main(int argc, const char **argv) motionEstimator->setMotionModel(TRANSLATION); else if (cmd.get("model") == "transl_and_scale") motionEstimator->setMotionModel(TRANSLATION_AND_SCALE); + else if (cmd.get("model") == "linear_sim") + motionEstimator->setMotionModel(LINEAR_SIMILARITY); else if (cmd.get("model") == "affine") motionEstimator->setMotionModel(AFFINE); else if (!cmd.get("model").empty())