int main_cases(int c, char *v[]) { if (c != 6 && c != 7 && c != 8) { fprintf(stderr, "usage:\n\t%s {line,aff,affn,fm} " // 0 1 "ntrials maxerr minliers omodel [omask [oinliers]] <data\n",*v); //2 3 4 5 6 7 return EXIT_FAILURE; } // parse input options char *model_id = v[1]; int ntrials = atoi(v[2]); float maxerr = atof(v[3]); int minliers = atoi(v[4]); char *filename_omodel = c > 5 ? v[5] : 0; char *filename_omask = c > 6 ? v[6] : 0; char *filename_inliers = c > 7 ? v[7] : 0; // declare context variables int modeldim, datadim, nfit; ransac_error_evaluation_function *model_evaluation; ransac_model_generating_function *model_generation; ransac_model_accepting_function *model_acceptation = NULL; void *user_data = NULL; // fill context variables according to ransac case if (0 == strcmp(model_id, "line")) { datadim = 2; modeldim = 3; nfit = 2; model_evaluation = distance_of_point_to_straight_line; model_generation = straight_line_through_two_points; } else if (0 == strcmp(model_id, "aff")) { datadim = 4; modeldim = 6; nfit = 3; model_evaluation = affine_match_error; model_generation = affine_map_from_three_pairs; } else if (0 == strcmp(model_id, "affn")) { datadim = 4; modeldim = 6; nfit = 3; model_evaluation = affine_match_error; model_generation = affine_map_from_three_pairs; model_acceptation = affine_map_is_reasonable; } else if (0 == strcmp(model_id, "hom")) { datadim = 4; modeldim = 9; nfit = 4; model_evaluation = homographic_match_error; model_generation = homography_from_four; //model_acceptation = homography_is_reasonable; model_acceptation = NULL; } else if (0 == strcmp(model_id, "aff3d")) { datadim = 6; modeldim = 12; nfit = 4; model_evaluation = affine3d_match_error; model_generation = affine3d_map_from_four_pairs; } else if (0 == strcmp(model_id, "fm")) { // fundamental matrix datadim = 4; modeldim = 9; nfit = 7; model_evaluation = epipolar_error; model_generation = seven_point_algorithm; //model_acceptation = fundamental_matrix_is_reasonable; } else if (0 == strcmp(model_id, "fmn")) { // fundamental matrix int main_hack_fundamental_matrix(int,char*[]); return main_hack_fundamental_matrix(c-1, v+1); } else if (0 == strcmp(model_id, "fmnt")) { // fundamental matrix int main_hack_fundamental_trimatrix(int,char*[]); return main_hack_fundamental_trimatrix(c-1, v+1); } else { printf("unrecognized model \"%s\"\n", model_id); return EXIT_FAILURE; } // read input data int n; float *data = read_ascii_floats(stdin, &n); n /= datadim; // call the ransac function to fit a model to data float model[modeldim]; bool *mask = xmalloc(n * sizeof*mask); int n_inliers = ransac(mask, model, data, datadim, n, modeldim, model_evaluation, model_generation, nfit, ntrials, minliers, maxerr, model_acceptation, user_data); // print a summary of the results if (n_inliers > 0) { printf("RANSAC found a model with %d inliers\n", n_inliers); printf("parameters ="); for (int i = 0; i < modeldim; i++) printf(" %g", model[i]); printf("\n"); } else printf("RANSAC found no model\n"); // if requested, save the inlying data points if (filename_inliers) { FILE *f = xfopen(filename_inliers, "w"); for (int i = 0; i < n; i++) if (mask[i]) { for(int d = 0; d < datadim; d++) fprintf(f,"%g ",data[i*datadim+d]); fprintf(f,"\n"); } xfclose(f); } // if requested, save the inlier mask if (filename_omask) { FILE *f = xfopen(filename_omask, "w"); for (int i = 0; i < n; i++) fprintf(f, mask[i]?" 1":" 0"); fprintf(f, "\n"); xfclose(f); } // if requested, save the model if (filename_omodel) { FILE *f = xfopen(filename_omodel, "w"); for (int i = 0; i < modeldim; i++) fprintf(f, "%lf%c", model[i], i==modeldim-1?'\n':' '); xfclose(f); } return EXIT_SUCCESS; }
int main_hack_fundamental_trimatrix(int c, char *v[]) { if (c < 4) { fprintf(stderr, "usage:\n\t%s fmnt " // -1 0 "ntrials maxerr minliers [inliers] <data\n", *v); // 1 2 3 4 return EXIT_FAILURE; } int ntrials = atoi(v[1]); float maxerr = atof(v[2]); int minliers = atoi(v[3]); char *inliers_filename = v[4]; fprintf(stderr, "WARNING: ignoring parameter minliers=%d\n", minliers); int datadim = 6; int modeldim = 18; int n; float *data = read_ascii_floats(stdin, &n); n /= datadim; float model[modeldim]; bool *mask = xmalloc(n * sizeof*mask); for (int i = 0; i < n; i++) mask[i] = false; int n_inliers = find_fundamental_pair_by_ransac(mask, model, data, n, ntrials, maxerr); // print a summary of the results if (n_inliers > 0) { printf("RANSAC found a model with %d inliers\n", n_inliers); printf("parameters ="); for (int i = 0; i < modeldim; i++) printf(" %g", model[i]); printf("\n"); //fprintf(stderr, "errors of data points:\n"); //ransac_error_evaluation_function *ep = epipolar_error_triplet; //for (int i = 0; i < n; i++) { // float e = ep(model, data+i*datadim, NULL); // fprintf(stderr, "\t%g\t%s\n", e, mask[i]?"GOOD":"bad"); //} } else printf("RANSAC found no model\n"); #if 0 float gamod[9] = {2.8709e-09, -4.3669e-08, 1.0966e-02, 4.0071e-08, 3.6767e-10, 3.4892e-03, -1.2060e-02, -4.3969e-03, 1.0000e+00}; printf("as a comparison, use a fixed model:"); printf("parameters ="); for (int i = 0; i < modeldim; i++) printf(" %g", gamod[i]); printf("\n"); fprintf(stderr, "errors of data points:\n"); ransac_error_evaluation_function *ep = epipolar_error; for (int i = 0; i < n; i++) { float e = ep(gamod, data+i*datadim, NULL); fprintf(stderr, "\t%g\t%s\n", e,"unknown"); } #endif // if needed, print the inliers if (inliers_filename) { FILE *f = xfopen(inliers_filename, "w"); for (int i = 0; i < n; i++) if (mask[i]) { for(int d = 0; d < datadim; d++) fprintf(f,"%g ",data[i*datadim+d]); fprintf(f,"\n"); } xfclose(f); } if (false) { FILE *f = xfopen("/tmp/omask.txt", "w"); for (int i = 0; i < n; i++) fprintf(f, mask[i]?" 1":" 0"); fprintf(f, "\n"); xfclose(f); } free(mask); free(data); return EXIT_SUCCESS; }
int main_hack_fundamental_matrix(int c, char *v[]) { if (c != 5 && c != 6 && c != 7) { fprintf(stderr, "usage:\n\t%s fmn " // -1 0 "ntrials maxerr minliers omodel [omask [oinliers]] <data\n",*v); // 1 2 3 4 5 6 return EXIT_FAILURE; } int ntrials = atoi(v[1]); float maxerr = atof(v[2]); int minliers = atoi(v[3]); char *filename_omodel = c > 4 ? v[4] : 0; char *filename_omask = c > 5 ? v[5] : 0; char *filename_inliers = c > 6 ? v[6] : 0; fprintf(stderr, "WARNING: ignoring parameter minliers=%d\n", minliers); int datadim = 4; int modeldim = 9; int n; float *data = read_ascii_floats(stdin, &n); n /= datadim; float model[modeldim]; bool *mask = xmalloc(n * sizeof*mask); for (int i = 0; i < n; i++) mask[i] = false; int n_inliers = find_fundamental_matrix_by_ransac(mask, model, data, n, ntrials, maxerr); // print a summary of the results if (n_inliers > 0) { printf("RANSAC found a model with %d inliers\n", n_inliers); printf("parameters ="); for (int i = 0; i < modeldim; i++) printf(" %g", model[i]); printf("\n"); //fprintf(stderr, "errors of data points:\n"); //ransac_error_evaluation_function *ep = epipolar_error; //for (int i = 0; i < n; i++) { // float e = ep(model, data+i*datadim, NULL); // fprintf(stderr, "\t%g\t%s\n", e, mask[i]?"GOOD":"bad"); //} } else printf("RANSAC found no model\n"); #if 0 float gamod[9] = {2.8709e-09, -4.3669e-08, 1.0966e-02, 4.0071e-08, 3.6767e-10, 3.4892e-03, -1.2060e-02, -4.3969e-03, 1.0000e+00}; printf("as a comparison, use a fixed model:"); printf("parameters ="); for (int i = 0; i < modeldim; i++) printf(" %g", gamod[i]); printf("\n"); fprintf(stderr, "errors of data points:\n"); ransac_error_evaluation_function *ep = epipolar_error; for (int i = 0; i < n; i++) { float e = ep(gamod, data+i*datadim, NULL); fprintf(stderr, "\t%g\t%s\n", e,"unknown"); } #endif // if requested, save the inlying data points if (filename_inliers) { FILE *f = xfopen(filename_inliers, "w"); for (int i = 0; i < n; i++) if (mask[i]) { for(int d = 0; d < datadim; d++) fprintf(f,"%g ",data[i*datadim+d]); fprintf(f,"\n"); } xfclose(f); } // if requested, save the inlier mask if (filename_omask) { FILE *f = xfopen(filename_omask, "w"); for (int i = 0; i < n; i++) fprintf(f, mask[i]?" 1":" 0"); fprintf(f, "\n"); xfclose(f); } // if requested, save the model if (filename_omodel) { FILE *f = xfopen(filename_omodel, "w"); for (int i = 0; i < modeldim; i++) fprintf(f, "%a%c", model[i], i==modeldim-1?'\n':' '); xfclose(f); } //free(mask); //free(data); return EXIT_SUCCESS; }