diff --git a/doc/the_floatimg_hack.tex b/doc/the_floatimg_hack.tex index e4763d36..47418191 100644 --- a/doc/the_floatimg_hack.tex +++ b/doc/the_floatimg_hack.tex @@ -317,7 +317,8 @@ dans l'upscaling.} effectuées. L'autre façon de procéder est d'explorer notre image à la recherche de la valeur maximale. La fonction \texttt{float fimg\_get\_maxvalue(\&fimg)} est -faite pour ça. C'est la méthode utilisée par l'outil qui +faite pour ça. +C'est actuellement la méthode utilisée par l'outil qui sert à faire les modifications de contraste (page \pageref{fimgfx}. \vspace{1em} @@ -370,7 +371,8 @@ return 0; \end{verbatim} Je vous laisse imaginer les dégats que peut faire cette -fontion en utilisation réelle. +fontion en utilisation réelle. Mieux, je vous propose +d'essayer par vous-même. En particulier tout le reste du code qui suppose qu'un pixel ne peut \textbf{pas} être négatif. Vous pouvez aussi remarquer qu'il n'y a pas de controle @@ -438,7 +440,8 @@ en première approche, alors commençont par le plus simple, les valeurs moyennes de chaque composante. Puis nous rajouterons\footnote{Les patchs sont les bienvenus} -le calcul de la variance\index{variance}. +le calcul de la variance\index{variance}. Les compétences +de \texttt{schmod777} sont attendues au dd2\index{dd2}. \subsection{fimgfx}\index{fimgfx}\label{fimgfx} @@ -446,6 +449,17 @@ le calcul de la variance\index{variance}. Attention, je vais expérimenter un parsing un peu étrange sur les arguments de la ligne de commande. coredump expected.} +\vspace{1em} + +À l'heure actuelle\footnote{décembre 2019, vers 15:30}, nous avons +déja quelques ajustements basiques de contraste. + +\begin{verbatim} +tth@daubian:~/Devel/FloatImg/tools$ ./fimgfx -v -h +--- fimg special effects --- + cos01 cos010 pow2 sqrt +\end{verbatim} + \subsection{fimgops}\index{fimgops}\label{fimgops} Quelques opérations diverses entre deux images, qui doivent être diff --git a/floatimg.h b/floatimg.h index cb19982b..fc87e49f 100644 --- a/floatimg.h +++ b/floatimg.h @@ -2,7 +2,7 @@ * floatimg.h */ -#define FIMG_VERSION 78 +#define FIMG_VERSION 80 /* * in memory descriptor @@ -41,6 +41,7 @@ typedef struct { #define CONTRAST_SQRT 1 #define CONTRAST_POW2 2 #define CONTRAST_COS01 3 +#define CONTRAST_COS010 4 /* * core module @@ -83,7 +84,7 @@ int fimg_id_contraste(char *name); int fimg_square_root(FloatImg *s, FloatImg *d, double maxval); int fimg_power_2(FloatImg *s, FloatImg *d, double maxval); int fimg_cos_01(FloatImg *s, FloatImg *d, double maxval); - +int fimg_cos_010(FloatImg *s, FloatImg *d, double maxval); int fimg_mk_gray_from(FloatImg *src, FloatImg*dst, int k); diff --git a/lib/contrast.c b/lib/contrast.c index 1cf0c0ea..567fd362 100644 --- a/lib/contrast.c +++ b/lib/contrast.c @@ -20,6 +20,7 @@ if (!strcmp(str, "none")) return CONTRAST_NONE; if (!strcmp(str, "sqrt")) return CONTRAST_SQRT; if (!strcmp(str, "pow2")) return CONTRAST_POW2; if (!strcmp(str, "cos01")) return CONTRAST_COS01; +if (!strcmp(str, "cos010")) return CONTRAST_COS010; return -1; } @@ -132,6 +133,38 @@ for (idx=0; idxtype != FIMG_TYPE_RGB) { + fprintf(stderr, "%s : type %d invalide\n", + __func__, s->type); + return -4; + } + +if (NULL==d) { + d = s; + } +else { + if (d->type != FIMG_TYPE_RGB) { + fprintf(stderr, "%s : dst type %d invalide\n", + __func__, d->type); + return -4; + } + } + +nbre = s->width * s->height * 3; + +for (idx=0; idxR[idx] / maxval; + + d->R[idx] = maxval * (0.5 - 0.5 * cos(2*3.141592654*dval)); + } + +return 0; +} /* ---------------------------------------------------------------- */ diff --git a/tools/fimgfx.c b/tools/fimgfx.c index 9048bb46..0d158503 100644 --- a/tools/fimgfx.c +++ b/tools/fimgfx.c @@ -19,10 +19,11 @@ typedef struct { int nbarg; } Fx; -enum fxid { Fx_cos01, Fx_pow2, Fx_sqrt }; +enum fxid { Fx_cos01, Fx_cos010, Fx_pow2, Fx_sqrt }; Fx fx_list[] = { { "cos01", Fx_cos01, 0 }, + { "cos010", Fx_cos010, 0 }, { "pow2", Fx_pow2, 0 }, { "sqrt", Fx_sqrt, 0 }, { NULL, 0, 0 } @@ -52,11 +53,14 @@ return -1; /* --------------------------------------------------------------------- */ static void help(int lvl) { +Fx *fx; -printf("fimg special effects (%d)\n", lvl); - - - +puts("--- fimg special effects ---"); +printf("\t"); +for (fx=fx_list; fx->name; fx++) { + printf("%s ", fx->name); + } +puts(""); exit(0); } /* --------------------------------------------------------------------- */ @@ -88,6 +92,8 @@ if (foo) { switch (act) { case Fx_cos01: fimg_cos_01(&src, &dest, maxval); break; + case Fx_cos010: + fimg_cos_010(&src, &dest, maxval); break; case Fx_pow2: fimg_power_2(&src, &dest, maxval); break; case Fx_sqrt: diff --git a/v4l2/grabvidseq.c b/v4l2/grabvidseq.c index 765c649d..c876b7bc 100644 --- a/v4l2/grabvidseq.c +++ b/v4l2/grabvidseq.c @@ -122,6 +122,10 @@ FloatImg cumul; while ((opt = getopt(argc, argv, "c:d:ghn:o:O:p:s:uv")) != -1) { switch(opt) { case 'c': contrast = fimg_id_contraste(optarg); + if (contrast < 0) { + fputs("unknow contrast\n", stderr); + exit(1); + } break; case 'd': dev_name = optarg; break; case 'g': to_gray = 1; break; @@ -234,8 +238,10 @@ cumul.count = 0; type = V4L2_BUF_TYPE_VIDEO_CAPTURE; xioctl(fd, VIDIOC_STREAMON, &type); +#if 0 if (verbosity) fprintf(stderr,"pid %d grabbing %d picz...\n", getpid(), nbre_capt); +#endif for (i = 0; i < nbre_capt; i++) { do { @@ -331,7 +337,7 @@ if (verbosity) { } switch (contrast) { case CONTRAST_NONE: - fprintf(stderr, "contrast: none\n"); + // if (verbosity) fprintf(stderr, "contrast: none\n"); break; case CONTRAST_SQRT: fimg_square_root(&cumul, NULL, maxvalue); @@ -342,6 +348,9 @@ switch (contrast) { case CONTRAST_COS01: fimg_cos_01(&cumul, NULL, maxvalue); break; + case CONTRAST_COS010: + fimg_cos_010(&cumul, NULL, maxvalue); + break; default: fprintf(stderr, "bad contrast method\n"); break;