242 lines
7.9 KiB
C
242 lines
7.9 KiB
C
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
#include <defocus/defocus.h>
|
|
|
|
#include <defocus/camera.h>
|
|
|
|
int pinhole_fn(int argc, char **argv);
|
|
int thin_lense_fn(int argc, char **argv);
|
|
int test_fn(int argc, char **argv);
|
|
|
|
static const char *_model_names[] = {"pinhole", "thin_lense", "test"};
|
|
typedef int (*model_fn)(int argc, char **argv);
|
|
|
|
static model_fn _model_fns[] = {
|
|
pinhole_fn,
|
|
thin_lense_fn,
|
|
test_fn,
|
|
};
|
|
|
|
void usage(const char *pname)
|
|
{
|
|
printf("Usage: %s <model-name> [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 <path>\t\tPath to the input image.\n");
|
|
printf(" -o | --output <path>\t\tPath to the output image (Default: out.png).\n");
|
|
printf(" -iz | --input-z <number>\t\tDistance to the input image plane.\n");
|
|
printf(" -oz | --output-z <number>\t\tDistance to the output image plane.\n");
|
|
printf(" -f | --focal-length <number>\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((df_pinhole_params){.orig_z = in_z, .new_z = out_z, .focal_length = focal}, in_image, 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)
|
|
{
|
|
const char *in_path = NULL;
|
|
const char *out_path = "out.png";
|
|
const char *focal_str = NULL;
|
|
const char *aperture_str = NULL;
|
|
const char *in_z_str = NULL;
|
|
const char *out_z_str = NULL;
|
|
const char *samples_str = "64";
|
|
|
|
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 if ((strcmp(argv[i], "-a") == 0 || strcmp(argv[i], "--aperture") == 0) && i < argc - 1) {
|
|
++i;
|
|
aperture_str = argv[i];
|
|
} else if ((strcmp(argv[i], "-s") == 0 || strcmp(argv[i], "--samples") == 0) && i < argc - 1) {
|
|
++i;
|
|
samples_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 <path>\t\tPath to the input image.\n");
|
|
printf(" -o | --output <path>\t\tPath to the output image (Default: out.png).\n");
|
|
printf(" -iz | --input-z <number>\t\tDistance to the input image plane.\n");
|
|
printf(" -oz | --output-z <number>\t\tDistance to the output image plane.\n");
|
|
printf(" -f | --focal-length <number>\t\tThe focal length of the camera lens.\n");
|
|
printf(" -a | --aperture <number>\t\tThe size of the camera lens.\n");
|
|
printf(" -s | --samples <number>\t\tThe number of samples per pixel (Default: 64).\n");
|
|
return 1;
|
|
}
|
|
|
|
float focal, in_z, out_z, aperture;
|
|
int samples;
|
|
focal = atof(focal_str);
|
|
in_z = atof(in_z_str);
|
|
out_z = atof(out_z_str);
|
|
aperture = atof(aperture_str);
|
|
samples = atoi(samples_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_thin_lense((df_thin_lense_params){.focal_distance = in_z,
|
|
.out_distance = out_z,
|
|
.focal_length = focal,
|
|
.aperture = aperture,
|
|
.sample_count = samples},
|
|
in_image,
|
|
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 test_fn( int argc, char **argv ) {
|
|
|
|
df_v3 v = {1.f, 2.f, 3.f};
|
|
df_m4 t = df_translate(-1.f, 2.f, 1.5f);
|
|
t = df_inverse_transform(t);
|
|
|
|
df_v3 tv = df_transform_v3(t, v);
|
|
|
|
df_camera_i cam = df_create_perspective_camera(1024.0, 1024.0, 1024.0, 1024.0, 2.e-4f, 1000.f, 350.0, 21.0);
|
|
df_ray_packet packet = cam.build_ray_packet(cam.o);
|
|
df_evaluate_ray_packet(&packet);
|
|
|
|
df_release_ray_packet(&packet);
|
|
|
|
cam.release(cam.o);
|
|
return 0;
|
|
} |