#include #include #include #include int pinhole_fn(int argc, char **argv); int thin_lense_fn(int argc, char **argv); static const char *_model_names[] = {"pinhole", "thin_lense"}; typedef int (*model_fn)(int argc, char **argv); static model_fn _model_fns[] = { pinhole_fn, thin_lense_fn, }; void usage(const char *pname) { printf("Usage: %s [model parameters]\n", pname); printf("Available models:\n"); for (int i = 0; i < DF_ARRAY_COUNT(_model_names); ++i) { printf(" %s\n", _model_names[i]); } } int main(int argc, char **argv) { if (argc < 2) { fprintf(stderr, "Missing model name!\n"); usage(argv[0]); return 1; } model_fn fn = NULL; const char *model = argv[1]; for (int i = 0; i < DF_ARRAY_COUNT(_model_names); ++i) { if (strcmp(model, _model_names[i]) == 0) { fn = _model_fns[i]; break; } } if (!fn) { fprintf(stderr, "Invalid model name!\n"); usage(argv[0]); return 1; } return fn(argc - 2, &argv[2]); } int pinhole_fn(int argc, char **argv) { const char *in_path = NULL; const char *out_path = "out.png"; const char *focal_str = NULL; const char *in_z_str = NULL; const char *out_z_str = NULL; for (int i = 0; i < argc; ++i) { if ((strcmp(argv[i], "-i") == 0 || strcmp(argv[i], "--input") == 0) && i < argc - 1) { ++i; in_path = argv[i]; } else if ((strcmp(argv[i], "-o") == 0 || strcmp(argv[i], "--output") == 0) && i < argc - 1) { ++i; out_path = argv[i]; } else if ((strcmp(argv[i], "-f") == 0 || strcmp(argv[i], "--focal-length") == 0) && i < argc - 1) { ++i; focal_str = argv[i]; } else if ((strcmp(argv[i], "-iz") == 0 || strcmp(argv[i], "--input-z") == 0) && i < argc - 1) { ++i; in_z_str = argv[i]; } else if ((strcmp(argv[i], "-oz") == 0 || strcmp(argv[i], "--output-z") == 0) && i < argc - 1) { ++i; out_z_str = argv[i]; } else { in_path = argv[i]; } } if (!in_path || !focal_str || !in_z_str || !out_z_str) { fprintf(stderr, "Missing model parameters!\n"); printf("Pinhole model parameters:\n"); printf(" -i | --input \t\tPath to the input image.\n"); printf(" -o | --output \t\tPath to the output image (Default: out.png).\n"); printf(" -iz | --input-z \t\tDistance to the input image plane.\n"); printf(" -oz | --output-z \t\tDistance to the output image plane.\n"); printf(" -f | --focal-length \t\tThe focal length of the camera lens.\n"); return 1; } float focal, in_z, out_z; focal = atof(focal_str); in_z = atof(in_z_str); out_z = atof(out_z_str); df_image *in_image, *out_image; int w, h; df_result res = df_load_image(in_path, &w, &h, &in_image); if (res != df_result_success) { fprintf(stderr, "Failed to load %s! (%d)\n", in_path, (int)res); return 1; } res = df_create_image(w, h, &out_image); if (res != df_result_success) { fprintf(stderr, "Failed to create output image (%d)\n", (int)res); df_release_image(in_image); return 1; } df_pinhole(in_image, focal, in_z, out_z, out_image); int error_code = 0; res = df_write_image(out_image, out_path); if (res != df_result_success) { fprintf(stderr, "Failed to write to output image %s (%d)\n", out_path, (int)res); error_code = 1; } df_release_image(in_image); df_release_image(out_image); return error_code; } int thin_lense_fn(int argc, char **argv) { fprintf(stderr, "Not implemented yet"); return 1; }