diff --git a/modules/video/test/test_tvl1optflow.cpp b/modules/video/test/test_tvl1optflow.cpp index 3976f25599..b0b962c43b 100644 --- a/modules/video/test/test_tvl1optflow.cpp +++ b/modules/video/test/test_tvl1optflow.cpp @@ -116,34 +116,39 @@ namespace return !cvIsNaN(u.x) && !cvIsNaN(u.y) && (fabs(u.x) < 1e9) && (fabs(u.y) < 1e9); } - double calcRMSE(const Mat_& flow1, const Mat_& flow2) + void check(const Mat_& gold, const Mat_& flow, double threshold = 0.1, double expectedAccuracy = 0.95) { - double sum = 0.0; - int counter = 0; + threshold = threshold*threshold; - for (int i = 0; i < flow1.rows; ++i) + size_t gold_counter = 0; + size_t valid_counter = 0; + + for (int i = 0; i < gold.rows; ++i) { - for (int j = 0; j < flow1.cols; ++j) + for (int j = 0; j < gold.cols; ++j) { - const Point2f u1 = flow1(i, j); - const Point2f u2 = flow2(i, j); + const Point2f u1 = gold(i, j); + const Point2f u2 = flow(i, j); - if (isFlowCorrect(u1) && isFlowCorrect(u2)) + if (isFlowCorrect(u1)) { - const Point2f diff = u1 - u2; - sum += diff.ddot(diff); - ++counter; + gold_counter++; + if (isFlowCorrect(u2)) + { + const Point2f diff = u1 - u2; + double err = diff.ddot(diff); + if (err <= threshold) + valid_counter++; + } } } } - return sqrt(sum / (1e-9 + counter)); + EXPECT_GE(valid_counter, expectedAccuracy * gold_counter); } } TEST(Video_calcOpticalFlowDual_TVL1, Regression) { - const double MAX_RMSE = 0.03; - const string frame1_path = TS::ptr()->get_data_path() + "optflow/RubberWhale1.png"; const string frame2_path = TS::ptr()->get_data_path() + "optflow/RubberWhale2.png"; const string gold_flow_path = TS::ptr()->get_data_path() + "optflow/tvl1_flow.flo"; @@ -167,7 +172,6 @@ TEST(Video_calcOpticalFlowDual_TVL1, Regression) ASSERT_EQ(gold.rows, flow.rows); ASSERT_EQ(gold.cols, flow.cols); - double err = calcRMSE(gold, flow); - EXPECT_LE(err, MAX_RMSE); + check(gold, flow); #endif }