From 3442a8deee81195fb71f23fb8b1fdfd9f67bb6ec Mon Sep 17 00:00:00 2001 From: Vladislav Samsonov Date: Mon, 24 Jul 2017 19:05:45 +0300 Subject: [PATCH] Handle incorrect flow vectors in gpc_evaluate; fixes opencv/opencv#9183 --- modules/optflow/samples/gpc_evaluate.cpp | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/modules/optflow/samples/gpc_evaluate.cpp b/modules/optflow/samples/gpc_evaluate.cpp index 7a53e8f32..f787103d0 100644 --- a/modules/optflow/samples/gpc_evaluate.cpp +++ b/modules/optflow/samples/gpc_evaluate.cpp @@ -114,6 +114,7 @@ int main( int argc, const char **argv ) std::cout << "Found " << corr.size() << " matches." << std::endl; std::cout << "Time: " << meter.getTimeSec() << " sec." << std::endl; double error = 0; + int totalCorrectFlowVectors = 0; Mat dispErr = Mat::zeros( from.size(), CV_32FC3 ); dispErr = Scalar( 0, 0, 1 ); Mat disp = Mat::zeros( from.size(), CV_32FC3 ); @@ -123,13 +124,22 @@ int main( int argc, const char **argv ) { const Point2f a = corr[i].first; const Point2f b = corr[i].second; - const Point2f c = a + gt.at< Point2f >( corr[i].first.y, corr[i].first.x ); - error += normL2( b - c ); + const Point2f gtDisplacement = gt.at< Point2f >( corr[i].first.y, corr[i].first.x ); + + // Check that flow vector is correct + if (!cvIsNaN(gtDisplacement.x) && !cvIsNaN(gtDisplacement.y) && gtDisplacement.x < 1e9 && gtDisplacement.y < 1e9) + { + const Point2f c = a + gtDisplacement; + error += normL2( b - c ); + circle( dispErr, a, 3, getFlowColor( b - c, false, 32 ), -1 ); + ++totalCorrectFlowVectors; + } + circle( disp, a, 3, getFlowColor( b - a ), -1 ); - circle( dispErr, a, 3, getFlowColor( b - c, false, 32 ), -1 ); } - error /= corr.size(); + if (totalCorrectFlowVectors) + error /= totalCorrectFlowVectors; std::cout << "Average endpoint error: " << error << " px." << std::endl;