|
|
|
@ -21,6 +21,7 @@ |
|
|
|
|
|
|
|
|
|
\setlength \parskip {0.40em} |
|
|
|
|
|
|
|
|
|
\setlength{\hoffset}{0em} |
|
|
|
|
\setlength{\textheight}{640pt} |
|
|
|
|
\setlength{\textwidth}{422pt} |
|
|
|
|
\setlength{\marginparwidth}{10pt} |
|
|
|
@ -82,8 +83,6 @@ visée. Les justifications mathématiques attendront le retour |
|
|
|
|
du schmod777. Ceci dit, rien ne nous empêche d'aller consulter |
|
|
|
|
Wikipedia~: |
|
|
|
|
|
|
|
|
|
% XXX XXX XXX\vspace{1em} |
|
|
|
|
|
|
|
|
|
\begin{quotation} |
|
|
|
|
An IEEE 754 32-bit base-2 floating-point variable has |
|
|
|
|
a maximum value of |
|
|
|
@ -99,7 +98,8 @@ IEEE 754-1985. |
|
|
|
|
|
|
|
|
|
Ce qui nous conduit à estimer qu'il est possible de cumuler environ |
|
|
|
|
quelques milliers d'images standard à 256 niveaux, sans trop avoir |
|
|
|
|
à se soucier des éventuelles pertes de précision. |
|
|
|
|
à se soucier des éventuelles pertes de précision. Mais ça demande |
|
|
|
|
à être confirmé par des esprits supérieurs. |
|
|
|
|
|
|
|
|
|
% ------------------------------------------------------------------- |
|
|
|
|
|
|
|
|
@ -109,19 +109,15 @@ quelques milliers d'images standard à 256 niveaux, sans trop avoir |
|
|
|
|
basiques en C, gérant la structure des données d'image en mémoire |
|
|
|
|
et sur disque. Ça a été imaginé de façon presque empirique, |
|
|
|
|
mais nous sommes tous là pour améliorer les choses, dans |
|
|
|
|
la mesure de nos moyes. |
|
|
|
|
la mesure de nos moyens. |
|
|
|
|
Nous allons donc directement rentrer au cœur du problème. |
|
|
|
|
|
|
|
|
|
% XXX XXX XXX\vspace{1em} |
|
|
|
|
|
|
|
|
|
Pour commencer par quelques chose de simple, |
|
|
|
|
nous allons créer une image RGB\index{RGB} complètement noire, |
|
|
|
|
puis l'enregistrer dans un fichier \texttt{.fimg}\index{.fimg}, |
|
|
|
|
un format complètement inconnu, puisque je viens de l'inventer |
|
|
|
|
à l'instant même. |
|
|
|
|
|
|
|
|
|
% XXX XXX XXX\vspace{1em} |
|
|
|
|
|
|
|
|
|
Tout d'abord, nous devons déclarer et garnir quelques variables |
|
|
|
|
pour gérer la machinerie interne. |
|
|
|
|
|
|
|
|
@ -173,8 +169,6 @@ Nous avons donc sous la main une mécanique qui ne demande qu'à |
|
|
|
|
faire des trucs futiles et des images qui clignotent. |
|
|
|
|
La suite vers la page \pageref{codaz}. |
|
|
|
|
|
|
|
|
|
% XXX XXX XXX\vspace{1em} |
|
|
|
|
|
|
|
|
|
Vous trouverez dans le répertoire \texttt{tools/}\index{tools/} |
|
|
|
|
d'autres exemples de mise en œuvre des fonctions disponibles |
|
|
|
|
sous formes d'outils en ligne de commande, |
|
|
|
@ -207,8 +201,6 @@ Dans chacun des répertoires à traiter, ce script devrait trouver |
|
|
|
|
un Makefile et un fichier \texttt{t.c} qui est le source de la cible |
|
|
|
|
par défaut du make. |
|
|
|
|
|
|
|
|
|
% XXX XXX XXX\vspace{1em} |
|
|
|
|
|
|
|
|
|
Pour le moment, la procédure d'installation est un peu rude, |
|
|
|
|
pour ne pas dire clairement sommaire. |
|
|
|
|
Si le résultat de l'étape compilation vous semble correct, |
|
|
|
@ -278,8 +270,6 @@ d'idées approximatives. C'est cette utilisation constructive de larache |
|
|
|
|
qui fait que seuls les champs documentés de cette structure ne sont |
|
|
|
|
pas explosifs. |
|
|
|
|
|
|
|
|
|
% XXX XXX XXX\vspace{1em} |
|
|
|
|
|
|
|
|
|
Mais revenons aux choses sérieuses\dots |
|
|
|
|
Les deux champs suivants (fval et count) sont à la disposition du |
|
|
|
|
\textsl{yuser} |
|
|
|
@ -288,8 +278,6 @@ 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... |
|
|
|
|
|
|
|
|
|
% XXX XXX XXX\vspace{1em} |
|
|
|
|
|
|
|
|
|
Le champ \textsl{count} sera mis à 0 et |
|
|
|
|
le champ \textsl{fval} sera initialisé à 15.0 |
|
|
|
|
(qui est la valeur maximale que peut renvoyer le capteur). |
|
|
|
@ -324,8 +312,6 @@ documentés dans ce document, et les autres sont dangereux à |
|
|
|
|
toucher. Les types d'images actuellement gérés sont les trois grands |
|
|
|
|
classiques : gray, rgb et rgba. et expliquées quelques lignes plus haut. |
|
|
|
|
|
|
|
|
|
% XXX XXX XXX\vspace{1em} |
|
|
|
|
|
|
|
|
|
C'est bien beau d'être enfin résident en mémoire centrale, mais |
|
|
|
|
pouvoir aussi exister à long terme en étant stocké dans la matrice |
|
|
|
|
est tout aussi pertinent. Il y a deux opérations qui supportent le |
|
|
|
@ -347,8 +333,11 @@ int fimg_fileinfos(char *fname, int datas[3]); |
|
|
|
|
\end{verbatim} |
|
|
|
|
|
|
|
|
|
Si tout s'est bien passé (valeur retournée égale à 0), |
|
|
|
|
on va trouver la largeur dans datas[0], |
|
|
|
|
la hauteur dans datas[1] et le type dans datas[2]. |
|
|
|
|
on va trouver la largeur dans \texttt{datas[0]}, |
|
|
|
|
la hauteur dans \texttt{datas[1]} et le type dans \texttt{datas[2]}. |
|
|
|
|
|
|
|
|
|
La fonction \texttt{fimg\_type\_is\_valid(int type)} peut |
|
|
|
|
vous aider. |
|
|
|
|
|
|
|
|
|
% _________ |
|
|
|
|
|
|
|
|
@ -378,11 +367,13 @@ photographie\index{photographie} en cumul\index{cumul}. |
|
|
|
|
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. |
|
|
|
|
Les autres sont à imaginer. |
|
|
|
|
|
|
|
|
|
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. |
|
|
|
|
maximale \textsl{supposée} de l'image source, |
|
|
|
|
valeur qui peut être déterminée de plusieurs manières. |
|
|
|
|
|
|
|
|
|
\begin{verbatim} |
|
|
|
|
/* source in lib/contrast.c */ |
|
|
|
@ -392,6 +383,11 @@ int fimg_cos_01(FloatImg *s, FloatImg *d, double maxval); |
|
|
|
|
int fimg_cos_010(FloatImg *s, FloatImg *d, double maxval); |
|
|
|
|
\end{verbatim} |
|
|
|
|
|
|
|
|
|
\begin{figure} |
|
|
|
|
\input{foo.tex} % XXX XXX XXX |
|
|
|
|
\caption{Correcteur cos01} |
|
|
|
|
\end{figure} |
|
|
|
|
|
|
|
|
|
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 |
|
|
|
@ -471,11 +467,11 @@ Les autres bits ne sont pas utilisés et doivent être à zéro. |
|
|
|
|
|
|
|
|
|
\subsubsection{Vers PNG}\index{PNG} |
|
|
|
|
|
|
|
|
|
Actuellement, on peut enregistrer uniquement en mode 8 bits par composante, |
|
|
|
|
mais avec une bonne compression. |
|
|
|
|
Actuellement, on peut enregistrer uniquement en mode RGB, 8 bits par composante, |
|
|
|
|
mais on a quand même une bonne compression, ça compense. |
|
|
|
|
|
|
|
|
|
\begin{verbatim} |
|
|
|
|
int fimg_save_as_png(FloatImg *src, char *outname, int flags) |
|
|
|
|
int fimg_save_as_png(FloatImg *src, char *outname, int flags); |
|
|
|
|
\end{verbatim} |
|
|
|
|
|
|
|
|
|
\subsubsection{Vers TIFF}\index{TIFF} |
|
|
|
@ -515,12 +511,20 @@ To be done\index{XXX} |
|
|
|
|
|
|
|
|
|
\subsection{Exemple de fonction}\index{exemple} |
|
|
|
|
|
|
|
|
|
Nous allons écrire une fonction qui va faire quelque chose |
|
|
|
|
Nous allons maintenant écrire une fonction intégrable dans |
|
|
|
|
le répertoire \texttt{funcs/}. |
|
|
|
|
Elle aura donc accès aux \textsl{internals}% |
|
|
|
|
\footnote{que je peux décider de changer n'importe quand} |
|
|
|
|
de \textsc{FloatImg}, |
|
|
|
|
une chose qui est en principe interdit aux programmes |
|
|
|
|
\textsl{enduser}. Soyez prudents. |
|
|
|
|
|
|
|
|
|
Cette fonction va faire quelque chose |
|
|
|
|
à partir d'une image source et d'une valeur, et écrire le |
|
|
|
|
résultat dans une image de destination. |
|
|
|
|
Pour simplifier les choses, nous n'allons traiter que les |
|
|
|
|
images de type \textsc{FIMG\_TYPE\_RGB}, de loin le plus |
|
|
|
|
répandu. |
|
|
|
|
répandu par les temps qui courent. |
|
|
|
|
|
|
|
|
|
\begin{verbatim} |
|
|
|
|
int fimg_example(FloatImg *s, FloatImg *d, float value) |
|
|
|
@ -528,6 +532,7 @@ int fimg_example(FloatImg *s, FloatImg *d, float value) |
|
|
|
|
int size, index; |
|
|
|
|
|
|
|
|
|
if ( s->type!=FIMG_TYPE_RGB || d->type!=FIMG_TYPE_RGB) { |
|
|
|
|
perror("fimg_example"); |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -560,19 +565,19 @@ in-fine sur des objets que l'on peut considérer comme « physiques », |
|
|
|
|
il est important de passer à une utilisation |
|
|
|
|
normale\footnote{Il y a une vie en dehors de git.} et construire |
|
|
|
|
des trucs qui mettent en action le code primitif. |
|
|
|
|
% XXX XXX XXX\vspace{1em} |
|
|
|
|
|
|
|
|
|
Ces machins ont en commun deux options bien pratiques~: |
|
|
|
|
\texttt{-h} pour avoir un résumé des options disponibles |
|
|
|
|
et \texttt{-v} qui augmente la puissance de bavardage. |
|
|
|
|
Ces machins ont en commun quelques options bien pratiques~: |
|
|
|
|
\texttt{-h} pour avoir un résumé des options disponibles, |
|
|
|
|
\texttt{-v} qui augmente la puissance de bavardage, et |
|
|
|
|
\texttt{-K nn.nn} pour un paramètre flottant. |
|
|
|
|
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 |
|
|
|
|
(ou pas). |
|
|
|
|
Propose la création d'un fichier contenant une image de « teinte » |
|
|
|
|
constante (ou pas). |
|
|
|
|
Cette notion de teinte est assez inconsistante pour le moment, |
|
|
|
|
mais ça n'est pas si grave que ça. |
|
|
|
|
|
|
|
|
@ -589,7 +594,7 @@ La plupart des types d'image générée prennent un paramètre flottant qui |
|
|
|
|
devra être donné avec l'option \texttt{-k F.F} avec une valeur par défaut |
|
|
|
|
à $1.0$. |
|
|
|
|
|
|
|
|
|
\begin{description} |
|
|
|
|
\begin{description} \index{XXX} |
|
|
|
|
\item [black/gray/grey:] efface avec 0.0 (black) ou avec la valeur |
|
|
|
|
\texttt{-k} (gray). |
|
|
|
|
\item [drand48:] beaucoup de bruit dans chacun des canaux. |
|
|
|
@ -643,7 +648,7 @@ pas vraiment compte du contenu de l'image. |
|
|
|
|
\begin{verbatim} |
|
|
|
|
tth@daubian:~/Devel/FloatImg/tools$ ./fimgfx -v -h |
|
|
|
|
--- fimg special effects --- |
|
|
|
|
cos01 cos010 pow2 sqrt |
|
|
|
|
cos01 cos010 pow2 sqrt gray0 xper |
|
|
|
|
\end{verbatim} |
|
|
|
|
|
|
|
|
|
Certaines de ces opérations ont besoin d'un paramètre flottant. |
|
|
|
@ -681,7 +686,9 @@ options: |
|
|
|
|
|
|
|
|
|
Pour des operateurs paramétrable (comme \texttt{mix}), le paramêtre |
|
|
|
|
flottant doit être fourni en utilisant l'option \texttt{-k}. |
|
|
|
|
La véracité mathématique n'est pas garantie. |
|
|
|
|
La véracité mathématique n'est pas garantie. Et n'oubliez pas que |
|
|
|
|
les valeurs négatives peuvent être la cause de \textsl{glitches} |
|
|
|
|
de qualitay. |
|
|
|
|
|
|
|
|
|
\subsection{fimg2png, fimg2pnm, fimg2tiff} |
|
|
|
|
\index{fimg2png}\label{fimg2png} |
|
|
|
@ -692,8 +699,6 @@ Quelques petits proggies pour exporter notre format\index{.fimg} secret |
|
|
|
|
vers des choses plus directement utilisables. À condition que le |
|
|
|
|
code soit écrit et documenté. |
|
|
|
|
|
|
|
|
|
% XXX XXX XXX\vspace{1em} |
|
|
|
|
|
|
|
|
|
D'un autre coté, écrire un greffon d'import/export pour |
|
|
|
|
Gimp\index{Gimp} ou Imagemagick\index{Imagemagick} ou Krita\index{Krita} |
|
|
|
|
ne devrait pas être trop difficile. Des volontaires ? |
|
|
|
@ -702,7 +707,6 @@ ne devrait pas être trop difficile. Des volontaires ? |
|
|
|
|
|
|
|
|
|
Nous avons vu dans ce document que chaque image flottante pouvait |
|
|
|
|
avoir plusieurs plans de réalité. Il ne faut en négliger aucun. |
|
|
|
|
% XXX XXX XXX\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 |
|
|
|
@ -713,8 +717,6 @@ de méthodes, toutes plus légitimes que les autres. |
|
|
|
|
|
|
|
|
|
Il reste plein de choses à faire pour que ce soit vraiment utilisable. |
|
|
|
|
|
|
|
|
|
% XXX XXX XXX\vspace{1em} |
|
|
|
|
|
|
|
|
|
\begin{itemize} |
|
|
|
|
|
|
|
|
|
\item Import/export au format \textsc{tiff}\index{tiff}. |
|
|
|
@ -733,8 +735,6 @@ avec un peu de rache\index{rache} dedans. Ce qui est autorisé dans |
|
|
|
|
les exemples, mais dans la vrai vie, il ne faut jamais négliger |
|
|
|
|
le traitement des éventuelles erreurs. |
|
|
|
|
|
|
|
|
|
% XXX XXX XXX\vspace{1em} |
|
|
|
|
|
|
|
|
|
Nous savons générer une image contenant des pixels aux valeurs |
|
|
|
|
probablement aléatoires (drand48\index{drand48}). Que se passe-t-il si |
|
|
|
|
nous faisons la somme de plusieurs centaines\footnote{Des erreurs toxiques ?} |
|
|
|
@ -762,14 +762,40 @@ que votre \texttt{drand48} n'est pas si drand que ça. Séquence angoisse. |
|
|
|
|
|
|
|
|
|
\subsection{Scripts}\index{scripts}\label{scripts} |
|
|
|
|
|
|
|
|
|
Le script bash\index{bash} \texttt{shoot.sh} est un front-end rudimentaire |
|
|
|
|
Le script bash\index{bash} \texttt{scripts/shoot.sh} est un front-end |
|
|
|
|
encore un peu rudimentaire |
|
|
|
|
vers le programme de capture d'image décrit page \pageref{grabvidseq}. |
|
|
|
|
Il utilise deux fichiers dans le répertoire de travail~: |
|
|
|
|
\textit{reglages} et \textit{compteur}. |
|
|
|
|
\textit{reglages} et \textit{compteur}. Le premier est, en fait, |
|
|
|
|
un bout de shell affectant quelques variables, ou plutôt, les surchargent. |
|
|
|
|
|
|
|
|
|
\begin{verbatim} |
|
|
|
|
OPTIONS="${OPTIONS} -v -c pow2 " |
|
|
|
|
SHOW="yes" |
|
|
|
|
NBRE=1000 |
|
|
|
|
PERIOD=0 |
|
|
|
|
OFORMAT="p_%04d.png" |
|
|
|
|
\end{verbatim} |
|
|
|
|
|
|
|
|
|
La première ligne demande, en plus des options par défaut, plus de |
|
|
|
|
bavardage, et un changement de contraste. La seconde demande |
|
|
|
|
l'affichage de la photo. Les deux suivantes demandent la |
|
|
|
|
capture de 1000 images à la cadence méga-blast. |
|
|
|
|
La dernière est moins simple~: \texttt{man sprintf}\index{printf} |
|
|
|
|
pour comprendre. |
|
|
|
|
|
|
|
|
|
Quand au second fichier, il contient un compteur (stocké en ascii) qui |
|
|
|
|
est incrémenté après chaque capture réussie. Et ce compteur est |
|
|
|
|
utilisable par la variable \texttt{OFORMAT} que nous avons |
|
|
|
|
vue quelques lignes plus haut. |
|
|
|
|
|
|
|
|
|
\subsection{Fonderie}\index{fonderie}\label{fonderie} |
|
|
|
|
|
|
|
|
|
Projet externe en cours d'expérimentation. |
|
|
|
|
Ce projet externe\footnote{... pour le moment, j'ai des soucis sur |
|
|
|
|
l'architecture du \textbf{pipdeprod} à adopter\dots} est destiné à la confection |
|
|
|
|
de films flous\index{film} à partir de photos floues. |
|
|
|
|
Le script \texttt{scripts/echomix.sh} est une première expérimentation |
|
|
|
|
en bash, utilisant deux outils en \textsc{cli}. |
|
|
|
|
|
|
|
|
|
% ------------------------------------------------------------------- |
|
|
|
|
\section{Video for Linux}\index{v4l2} |
|
|
|
@ -778,8 +804,6 @@ Donc, maintenant, nous savons un peu tripoter ces images flottantes. |
|
|
|
|
Et nous devons nous poser une question fondamentale\footnote{primitive ?} |
|
|
|
|
sur la provenance de ces données prétendant être des images. |
|
|
|
|
|
|
|
|
|
% XXX XXX XXX\vspace{1em} |
|
|
|
|
|
|
|
|
|
En fait, notre désir secret est la découverte des choses cachées du |
|
|
|
|
monde qui nous entoure. Nous voulons des images du \textbf{réel} et |
|
|
|
|
pour cela, l'outil le plus commun, le plus répandu, |
|
|
|
@ -839,8 +863,6 @@ Pour être rigoureux dans la prise de vue, ce $N$ doit |
|
|
|
|
N'hésitez pas à faire des essais, le résultat est parfois |
|
|
|
|
aléatoire, surtout avec une caméra qui bouge. |
|
|
|
|
|
|
|
|
|
% XXX XXX XXX\vspace{1em} |
|
|
|
|
|
|
|
|
|
\textbf{Là, il manque un schéma\dots} |
|
|
|
|
|
|
|
|
|
\subsection{video-infos}\index{video-infos}\label{video-infos} |
|
|
|
@ -873,8 +895,6 @@ Sauf que c'est quand même un peu galère à déplacer, il faut |
|
|
|
|
avoir un shell pour déclencher, c'est pas facile à utiliser |
|
|
|
|
en mode portnawak\dots |
|
|
|
|
|
|
|
|
|
% XXX XXX XXX\vspace{1em} |
|
|
|
|
|
|
|
|
|
L'idée est donc de construire un appareil autonome, basé sur un Raspi et |
|
|
|
|
une webcam \textsc{usb}\index{USB}, pilotable par \textsc{lirc}\index{LIRC}, |
|
|
|
|
alimenté par une (grosse) batterie et permettant d'aller |
|
|
|
|