Compare commits

..

No commits in common. "a07883c0c239b2d72ccaca589c28a327f0dd111b" and "c3852b4dee41fb09635584ac7126f59f40dd8cc6" have entirely different histories.

12 changed files with 29 additions and 147 deletions

View File

@ -161,27 +161,12 @@ gris, rgb et rgba\index{rgba}.
#define FIMG_TYPE_RGBA 4 #define FIMG_TYPE_RGBA 4
\end{verbatim} \end{verbatim}
Un peu plus loin, nous avons les pointeurs vers les Les deux champs suivants (fval et count) sont à la disposition du yuser
différents \textsl{pixmaps} de l'image. En principe l'organisation qui peut jouer avec à loisir.
interne de ces zones est improbable, puisque qu'elle dérive
d'idées approximatives.
\vspace{1em}
Les deux champs suivants (fval et count) sont à la disposition du Et pour finir dans la joie, nous avons les pointeurs vers les
\textsl{yuser} différents \textsl{pixmaps} de l'image.
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.
@ -207,7 +192,7 @@ Bon, vous avez une image latente, et
vous souhaité dessiner dessus (ou dedans ?) avec vos encres vous souhaité dessiner dessus (ou dedans ?) avec vos encres
flottantes ? flottantes ?
\subsection{funcs/}\index{funcs/}\label{funcs} \subsection{funcs/}\index{funcs/}
Une bonne partie de ces fonctions est indéterministe. Ce qui Une bonne partie de ces fonctions est indéterministe. Ce qui
veut dire, en langage de tous les soirs, que ça risque de ne veut dire, en langage de tous les soirs, que ça risque de ne
@ -231,34 +216,20 @@ Dans un avenir incertain, il existera des pages de man\index{man}.
\subsection{mkfimg}\index{mkfimg}\label{mkfimg} \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} \subsection{fimgstats}\index{fimgstats}\label{fimgstats}
Affichage de quelques valeurs calculées à partir d'un fichier Affichage de quelques valeurs calculées à partir d'un fichier
\texttt{.fimg}\index{.fimg}. \texttt{.fimg}\index{.fimg}.
\subsection{fimg2png, fimg2pnm, fimg2tiff} \subsection{fimg2png et fimg2pnm}
\index{fimg2png}\label{fimg2png} \index{fimg2png}\label{fimg2png}
\index{fimg2pnm}\label{fimg2pnm} \index{fimg2pnm}\label{fimg2pnm}
\index{fimg2tiff}\label{fimg2tiff}
Quelques petits proggies pour exporter notre format\index{.fimg} secret Deux petits proggies pour exporter notre format\index{.fimg} secret
vers des choses plus directement utilisables. À condition que le vers des choses plus directement utilisables.
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} \section{Video for Linux}\index{v4l2}
@ -277,7 +248,7 @@ v4l2.
% ------------------------------------------------------------------- % -------------------------------------------------------------------
\section{Et pour la suite ?} \section{Et pour la suite ?}
En fait, je fait de la photo par la méthode du « cumul »\index{cumul} En fait, je fait de la photo par la méthode du « cumul »
depuis plusieurs années. Une webcam\index{webcam}, depuis plusieurs années. Une webcam\index{webcam},
un Linux\index{Linux}, et ça \textsl{juste marche}. un Linux\index{Linux}, et ça \textsl{juste marche}.
Sauf que c'est quand même un peu galère à déplacer, il faut Sauf que c'est quand même un peu galère à déplacer, il faut

View File

@ -59,8 +59,6 @@ double fimg_timer_set(int whot);
double fimg_timer_get(int whot); double fimg_timer_get(int whot);
int fimg_mk_gray_from(FloatImg *src, FloatImg*dst, int k);
/* FIMG files module */ /* FIMG files module */
int fimg_fileinfos(char *fname, int *datas); int fimg_fileinfos(char *fname, int *datas);
int fimg_dump_to_file(FloatImg *head, char *fname, int notused); int fimg_dump_to_file(FloatImg *head, char *fname, int notused);

View File

@ -4,7 +4,7 @@
COPT = -Wall -fpic -g -no-pie -DDEBUG_LEVEL=0 COPT = -Wall -fpic -g -no-pie -DDEBUG_LEVEL=0
OBJS = fimg-core.o fimg-pnm.o fimg-file.o fimg-math.o \ OBJS = fimg-core.o fimg-pnm.o fimg-file.o fimg-math.o \
fimg-timers.o operators.o fimg-2gray.o fimg-timers.o operators.o
DEPS = Makefile ../floatimg.h DEPS = Makefile ../floatimg.h
# modify it 'as you like' # modify it 'as you like'
@ -23,9 +23,6 @@ t: t.c ../libfloatimg.a $(DEPS)
fimg-core.o: fimg-core.c $(DEPS) fimg-core.o: fimg-core.c $(DEPS)
gcc $(COPT) -c $< gcc $(COPT) -c $<
fimg-2gray.o: fimg-2gray.c $(DEPS)
gcc $(COPT) -c $<
operators.o: operators.c $(DEPS) operators.o: operators.c $(DEPS)
gcc $(COPT) -c $< gcc $(COPT) -c $<

View File

@ -1,56 +0,0 @@
/*
* fimg-2gray.c
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "string.h"
#include "../floatimg.h"
extern int verbosity; /* must be declared around main() */
/* --------------------------------------------------------------------- */
/*
* floating img MUST be allocated.
*/
int fimg_mk_gray_from(FloatImg *src, FloatImg*dst, int k)
{
float kr, kg, kb, kdiv;
int nbb, foo;
kr = kg = kb = 1.0; /* canonic random values */
kdiv = kr + kg + kb;
/* we must check the validity of our parameters */
if (FIMG_TYPE_RGB != src->type) {
fprintf(stderr, "%s : bad src type %d on %p\n", __func__,
src->type, src);
return -8;
}
if (FIMG_TYPE_GRAY != dst->type) {
fprintf(stderr, "%s : bad dst type %d on %p\n", __func__,
dst->type, dst);
return -9;
}
/* entering the main processing loop */
nbb = src->width * src->height;
for (foo=0; foo<nbb; foo++) {
dst->R[foo] = ( (src->R[foo] * kr) +
(src->G[foo] * kg) +
(src->B[foo] * kb) ) /
kdiv;
}
return -1;
}
/* --------------------------------------------------------------------- */

View File

@ -8,7 +8,6 @@
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h> #include <unistd.h>
#include <string.h> #include <string.h>
#include <math.h>
#include "../floatimg.h" #include "../floatimg.h"

14
lib/t.c
View File

@ -30,16 +30,6 @@ for (y=0; y<img->height; y++) {
} }
return -1; return -1;
}
/* ---------------------------------------------------------------- */
int essai_2gray(FloatImg *picz, char *outname)
{
return -1;
} }
/* ---------------------------------------------------------------- */ /* ---------------------------------------------------------------- */
#define W 4000 #define W 4000
@ -66,10 +56,6 @@ foo = fimg_create(&result, W, H, 3);
foo = fimg_add(&dessin, &noise, &result); foo = fimg_add(&dessin, &noise, &result);
fimg_save_as_pnm(&result, "r_add.pnm", 0); fimg_save_as_pnm(&result, "r_add.pnm", 0);
essai_2gray(&result, "gray.pnm");
foo = fimg_sub(&dessin, &noise, &result); foo = fimg_sub(&dessin, &noise, &result);
fimg_save_as_pnm(&result, "r_sub.pnm", 0); fimg_save_as_pnm(&result, "r_sub.pnm", 0);
foo = fimg_mul(&dessin, &noise, &result); foo = fimg_mul(&dessin, &noise, &result);

View File

View File

@ -19,8 +19,6 @@ int main(int argc, char *argv[])
int foo, opt; int foo, opt;
int width, height; int width, height;
char *fname; char *fname;
float fvalue;
FloatImg fimg; FloatImg fimg;
while ((opt = getopt(argc, argv, "ho:v")) != -1) { while ((opt = getopt(argc, argv, "ho:v")) != -1) {

View File

@ -191,7 +191,6 @@ foo = fimg_create(&cumul,
fmt.fmt.pix.width, fmt.fmt.pix.height, fmt.fmt.pix.width, fmt.fmt.pix.height,
FIMG_TYPE_RGB); FIMG_TYPE_RGB);
fimg_clear(&cumul); fimg_clear(&cumul);
cumul.fval = 255.0;
#endif #endif
@ -221,8 +220,7 @@ for (i = 0; i < nbre_capt; i++) {
} }
if(verbosity > 1) { if(verbosity > 1) {
printf("%6d / %6d %9.3f\n", i, nbre_capt, printf("%6d %9.3f\n", i, fimg_timer_get(0));
fimg_timer_get(0));
} }
@ -248,13 +246,15 @@ for (i = 0; i < nbre_capt; i++) {
#endif #endif
#if SAVE_AS_CUMUL #if SAVE_AS_CUMUL
/** this is the slow version /**
x_rgb2fimg(buffers[buf.index].start, x_rgb2fimg(buffers[buf.index].start,
fmt.fmt.pix.width, fmt.fmt.pix.height, &grab); fmt.fmt.pix.width, fmt.fmt.pix.height, &grab);
fimg_add(&grab, &cumul, &cumul); fimg_add(&grab, &cumul, &cumul);
**/ **/
x_add_rgb2fimg(buffers[buf.index].start, x_add_rgb2fimg(buffers[buf.index].start,
fmt.fmt.pix.width, fmt.fmt.pix.height, &cumul); fmt.fmt.pix.width, fmt.fmt.pix.height, &cumul);
#endif #endif
#if SAVE_AS_FIMG #if SAVE_AS_FIMG

View File

@ -5,11 +5,6 @@
#include "funcs.h" #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) int x_upscaler(unsigned char *src, int w, int h, FloatImg *d)
{ {
@ -18,14 +13,6 @@ int x, y, xx, yy;
float r, g, b; float r, g, b;
static unsigned short modz; 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; // rp = d->R, gp = d->G, bp = d->B;
for (y=0; y<h; y++) { for (y=0; y<h; y++) {
@ -62,6 +49,7 @@ for (iter=0; iter<size; iter++) {
return 0; return 0;
} }
/* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */
/* --------------------------------------------------------------------- */
int x_add_rgb2fimg(unsigned char *src, int w, int h, FloatImg *d) int x_add_rgb2fimg(unsigned char *src, int w, int h, FloatImg *d)
{ {
int iter, size; int iter, size;
@ -76,12 +64,8 @@ for (iter=0; iter<size; iter++) {
*bp++ += (float)*src++; *bp++ += (float)*src++;
} }
d->count++; /* one more frame in the accumulator */
return 0; return 0;
} }
/* --------------------------------------------------------------------- */
int x_rgb2file(unsigned char *src, int w, int h, char *fname) int x_rgb2file(unsigned char *src, int w, int h, char *fname)
{ {
FloatImg buff; FloatImg buff;

View File

@ -33,6 +33,7 @@ if (verbosity) fprintf(stderr, "\topen %s -> %d\n", dev, vfd);
memset(&fmt, 0, sizeof(fmt)); memset(&fmt, 0, sizeof(fmt));
fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
// pr_v4l2_format("before ioctl", &fmt);
foo = ioctl(vfd, VIDIOC_G_FMT, &fmt); foo = ioctl(vfd, VIDIOC_G_FMT, &fmt);
fprintf(stderr, "ioctl -> %d\n", foo); fprintf(stderr, "ioctl -> %d\n", foo);
@ -41,18 +42,25 @@ if (0 != foo) {
exit(1); exit(1);
} }
pr_v4l2_format("after ioctl VIDIOC_G_FMT", &fmt); pr_v4l2_format("after ioctl", &fmt);
return k; return k;
} }
/* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */
int liste_des_devices(int K)
{
fprintf(stderr, "%s not implemented\n", __func__);
return -1;
}
/* --------------------------------------------------------------------- */
void help(int k) void help(int k)
{ {
puts("Options :"); puts("Options :");
puts("\t-d\tselect the video device"); puts("\t-d\tselect the video device");
puts("\t-K\tset the K parameter"); puts("\t-K\tset the K parameter");
puts("\t-l\tlist video devices");
puts("\t-v\tincrease verbosity"); puts("\t-v\tincrease verbosity");
if (verbosity) { puts(""); fimg_print_version(1); } if (verbosity) { puts(""); fimg_print_version(1); }

View File

@ -95,7 +95,7 @@ return 0;
int enum_controls(int fd, char *txt, int k) int enum_controls(int fd, char *txt, int k)
{ {
struct v4l2_queryctrl qctrl; struct v4l2_queryctrl qctrl;
int idx; int foo, idx;
printf("-- controls enumeration '%s'\n", txt); printf("-- controls enumeration '%s'\n", txt);
@ -208,6 +208,7 @@ fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
foo = ioctl(vfd, VIDIOC_G_FMT, &fmt); foo = ioctl(vfd, VIDIOC_G_FMT, &fmt);
if (0 != foo) { if (0 != foo) {
perror("ioctl G_FMT"); perror("ioctl G_FMT");
// exit(1);
} }
else { else {
pr_v4l2_format("Experimental", &fmt); pr_v4l2_format("Experimental", &fmt);
@ -248,13 +249,9 @@ static void print_title(char *txt)
int foo, l; int foo, l;
l = strlen(txt); l = strlen(txt);
for (foo=0; foo<l+18; foo++) for (foo=0; foo<l+18; foo++) putchar('*'); puts("");
putchar('*');
puts("");
printf("****** %s ******\n", txt); printf("****** %s ******\n", txt);
for (foo=0; foo<l+18; foo++) for (foo=0; foo<l+18; foo++) putchar('*'); puts("\n");
putchar('*');
puts("\n");
} }
/* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */
int main(int argc, char *argv[]) int main(int argc, char *argv[])