Compare commits
No commits in common. "9ae7e4d85fb4e6e606b704393dd0506c06d53710" and "b62b5a4805ce0cbf29e6bc815d7d214f5bc81eca" have entirely different histories.
9ae7e4d85f
...
b62b5a4805
1
.gitignore
vendored
1
.gitignore
vendored
@ -43,4 +43,3 @@ tools/addtga2fimg
|
|||||||
tools/addpnm2fimg
|
tools/addpnm2fimg
|
||||||
tools/cumulfimgs
|
tools/cumulfimgs
|
||||||
tools/fimgops
|
tools/fimgops
|
||||||
tools/fimgfx
|
|
||||||
|
@ -51,10 +51,9 @@ chaque pixel en virgule flottante sur 32bits, le type
|
|||||||
|
|
||||||
Attention, tout le code que nous allons voir ensemble est en
|
Attention, tout le code que nous allons voir ensemble est en
|
||||||
perpétuelle évolution\footnote{voir page \pageref{TODO}},
|
perpétuelle évolution\footnote{voir page \pageref{TODO}},
|
||||||
et sa fiablité (surtout sur certains aspects mathématiques)
|
et sa fiablité reste à démontrer\index{valgrind}.
|
||||||
reste à démontrer\index{valgrind}.
|
|
||||||
Mais le service après-vente est assez réactif. Du moins
|
Mais le service après-vente est assez réactif. Du moins
|
||||||
pour ceux qui suivent le canal \texttt{\#tetalab} sur le réseau
|
pour ceux qui suivent \texttt{\#tetalab} sur le réseau
|
||||||
IRC de Freenode.
|
IRC de Freenode.
|
||||||
|
|
||||||
% -------------------------------------------------------------------
|
% -------------------------------------------------------------------
|
||||||
@ -80,8 +79,6 @@ puis l'enregistrer dans un fichier \texttt{.fimg}\index{.fimg},
|
|||||||
un format complètement inconnu, puisque je viens de l'inventer
|
un format complètement inconnu, puisque je viens de l'inventer
|
||||||
à l'instant même.
|
à l'instant même.
|
||||||
|
|
||||||
\vspace{1em}
|
|
||||||
|
|
||||||
Tout d'abord, nous devons déclarer et garnir quelques variables
|
Tout d'abord, nous devons déclarer et garnir quelques variables
|
||||||
pour gérer la machinerie interne.
|
pour gérer la machinerie interne.
|
||||||
|
|
||||||
@ -92,9 +89,8 @@ FloatImg fimg;
|
|||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
|
|
||||||
Ensuite, nous enchainerons trois étapes : création de l'image
|
Ensuite, nous enchainerons trois étapes : création de l'image
|
||||||
en mémoire centrale, initialisation des valeurs de chaque pixel à 0.0,
|
en mémoire centrale, initialisations des valeurs de pixel à 0.0,
|
||||||
et pour conclure, enregistrement dans un fichier\footnote{Au format
|
et pour conclure, enregistrement dans un fichier.
|
||||||
ésotérique, mais très véloce.} binaire.
|
|
||||||
|
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
foo = fimg_create(&fimg, width, height, FIMG_TYPE_RGB);
|
foo = fimg_create(&fimg, width, height, FIMG_TYPE_RGB);
|
||||||
@ -143,9 +139,6 @@ lesquels sont décrits en page \pageref{outils}.
|
|||||||
% -------------------------------------------------------------------
|
% -------------------------------------------------------------------
|
||||||
\section{Installation}
|
\section{Installation}
|
||||||
|
|
||||||
\textit{Attention, ça devient un peu gore.}
|
|
||||||
|
|
||||||
|
|
||||||
\subsection{Prérequis}
|
\subsection{Prérequis}
|
||||||
|
|
||||||
Vous devez, en dehors des outils classiques (bash, gcc, make\dots),
|
Vous devez, en dehors des outils classiques (bash, gcc, make\dots),
|
||||||
@ -262,9 +255,8 @@ int fimg_destroy(FloatImg *fimg);
|
|||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
|
|
||||||
Les types d'images actuellement gérés sont les trois grands
|
Les types d'images actuellement gérés sont les trois grands
|
||||||
classiques : gray, rgb et rgba. Les constantes adéquates sont
|
classiques : gray, rgb et rgba. Il y a les constantes adéquates
|
||||||
dans \texttt{floatimg.h} et expliquées quelques lignes plus haut.
|
dans \texttt{floatimg.h}. Les codes d'erreur sont disparates
|
||||||
Les codes d'erreur sont disparates
|
|
||||||
et non documentés.
|
et non documentés.
|
||||||
\vspace{1em}
|
\vspace{1em}
|
||||||
|
|
||||||
@ -280,44 +272,7 @@ int fimg_plot_rgb (FloatImg *head, int x, int y,
|
|||||||
Les paramètres sont explicites, mais leur validité doit être
|
Les paramètres sont explicites, mais leur validité doit être
|
||||||
sévèrement controlée par l'appelant. Il y a une fonction
|
sévèrement controlée par l'appelant. Il y a une fonction
|
||||||
soeur, \texttt{fimg\_add\_rgb}\index{fimg\_add\_rgb},
|
soeur, \texttt{fimg\_add\_rgb}\index{fimg\_add\_rgb},
|
||||||
qui ajoute du rgb à un pixel, laquelle a d'ailleur été
|
qui ajoute du rgb à un pixel.
|
||||||
la base de la seconde génération de la
|
|
||||||
photographie\index{photographie} en cumul\index{cumul}.
|
|
||||||
|
|
||||||
\subsubsection{Contraste}\index{contraste}
|
|
||||||
|
|
||||||
Certaines opérations d'ajustement du contraste d'une image
|
|
||||||
semblent cohérents avec la notion d'image flottante.
|
|
||||||
Certains d'entre eux, les plus simples, sont disponibles.
|
|
||||||
|
|
||||||
Ils prennent chacun trois paramètres, d'abord les images
|
|
||||||
source et destination (\texttt{* FloatImg}), et le troisième
|
|
||||||
est un nombre en double précision donnant la valeur
|
|
||||||
maximale \textsl{supposée} de l'image source.
|
|
||||||
|
|
||||||
\begin{verbatim}
|
|
||||||
/* source in lib/contrast.c */
|
|
||||||
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);
|
|
||||||
\end{verbatim}
|
|
||||||
|
|
||||||
Rappelons qu'il est possible pour un logiciel applicatif
|
|
||||||
comme \texttt{grabvidseq} (Cf page \pageref{grabvidseq})
|
|
||||||
de renseigner deux champs du descripteur d'image avec des
|
|
||||||
données pertinentes.
|
|
||||||
Ces deux champs sont \textit{fval} et \textit{count}.
|
|
||||||
Dans ce cas particulier, le premier indique la valeur
|
|
||||||
maximale du capteur, et le second sert à compter le
|
|
||||||
nombre de capture\footnote{Et c'est bien géré aussi
|
|
||||||
dans l'upscaling.} effectuées.
|
|
||||||
|
|
||||||
\vspace{1em}
|
|
||||||
|
|
||||||
La prochaine étape consistera à trouver une façon de faire
|
|
||||||
une égalisation\index{égalisation} par histogramme\index{histogramme}
|
|
||||||
qui respecte, dans toute sa futilité, le concept\index{concept}
|
|
||||||
de pixel flottant.
|
|
||||||
|
|
||||||
\subsection{funcs/}\index{funcs/}\label{funcs}
|
\subsection{funcs/}\index{funcs/}\label{funcs}
|
||||||
|
|
||||||
@ -431,15 +386,9 @@ les valeurs moyennes de chaque composante.
|
|||||||
Puis nous rajouterons\footnote{Les patchs sont les bienvenus}
|
Puis nous rajouterons\footnote{Les patchs sont les bienvenus}
|
||||||
le calcul de la variance\index{variance}.
|
le calcul de la variance\index{variance}.
|
||||||
|
|
||||||
\subsection{fimgfx}\index{fimgfx}\label{fimgfx}
|
|
||||||
|
|
||||||
\textit{En cours de création\index{XXX}.
|
|
||||||
Attention, je vais expérimenter un parsing un peu étrange
|
|
||||||
sur les arguments de la ligne de commande. coredump expected.}
|
|
||||||
|
|
||||||
\subsection{fimgops}\index{fimgops}\label{fimgops}
|
\subsection{fimgops}\index{fimgops}\label{fimgops}
|
||||||
|
|
||||||
Quelques opérations diverses entre deux images, qui doivent être
|
Operations diverses entre deeux images, qui doivent être
|
||||||
de la même taille, et du même type \textsl{pour le moment,
|
de la même taille, et du même type \textsl{pour le moment,
|
||||||
uniquement RGB}.
|
uniquement RGB}.
|
||||||
|
|
||||||
@ -499,15 +448,14 @@ Il reste plein de choses à faire pour que ce soit vraiment utilisable.
|
|||||||
\textsl{[en cours]}.
|
\textsl{[en cours]}.
|
||||||
\item Compléter les traitements mathémathiques (eg le gamma\index{gamma}).
|
\item Compléter les traitements mathémathiques (eg le gamma\index{gamma}).
|
||||||
\item Formaliser les codes d'erreur.
|
\item Formaliser les codes d'erreur.
|
||||||
|
\
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
||||||
% -------------------------------------------------------------------
|
% -------------------------------------------------------------------
|
||||||
\section{Exemples pour yusers}\index{example}
|
\section{Exemples pour yusers}\index{example}
|
||||||
|
|
||||||
Nous allons \textsl{essayer d'improviser} un exemple presque réel,
|
Nous allons \textsl{essayer d'improviser} un exemple presque réel,
|
||||||
avec un peu de rache\index{rache} dedans. Ce qui est autorisé dans
|
avec un peu de rache\index{rache} dedans.
|
||||||
les exemples.
|
|
||||||
|
|
||||||
\vspace{1em}
|
\vspace{1em}
|
||||||
|
|
||||||
@ -537,7 +485,7 @@ convert -delay 10 xx*.pnm foo.gif
|
|||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
|
|
||||||
Voilà, si les choses se passent mal, vous allez découvrir
|
Voilà, si les choses se passent mal, vous allez découvrir
|
||||||
que votre drand n'est pas si drand que ça. Séquence angoisse.
|
que votre drand n'est pas si drand que ça.
|
||||||
|
|
||||||
|
|
||||||
% -------------------------------------------------------------------
|
% -------------------------------------------------------------------
|
||||||
@ -598,9 +546,7 @@ de l'image, en profitant du fait que l'on est capable
|
|||||||
de prendre $N$ images en rafale.
|
de prendre $N$ images en rafale.
|
||||||
|
|
||||||
Pour être rigoureux dans la prise de vue, ce $N$ doit
|
Pour être rigoureux dans la prise de vue, ce $N$ doit
|
||||||
être un multiple de 4, surtout si le nombre de capture est faible.
|
être un multiple de 4, surtout si le nombre de capture est faible..
|
||||||
N'hésitez pas à faire des essais, le résultat est parfois
|
|
||||||
aléatoire, surtout avec une caméra qui bouge.
|
|
||||||
|
|
||||||
\vspace{1em}
|
\vspace{1em}
|
||||||
|
|
||||||
@ -644,7 +590,7 @@ en mode portnawak\dots
|
|||||||
|
|
||||||
L'idée est donc de construire un appareil autonome, basé sur un Raspi et
|
L'idée est donc de construire un appareil autonome, basé sur un Raspi et
|
||||||
une webcam \textsc{usb}\index{USB}, alimenté par batterie et permettant d'aller
|
une webcam \textsc{usb}\index{USB}, alimenté par batterie et permettant d'aller
|
||||||
faire des images au bord d'un lac ou dans la campagne de l'Ariège.
|
faire des images au bord d'un lac.
|
||||||
|
|
||||||
% -------------------------------------------------------------------
|
% -------------------------------------------------------------------
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
* floatimg.h
|
* floatimg.h
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define FIMG_VERSION 78
|
#define FIMG_VERSION 77
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* in memory descriptor
|
* in memory descriptor
|
||||||
|
@ -17,7 +17,7 @@ do
|
|||||||
echo _______________________ ${picz}
|
echo _______________________ ${picz}
|
||||||
|
|
||||||
# ../tools/fimgstats -v ${picz}.fimg
|
# ../tools/fimgstats -v ${picz}.fimg
|
||||||
../tools/fimg2pnm ${picz}.fimg ${picz}.pnm
|
../tools/fimg2pnm -v ${picz}.fimg ${picz}.pnm
|
||||||
|
|
||||||
convert -pointsize 48 \
|
convert -pointsize 48 \
|
||||||
-fill black -annotate +14+40 "${picz}" \
|
-fill black -annotate +14+40 "${picz}" \
|
||||||
|
@ -9,7 +9,7 @@ DEPS = ../floatimg.h ../libfloatimg.a Makefile
|
|||||||
# ----------
|
# ----------
|
||||||
|
|
||||||
all: fimg2pnm mkfimg png2fimg fimgstats fimg2png \
|
all: fimg2pnm mkfimg png2fimg fimgstats fimg2png \
|
||||||
addpnm2fimg cumulfimgs fimgops fimgfx
|
addpnm2fimg cumulfimgs fimgops
|
||||||
|
|
||||||
fimgstats: fimgstats.c $(DEPS)
|
fimgstats: fimgstats.c $(DEPS)
|
||||||
gcc $(COPT) $< ../libfloatimg.a -o $@
|
gcc $(COPT) $< ../libfloatimg.a -o $@
|
||||||
@ -23,9 +23,6 @@ mkfimg: mkfimg.c $(DEPS)
|
|||||||
fimgops: fimgops.c $(DEPS)
|
fimgops: fimgops.c $(DEPS)
|
||||||
gcc $(COPT) $< ../libfloatimg.a -o $@
|
gcc $(COPT) $< ../libfloatimg.a -o $@
|
||||||
|
|
||||||
fimgfx: fimgfx.c $(DEPS)
|
|
||||||
gcc $(COPT) $< ../libfloatimg.a -o $@
|
|
||||||
|
|
||||||
fimg2pnm: fimg2pnm.c $(DEPS)
|
fimg2pnm: fimg2pnm.c $(DEPS)
|
||||||
gcc $(COPT) $< ../libfloatimg.a -o $@
|
gcc $(COPT) $< ../libfloatimg.a -o $@
|
||||||
|
|
||||||
|
168
tools/fimgfx.c
168
tools/fimgfx.c
@ -1,168 +0,0 @@
|
|||||||
/*
|
|
||||||
FIMGFX
|
|
||||||
*/
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#include "../floatimg.h"
|
|
||||||
|
|
||||||
/* --------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
int verbosity;
|
|
||||||
float global_fvalue;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
char *name;
|
|
||||||
int id;
|
|
||||||
int nbarg;
|
|
||||||
} Fx;
|
|
||||||
|
|
||||||
enum fxid { Fx_cos01, Fx_pow2, Fx_sqrt };
|
|
||||||
|
|
||||||
Fx fx_list[] = {
|
|
||||||
{ "cos01", Fx_cos01, 0 },
|
|
||||||
{ "pow2", Fx_pow2, 0 },
|
|
||||||
{ "sqrt", Fx_sqrt, 0 },
|
|
||||||
{ NULL, 0, 0 }
|
|
||||||
};
|
|
||||||
|
|
||||||
/* --------------------------------------------------------------------- */
|
|
||||||
int lookup_fx(char *txt)
|
|
||||||
{
|
|
||||||
Fx *fx;
|
|
||||||
int n;
|
|
||||||
|
|
||||||
#if DEBUG_LEVEL
|
|
||||||
fprintf(stderr, ">>> %s ( '%s' )\n", __func__, txt);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (n=0, fx=fx_list; fx->name; fx++, n++) {
|
|
||||||
#if DEBUG_LEVEL
|
|
||||||
fprintf(stderr, "-> %3d %s\n", n, fx->name);
|
|
||||||
#endif
|
|
||||||
if (!strcmp(fx->name, txt)) {
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
/* --------------------------------------------------------------------- */
|
|
||||||
static void help(int lvl)
|
|
||||||
{
|
|
||||||
|
|
||||||
printf("fimg special effects (%d)\n", lvl);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
/* --------------------------------------------------------------------- */
|
|
||||||
int do_an_effect(char *sf, int act, char *df)
|
|
||||||
{
|
|
||||||
FloatImg src, dest;
|
|
||||||
int foo;
|
|
||||||
double maxval;
|
|
||||||
|
|
||||||
#if 1
|
|
||||||
fprintf(stderr, ">>> %s ( '%s' %d '%s' )\n", __func__,
|
|
||||||
sf, act, df);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
foo = fimg_create_from_dump(sf, &src);
|
|
||||||
if (foo) {
|
|
||||||
fprintf(stderr, "err load '%s' : %d\n", sf, foo);
|
|
||||||
return foo;
|
|
||||||
}
|
|
||||||
|
|
||||||
maxval = (double)fimg_get_maxvalue(&src);
|
|
||||||
|
|
||||||
foo = fimg_clone(&src, &dest, 0);
|
|
||||||
if (foo) {
|
|
||||||
fprintf(stderr, "err clone %p : %d\n", &src, foo);
|
|
||||||
return foo;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (act) {
|
|
||||||
case Fx_cos01:
|
|
||||||
fimg_cos_01(&src, &dest, maxval); break;
|
|
||||||
case Fx_pow2:
|
|
||||||
fimg_power_2(&src, &dest, maxval); break;
|
|
||||||
case Fx_sqrt:
|
|
||||||
fimg_square_root(&src, &dest, maxval); break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
fprintf(stderr, "*** %s : %d is bad action\n", __func__, act);
|
|
||||||
break;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
foo = fimg_dump_to_file(&dest, df, 0);
|
|
||||||
if (foo) {
|
|
||||||
fprintf(stderr, "dumping datas to file give us a %d\n", foo);
|
|
||||||
return foo;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
/* --------------------------------------------------------------------- */
|
|
||||||
int main(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
int foo, opt, action;
|
|
||||||
int nba;
|
|
||||||
char *operator;
|
|
||||||
|
|
||||||
char *srcname = "";
|
|
||||||
char *dstname = "out.fimg";
|
|
||||||
|
|
||||||
while ((opt = getopt(argc, argv, "hk:v")) != -1) {
|
|
||||||
switch(opt) {
|
|
||||||
case 'h': help(0); break;
|
|
||||||
case 'k': global_fvalue = atof(optarg); break;
|
|
||||||
case 'v': verbosity++; break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#if 1
|
|
||||||
fprintf(stderr, "argc %d optind %d\n", argc, optind);
|
|
||||||
for (foo=0; foo<argc; foo++)
|
|
||||||
fprintf(stderr, "%3d %c %s\n", foo, foo==optind?'*':' ', argv[foo]);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (3 > argc-optind) {
|
|
||||||
fprintf(stderr, "%s need some arguments...\n", argv[0]);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
operator = argv[optind];
|
|
||||||
action = lookup_fx(operator);
|
|
||||||
if (action < 0) {
|
|
||||||
fprintf(stderr, "garbage found in opcode field : %s\n", operator);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (verbosity) {
|
|
||||||
fprintf(stderr, "global fvalue %f\n", global_fvalue);
|
|
||||||
fprintf(stderr, "action %d\n", action);
|
|
||||||
fprintf(stderr, "verbosity %d\n", verbosity);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((nba=fx_list[action].nbarg)) {
|
|
||||||
fprintf(stderr, "action '%s' need %d arg\n", operator, nba);
|
|
||||||
}
|
|
||||||
|
|
||||||
srcname = argv[optind+1];
|
|
||||||
dstname = argv[optind+2];
|
|
||||||
fprintf(stderr, "%s ==> %s\n", srcname, dstname);
|
|
||||||
|
|
||||||
foo = do_an_effect(srcname, action, dstname);
|
|
||||||
fprintf(stderr, "do an effect -> %d\n", foo);
|
|
||||||
|
|
||||||
|
|
||||||
fprintf(stderr, "\n%s [done]\n", argv[0]);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
/* --------------------------------------------------------------------- */
|
|
@ -1,6 +1,3 @@
|
|||||||
/*
|
|
||||||
FIMGOPS
|
|
||||||
*/
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
@ -80,9 +80,6 @@ puts("\t-s WxH\t\tsize of capture");
|
|||||||
puts("\t-c mode\t\tcontrast enhancement");
|
puts("\t-c mode\t\tcontrast enhancement");
|
||||||
puts("\t-u\t\ttry upscaling...");
|
puts("\t-u\t\ttry upscaling...");
|
||||||
puts("\t-v\t\tincrease verbosity");
|
puts("\t-v\t\tincrease verbosity");
|
||||||
if (verbosity) {
|
|
||||||
puts("\n\t\tXXX list all the contrast modes, please\n");
|
|
||||||
}
|
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
/* --------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------- */
|
||||||
|
Loading…
Reference in New Issue
Block a user