/* Interrogates server for the nominal sample frequency and the decimation * factors. */ static bool read_archive_parameters(void) { FILE *stream; char buffer[64]; return connect_server(&stream) && FINALLY( TEST_OK(fprintf(stream, "CFdDVKC\n") > 0) && read_response(stream, buffer, sizeof(buffer)), // Finally, whether read_response succeeds TEST_OK(fclose(stream) == 0)) && DO_PARSE("server response", parse_archive_parameters, buffer) && TEST_OK_( major_version > SERVER_MAJOR_VERSION || minor_version >= SERVER_MINOR_VERSION, "Server protocol mismatch, server %d.%d less than expected %d.%d", major_version, minor_version, SERVER_MAJOR_VERSION, SERVER_MINOR_VERSION); }
int main(int argc, char *argv[]) { TRY(); pixel_image src_image; pixel_image dst_image; quad_forest forest; uint32 max_size, min_size; integral_value alpha, tree_overlap, segment_overlap; string source_file, target_file; if (argc < 8) { printf("\nError: wrong number of parameters\n\n"); print_usage(); return 1; } else { int scan_result; scan_result = sscanf(argv[1], "%lu", &max_size); if (scan_result != 1) { printf("\nError: failed to parse parameter max\n\n"); print_usage(); return 1; } scan_result = sscanf(argv[2], "%lu", &min_size); if (scan_result != 1) { printf("\nError: failed to parse parameter min\n\n"); print_usage(); return 1; } scan_result = sscanf(argv[3], "%lf", &alpha); if (scan_result != 1) { printf("\nError: failed to parse parameter alpha\n\n"); print_usage(); return 1; } scan_result = sscanf(argv[4], "%lf", &tree_overlap); if (scan_result != 1) { printf("\nError: failed to parse parameter toverlap\n\n"); print_usage(); return 1; } scan_result = sscanf(argv[5], "%lf", &segment_overlap); if (scan_result != 1) { printf("\nError: failed to parse parameter soverlap\n\n"); print_usage(); return 1; } source_file = argv[6]; target_file = argv[7]; if (max_size < min_size) { printf("\nError: max may not be smaller than min\n\n"); print_usage(); return 1; } if (alpha <= 0 || alpha > 5) { printf("\nError: alpha must be in range (0..5]\n\n"); print_usage(); return 1; } if (tree_overlap <= 0 || tree_overlap >= 1) { printf("\nError: toverlap must be in range (0..1)\n\n"); print_usage(); return 1; } if (segment_overlap <= 0 || segment_overlap >= 1) { printf("\nError: soverlap must be in range (0..1)\n\n"); print_usage(); return 1; } { FILE *source; source = fopen(source_file, "r"); if (source == NULL) { printf("\nError: the source file does not exist\n\n"); print_usage(); return 1; } fclose(source); } } printf("load image...\n"); CHECK(pixel_image_create_from_file(&src_image, source_file, p_U8, GREY)); printf("create forest...\n"); CHECK(quad_forest_create(&forest, &src_image, max_size, min_size)); printf("updating forest...\n"); CHECK(quad_forest_update(&forest)); printf("segmenting...\n"); CHECK(quad_forest_segment_with_overlap(&forest, alpha, tree_overlap, segment_overlap)); printf("found %lu segments!\n", forest.segments); printf("drawing result...\n"); CHECK(quad_forest_draw_image(&forest, &dst_image, TRUE, TRUE)); printf("writing result to file...\n"); CHECK(pixel_image_write_to_file(&dst_image, target_file)); printf("done!\n"); FINALLY(main); quad_forest_destroy(&forest); pixel_image_destroy(&dst_image); pixel_image_destroy(&src_image); return 0; }