예제 #1
0
파일: ransac.c 프로젝트: jguinet/s2p
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;
}
예제 #2
0
파일: ransac.c 프로젝트: jguinet/s2p
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;
}
예제 #3
0
파일: ransac.c 프로젝트: Fahdben/imscript
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;
}