]> granicus.if.org Git - libvpx/commitdiff
Fix ransac random generator seeding
authorSarah Parker <sarahparker@google.com>
Tue, 11 Oct 2016 19:29:07 +0000 (12:29 -0700)
committerSarah Parker <sarahparker@google.com>
Tue, 18 Oct 2016 23:14:46 +0000 (16:14 -0700)
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

index 0c8ad67ff651ecb8e6bfa66b0b213c6c336d15e8..714d5678f9272463fd63f728a193aba271b27d14 100644 (file)
@@ -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;
       }