diff --git a/doc/the_floatimg_hack.tex b/doc/the_floatimg_hack.tex index b286f76..f2e4688 100644 --- a/doc/the_floatimg_hack.tex +++ b/doc/the_floatimg_hack.tex @@ -161,12 +161,27 @@ gris, rgb et rgba\index{rgba}. #define FIMG_TYPE_RGBA 4 \end{verbatim} -Les deux champs suivants (fval et count) sont à la disposition du yuser -qui peut jouer avec à loisir. +Un peu plus loin, nous avons les pointeurs vers les +différents \textsl{pixmaps} de l'image. En principe l'organisation +interne de ces zones est improbable, puisque qu'elle dérive +d'idées approximatives. +\vspace{1em} -Et pour finir dans la joie, nous avons les pointeurs vers les -différents \textsl{pixmaps} de l'image. +Les deux champs suivants (fval et count) sont à la disposition du +\textsl{yuser} +qui peut jouer avec à loisir pour faire, par exemple, ce genre de +chose. Imaginons un périphérique de capture qui nous fournisse des +images en gris sur 4 bits. Et que nous voulions cumuler\index{cumul} +quelques images... +\vspace{1em} +Le champ \textsl{count} sera mis à 0 et +le champ \textsl{fval} sera initialisé à 15.0 +(valeur maximale renvoyée par le capteur). +Ensuite, dans la boucle capture/cumul, \textsl{count} sera +incrémenté à chaque passe, et nous aurons donc, en finale, +toutes les informations nécéssaire pour exploiter au mieux la dynamique +de notre image dans les étapes ultérieures. @@ -192,7 +207,7 @@ Bon, vous avez une image latente, et vous souhaité dessiner dessus (ou dedans ?) avec vos encres flottantes ? -\subsection{funcs/}\index{funcs/} +\subsection{funcs/}\index{funcs/}\label{funcs} Une bonne partie de ces fonctions est indéterministe. Ce qui veut dire, en langage de tous les soirs, que ça risque de ne @@ -216,20 +231,34 @@ Dans un avenir incertain, il existera des pages de man\index{man}. \subsection{mkfimg}\index{mkfimg}\label{mkfimg} -Création d'un fichier contenant une image de teinte constante. +Création d'un fichier contenant une image de « teinte » constante. +Cette notion de teinte est assez inconsistante pour le moment, +puisqu'il n'y a que la valeur par defaut : \textbf{0.0} que +l'on peut assimiler à un noir absolu\index{absolu}. \subsection{fimgstats}\index{fimgstats}\label{fimgstats} Affichage de quelques valeurs calculées à partir d'un fichier \texttt{.fimg}\index{.fimg}. -\subsection{fimg2png et fimg2pnm} +\subsection{fimg2png, fimg2pnm, fimg2tiff} \index{fimg2png}\label{fimg2png} \index{fimg2pnm}\label{fimg2pnm} + \index{fimg2tiff}\label{fimg2tiff} -Deux petits proggies pour exporter notre format\index{.fimg} secret -vers des choses plus directement utilisables. +Quelques petits proggies pour exporter notre format\index{.fimg} secret +vers des choses plus directement utilisables. À condition que le +code soit écrit et documenté en page \pageref{funcs}. +\subsection{fimg2gray}\index{fimg2gray}\label{fimg2gray} + +Nous avons vu dans ce document que chaque image flottante pouvait +avoir plusieurs plans de réalité. Il ne faut en négliger aucun. +\vspace{1em} + +Il faut quand même deviner que pour passer de l'espace RGB\index{RGB} +à une abstraction linéaire mono-dimensionnelle, il existe une foultitude +de méthodes, toutes plus légitimes que les autres. % ------------------------------------------------------------------- \section{Video for Linux}\index{v4l2} @@ -248,7 +277,7 @@ v4l2. % ------------------------------------------------------------------- \section{Et pour la suite ?} -En fait, je fait de la photo par la méthode du « cumul » +En fait, je fait de la photo par la méthode du « cumul »\index{cumul} depuis plusieurs années. Une webcam\index{webcam}, un Linux\index{Linux}, et ça \textsl{juste marche}. Sauf que c'est quand même un peu galère à déplacer, il faut diff --git a/lib/Makefile b/lib/Makefile index 30d51d7..35ef471 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -4,7 +4,7 @@ COPT = -Wall -fpic -g -no-pie -DDEBUG_LEVEL=0 OBJS = fimg-core.o fimg-pnm.o fimg-file.o fimg-math.o \ - fimg-timers.o operators.o + fimg-timers.o operators.o fimg-2gray.o DEPS = Makefile ../floatimg.h # modify it 'as you like' @@ -23,6 +23,9 @@ t: t.c ../libfloatimg.a $(DEPS) fimg-core.o: fimg-core.c $(DEPS) gcc $(COPT) -c $< +fimg-2gray.o: fimg-2gray.c $(DEPS) + gcc $(COPT) -c $< + operators.o: operators.c $(DEPS) gcc $(COPT) -c $< diff --git a/tools/fimg2gray.c b/tools/fimg2gray.c new file mode 100644 index 0000000..e69de29 diff --git a/tools/mkfimg.c b/tools/mkfimg.c index 5c03df8..3055866 100644 --- a/tools/mkfimg.c +++ b/tools/mkfimg.c @@ -19,6 +19,8 @@ int main(int argc, char *argv[]) int foo, opt; int width, height; char *fname; +float fvalue; + FloatImg fimg; while ((opt = getopt(argc, argv, "ho:v")) != -1) { diff --git a/v4l2/grabvidseq.c b/v4l2/grabvidseq.c index 5150245..136216a 100644 --- a/v4l2/grabvidseq.c +++ b/v4l2/grabvidseq.c @@ -191,6 +191,7 @@ foo = fimg_create(&cumul, fmt.fmt.pix.width, fmt.fmt.pix.height, FIMG_TYPE_RGB); fimg_clear(&cumul); +cumul.fval = 255.0; #endif @@ -220,7 +221,8 @@ for (i = 0; i < nbre_capt; i++) { } if(verbosity > 1) { - printf("%6d / %6d %9.3f\n", i, nbre_capt, fimg_timer_get(0)); + printf("%6d / %6d %9.3f\n", i, nbre_capt, + fimg_timer_get(0)); } @@ -246,15 +248,13 @@ for (i = 0; i < nbre_capt; i++) { #endif #if SAVE_AS_CUMUL - /** + /** this is the slow version x_rgb2fimg(buffers[buf.index].start, fmt.fmt.pix.width, fmt.fmt.pix.height, &grab); fimg_add(&grab, &cumul, &cumul); **/ x_add_rgb2fimg(buffers[buf.index].start, fmt.fmt.pix.width, fmt.fmt.pix.height, &cumul); - - #endif #if SAVE_AS_FIMG diff --git a/v4l2/rgb2fimg.c b/v4l2/rgb2fimg.c index 45d0c3b..07e7bf2 100644 --- a/v4l2/rgb2fimg.c +++ b/v4l2/rgb2fimg.c @@ -5,6 +5,11 @@ #include "funcs.h" +/* + * Be careful, these functions are not yet fireproof, + * and calling conventions are fluctuating. + */ + /* --------------------------------------------------------------------- */ int x_upscaler(unsigned char *src, int w, int h, FloatImg *d) { @@ -13,6 +18,14 @@ int x, y, xx, yy; float r, g, b; static unsigned short modz; +/* + * check in image sizes are correct + */ +if ( d->width != w*2 || d->height != h*2 ) { + fprintf(stderr, "%s : dimension error\n", __func__); + return -2; + } + // rp = d->R, gp = d->G, bp = d->B; for (y=0; ycount++; /* one more frame in the accumulator */ + return 0; } +/* --------------------------------------------------------------------- */ + int x_rgb2file(unsigned char *src, int w, int h, char *fname) { FloatImg buff; diff --git a/v4l2/video-infos.c b/v4l2/video-infos.c index 7d8d0ce..88a3329 100644 --- a/v4l2/video-infos.c +++ b/v4l2/video-infos.c @@ -95,7 +95,7 @@ return 0; int enum_controls(int fd, char *txt, int k) { struct v4l2_queryctrl qctrl; -int foo, idx; +int idx; printf("-- controls enumeration '%s'\n", txt); @@ -208,7 +208,6 @@ fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; foo = ioctl(vfd, VIDIOC_G_FMT, &fmt); if (0 != foo) { perror("ioctl G_FMT"); - // exit(1); } else { pr_v4l2_format("Experimental", &fmt); @@ -249,9 +248,13 @@ static void print_title(char *txt) int foo, l; l = strlen(txt); -for (foo=0; foo