From efa6582235d09a6c9756f723e11ff41d0923c3a8 Mon Sep 17 00:00:00 2001 From: Sarah Parker Date: Tue, 11 Oct 2016 12:29:07 -0700 Subject: [PATCH] Fix ransac random generator seeding Ransac's get_rand_indices originally used rand_r seeded with the same value every time, producing the same random sequence at every iteration. This causes the global motion parameters to be slightly less accurate because ransac cannot improve the model fit after the first attempt. Change-Id: Idca2f88468ea21d19ba41ab66e5a2744ee33aade --- av1/encoder/ransac.c | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/av1/encoder/ransac.c b/av1/encoder/ransac.c index 0c8ad67ff..714d5678f 100644 --- a/av1/encoder/ransac.c +++ b/av1/encoder/ransac.c @@ -92,16 +92,16 @@ static void project_points_double_homography(double *mat, double *points, } } -static int get_rand_indices(int npoints, int minpts, int *indices) { +static int get_rand_indices(int npoints, int minpts, int *indices, + unsigned int *seed) { int i, j; - unsigned int seed = (unsigned int)npoints; - int ptr = rand_r(&seed) % npoints; + int ptr = rand_r(seed) % npoints; if (minpts > npoints) return 0; indices[0] = ptr; ptr = (ptr == npoints - 1 ? 0 : ptr + 1); i = 1; while (i < minpts) { - int index = rand_r(&seed) % npoints; + int index = rand_r(seed) % npoints; while (index) { ptr = (ptr == npoints - 1 ? 0 : ptr + 1); for (j = 0; j < i; ++j) { @@ -132,6 +132,7 @@ static int ransac(double *matched_points, int npoints, int *number_of_inliers, int N = 10000, trial_count = 0; int i; int ret_val = 0; + unsigned int seed = (unsigned int)npoints; int max_inliers = 0; double best_variance = 0.0; @@ -139,7 +140,7 @@ static int ransac(double *matched_points, int npoints, int *number_of_inliers, WarpedMotionParams wm; double points1[2 * MAX_MINPTS]; double points2[2 * MAX_MINPTS]; - int indices[MAX_MINPTS]; + int indices[MAX_MINPTS] = { 0 }; double *best_inlier_set1; double *best_inlier_set2; @@ -153,10 +154,6 @@ static int ransac(double *matched_points, int npoints, int *number_of_inliers, double *cnp1, *cnp2; double T1[9], T2[9]; - // srand((unsigned)time(NULL)) ; - // better to make this deterministic for a given sequence for ease of testing - srand(npoints); - *number_of_inliers = 0; if (npoints < minpts * MINPTS_MULTIPLIER) { printf("Cannot find motion with %d matches\n", npoints); @@ -203,7 +200,7 @@ static int ransac(double *matched_points, int npoints, int *number_of_inliers, int num_degenerate_iter = 0; while (degenerate) { num_degenerate_iter++; - if (!get_rand_indices(npoints, minpts, indices)) { + if (!get_rand_indices(npoints, minpts, indices, &seed)) { ret_val = 1; goto finish_ransac; } -- GitLab