From 3e820c8298fff7322b3cb3fa10c99ece2715bed6 Mon Sep 17 00:00:00 2001 From: tth Date: Mon, 26 Oct 2020 16:45:36 +0100 Subject: [PATCH] first version of displacement mapping --- funcs/Makefile | 6 ++- funcs/displacement.c | 91 ++++++++++++++++++++++++++++++++++++++++++++ funcs/t.c | 43 ++++++++++++++++++++- funcs/vroum.sh | 8 ++-- 4 files changed, 142 insertions(+), 6 deletions(-) create mode 100644 funcs/displacement.c diff --git a/funcs/Makefile b/funcs/Makefile index c7aa957..d56af7a 100644 --- a/funcs/Makefile +++ b/funcs/Makefile @@ -5,7 +5,8 @@ DEPS = ../floatimg.h Makefile OBJS = fimg-png.o fimg-tiff.o misc-plots.o filtrage.o utils.o \ fimg-libpnm.o rampes.o sfx0.o geometry.o rotate.o \ equalize.o fimg-fits.o saturation.o histogram.o \ - hsv.o classif.o contour2x2.o qsortrgb.o exporter.o + hsv.o classif.o contour2x2.o qsortrgb.o exporter.o \ + displacement.o #--------------------------------------------------------------- @@ -19,6 +20,9 @@ t: t.c $(DEPS) ../libfloatimg.a ../libfloatimg.a: $(OBJS) $(AR) r $@ $? +displacement.o: displacement.c + gcc $(COPT) -c $< + fimg-png.o: fimg-png.c $(DEPS) gcc $(COPT) -c $< diff --git a/funcs/displacement.c b/funcs/displacement.c new file mode 100644 index 0000000..9b2ed35 --- /dev/null +++ b/funcs/displacement.c @@ -0,0 +1,91 @@ +/* + * displacement.c + */ + +#include +#include +#include +#include + +#include "../floatimg.h" + +extern int verbosity; + +/* --------------------------------------------------------------------- */ +/* --------------------------------------------------------------------- */ +/* nouveau 24 octobre 2020, pendant le masque-flamme coronavidique */ + +int fimg_displacement_0(FloatImg *psrc, FloatImg *pdst, int flags) +{ +int x, y, foo; +float minmax[6]; +float rgb[3]; +float dltr, dltg, dltb; /* delta des minmax */ +float dispx, dispy; + +int dstx, dsty; +int in, out; + +#if DEBUG_LEVEL +fprintf(stderr, ">>> %s ( %p %p 0x%04x )\n", __func__, psrc, pdst, flags); +#endif + +if (FIMG_TYPE_RGB != psrc->type) { + fprintf(stderr, "%s: bad src type %d\n", __func__, psrc->type); + return -7; + } +if (fimg_images_not_compatible(psrc, pdst)) { + fprintf(stderr, "%s: bad dst type %d\n", __func__, pdst->type); + return -8; + } + +foo = fimg_get_minmax_rgb(psrc, minmax); +if (verbosity) { + fimg_print_minmax(minmax, (char *)__func__); + } + +dltr = minmax[1] - minmax[0]; +dltg = minmax[3] - minmax[2]; +dltb = minmax[5] - minmax[4]; + +in = out = 0; + +for (y=0; yheight; y++) { + + for (x=0; xwidth; x++) { + + fimg_get_rgb(psrc, x, y, rgb); + + dispx = (float)x + (rgb[1]/dltg * 10.0); + dispy = (float)y + (rgb[2]/dltb * 10.0); + dstx = (int)roundf(dispx - 5.0); + dsty = (int)roundf(dispy - 5.0); + + if ( (dstx < 0) || (dsty < 0) || + (dstx >= psrc->width) || + (dsty >= psrc->height) ) + { + /* OUT OF DESTINATION PICTURE */ + out++; + } + else { + rgb[1] = rgb[2] = rgb[0]; + fimg_put_rgb(pdst, dstx, dsty, rgb); + // fprintf(stderr, "%5d %5d %f\n", dstx, dsty, rgb[1]); + in++; + } + + } + + if (verbosity > 2) { + fprintf(stderr, "%4d / %4d\n", y, psrc->height); + } + } + +fprintf(stderr, "%s -------> in %d out %d\n", __func__, in, out); + +return 0; +} +/* --------------------------------------------------------------------- */ + + diff --git a/funcs/t.c b/funcs/t.c index a91807b..edb9079 100644 --- a/funcs/t.c +++ b/funcs/t.c @@ -14,6 +14,39 @@ int verbosity; float global_fvalue; +/* --------------------------------------------------------------------- */ +/* nouveau 24 octobre 2020, pendant le masque-flamme coronavidique */ + +int fimg_displacement_0(FloatImg *psrc, FloatImg *pdst, int flags); + +int essai_displacement(char *infile, char *outfile) +{ +int foo; +FloatImg src, dst; + +fprintf(stderr, "%s : loading %s\n", __func__, infile); +foo = fimg_create_from_dump(infile, &src); +if (foo) { + fprintf(stderr, "%s: error loading '%s'\n", __func__, infile); + return foo; + } + +fimg_clone(&src, &dst, 1); + +foo = fimg_displacement_0(&src, &dst, 0); +if (foo) { + fprintf(stderr, "%s: err %d in disp map 0\n", __func__, foo); + return foo; + } + +foo = fimg_export_picture(&dst, outfile, 0); +if (foo) { + fprintf(stderr, "%s : err %d saving result\n", __func__, foo); + return foo; + } + +return 0; +} /* --------------------------------------------------------------------- */ /* * nouveau 7 octobre 2020 pendant sonoptic @@ -557,7 +590,8 @@ return 0; } /* --------------------------------------------------------------------- */ enum nCmd { Equalize=1, Rotate, Sfx0, F3x3, MIRE, Wfits, Wpng, Wtiff, - Histo, Hsv, Classif, Ctr2x2, Qsortrgb }; + Histo, Hsv, Classif, Ctr2x2, Qsortrgb, + Displace }; typedef struct { char *name; int Cmd; @@ -577,6 +611,7 @@ Command commands[] = { { "classif", Classif }, { "ctr2x2", Ctr2x2 }, { "qsortrgb", Qsortrgb }, + { "displace", Displace }, { NULL, 0 } } ; @@ -620,10 +655,11 @@ int foo, opt; char *filename, *command, *outfile; fprintf(stderr, "++++++++ test des fonctions pid=%d\n", getpid()); +fprintf(stderr, "++++++++ compiled "__DATE__" at " __TIME__ "\n"); global_fvalue = 1.0; outfile = "out.pnm"; - +command = "none"; while ((opt = getopt(argc, argv, "hk:o:p:v")) != -1) { switch(opt) { @@ -690,6 +726,9 @@ switch(opt) { case Qsortrgb: foo = essai_qsort_rgb(filename, outfile); break; + case Displace: + foo = essai_displacement(filename, outfile); + break; default: fprintf(stderr, "%s : bad command\n", command); exit(1); diff --git a/funcs/vroum.sh b/funcs/vroum.sh index dbb5b46..ce0b1a0 100755 --- a/funcs/vroum.sh +++ b/funcs/vroum.sh @@ -6,7 +6,7 @@ out=out.fimg maxi=49 W="640" H="480" -grabopt=" -s 640x480 -vv -p 0 -n 400 -c pow2 " +grabopt=" -s 640x480 -vv -p 0 -n 300 -c cos01 " mkdir /tmp/V @@ -20,9 +20,11 @@ do grabvidseq -$grabopt -o $src fval=$(echo "$foo / $maxi" | bc -l) - ./t -vv -k 0.333 -o $out classif $src - echo $foo ' => ' $fval + ./t -vv -k 0.333 -o $out displace $src + # fimgstats $out + + echo $foo ' => ' $fval dst=$(printf "/tmp/V/%03d.png" $foo) echo $dst montage $src $out -tile 1x2 -geometry $G $dst