diff --git a/doc/the_floatimg_hack.tex b/doc/the_floatimg_hack.tex index df6181e..fa9e42b 100644 --- a/doc/the_floatimg_hack.tex +++ b/doc/the_floatimg_hack.tex @@ -5,7 +5,6 @@ \usepackage[french]{babel} \usepackage[utf8]{inputenc} \usepackage[T1]{fontenc} -% XXX \usepackage{lipsum} \usepackage{makeidx} \usepackage{listings} \usepackage{babel} @@ -20,6 +19,7 @@ \usepackage{xspace} \usepackage[verbose]{layout} +\setlength \parskip {0.40em} \setlength{\textheight}{640pt} \setlength{\textwidth}{422pt} @@ -41,7 +41,7 @@ Mais de quoi parle-t-on exactement ? -\vspace{1em} +% XXX XXX XXX\vspace{1em} Traditionnellement, les valeurs des pixels dans les images informatiques sont mémorisées sur 8 bits, un octet\index{octet}, @@ -53,7 +53,7 @@ chaque pixel en virgule flottante sur 32bits, le type \texttt{float}\index{float} du langage C. Ce qui correspond à la norme IEEE 754-1985. -\vspace{1em} +% XXX XXX XXX\vspace{1em} Attention, tout le code que nous allons voir ensemble est en perpétuelle évolution\footnote{voir page \pageref{TODO}}, @@ -65,20 +65,41 @@ IRC de Freenode. % ------------------------------------------------------------------- +\setlength \parskip {0em} + \tableofcontents \pagebreak +\setlength \parskip {0.40em} -% XXX \layout -% XXX \pagebreak +% \layout \pagebreak % ------------------------------------------------------------------- \section{Théorie}\index{théorie} -XXX\index{XXX} Pour le moment, seule la quête de l'empirisme absolu a été -visée. Les justifications mathématiques attendent le retour -du schmod777. +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 +$(2 - 2^{-23}) \times 2^{127} \approx 3.4028235 \times 10^{38}$. +All integers with 7 or fewer decimal digits, and any $2^{n}$ for +a whole number $-149 \leq n \leq 127$, can be converted exactly into +an IEEE 754 single-precision floating-point value. + +In the IEEE 754-2008 standard, the 32-bit base-2 format is +officially referred to as binary32; it was called single in +IEEE 754-1985. +\end{quotation} + +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. % ------------------------------------------------------------------- @@ -91,7 +112,7 @@ mais nous sommes tous là pour améliorer les choses, dans la mesure de nos moyes. Nous allons donc directement rentrer au cœur du problème. -\vspace{1em} +% XXX XXX XXX\vspace{1em} Pour commencer par quelques chose de simple, nous allons créer une image RGB\index{RGB} complètement noire, @@ -99,7 +120,7 @@ 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. -\vspace{1em} +% XXX XXX XXX\vspace{1em} Tout d'abord, nous devons déclarer et garnir quelques variables pour gérer la machinerie interne. @@ -152,7 +173,7 @@ 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}. -\vspace{1em} +% 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 @@ -164,7 +185,6 @@ lesquels sont décrits en page \pageref{outils}. \textit{Attention, ça devient un peu gore.} - \subsection{Prérequis} Vous devez, en dehors des outils classiques (bash, gcc, make\dots), @@ -173,8 +193,6 @@ pour Debian et dérivées}~: libv4l2, libpnglite, libtiff, libnetpbm, libz, et probablement d'autres choses. -\vspace{1em} - Il est même quasiment certain que Bash soit indispensable, tout comme \textsc{gnu}/make\index{make}. Une connaissance de base de l'utilisation du shell\index{shell} @@ -189,7 +207,7 @@ 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. -\vspace{1em} +% XXX XXX XXX\vspace{1em} Pour le moment, la procédure d'installation est un peu rude, pour ne pas dire clairement sommaire. @@ -198,8 +216,6 @@ vous pouvez copier les deux fichiers \texttt{floatimg.h} et \texttt{libfloatimg. dans un emplacement approprié, par exemple \texttt{/usr/local/include} et \texttt{/usr/local/lib}. -\vspace{1em} - Le script \texttt{install.sh}, à la racine du projet, est censé faciliter un peu la chose. Il prend également en compte la copie des divers binaires du dossier \texttt{tools/} (cf. page \pageref{outils}) @@ -215,7 +231,6 @@ de vos codes source, contenant un certain nombre de définition de structures, de macros, de constantes\footnote{À l'ancienne, via le pré-processeur} et les prototypes des fonctions utilisables par vos logiciels. -\vspace{1em} Au niveau du code source, ces fonctions sont approximativement classées en deux catégories : \texttt{lib/} et \texttt{funcs/}. @@ -263,7 +278,7 @@ 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. -\vspace{1em} +% XXX XXX XXX\vspace{1em} Mais revenons aux choses sérieuses\dots Les deux champs suivants (fval et count) sont à la disposition du @@ -273,7 +288,7 @@ 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} +% XXX XXX XXX\vspace{1em} Le champ \textsl{count} sera mis à 0 et le champ \textsl{fval} sera initialisé à 15.0 @@ -309,7 +324,7 @@ 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. -\vspace{1em} +% 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 @@ -328,10 +343,12 @@ ait précisément les mêmes caractéristiques pré-allouée. Mias comment peut-on connaitre ces valeurs ? \begin{verbatim} -int fimg_fileinfos(char *fname, int *datas); +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]. % _________ @@ -343,7 +360,7 @@ Il y a des fonctions pour ça, par exemple~: \begin{verbatim} int fimg_plot_rgb (FloatImg *head, int x, int y, - float r, float g, float b); + float r, float g, float b); \end{verbatim} Les paramètres sont explicites, mais leur validité doit être @@ -385,8 +402,6 @@ 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 fonction \texttt{fimg\_normalize(FloatImg *fi, double maxima, int notused);} tente de gérer ce cas d'utilisation. Son ajout au captureur d'images @@ -395,8 +410,6 @@ floues sera probablement le bienvenue. Je me suis bien rendu compte censé faire des films flous à partir d'images floues} en situation festive qu'il manquait des données dans la chaine de traitement. -\vspace{1em} - 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 @@ -404,8 +417,6 @@ 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} - 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} @@ -436,12 +447,15 @@ faut bien exporter nos images en quelque chose de plus connu. Bien entendu, c'est toujours affaire de compromis entre précision de valeurs et taille des fichiers. +Il faut aussi reconnaitre que c'est un peu la jungle dans les +formats de fichiers d'image\dots + \subsubsection{Vers PNM}\index{PNM} Nous avons ici 16 bits par composante, mais au prix d'une taille énorme sur les fichiers. D'autre coté, l'utilisation du codage \textsc{ascii}\index{ascii} -(alors qu'on peut mettre du binaire) y est pour quelque chose. +(alors qu'on pourrait mettre du binaire, plus compact) y est pour quelque chose. \begin{verbatim} int fimg_save_as_pnm(FloatImg *head, char *fname, int flags); @@ -457,8 +471,12 @@ Les autres bits ne sont pas utilisés et doivent être à zéro. \subsubsection{Vers PNG}\index{PNG} -Actuellement, uniquement en 8 bits par composante, mais bonne -compression. +Actuellement, on peut enregistrer uniquement en mode 8 bits par composante, +mais avec une bonne compression. + +\begin{verbatim} +int fimg_save_as_png(FloatImg *src, char *outname, int flags) +\end{verbatim} \subsubsection{Vers TIFF}\index{TIFF} @@ -542,7 +560,7 @@ 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. -\vspace{1em} +% XXX XXX XXX\vspace{1em} Ces machins ont en commun deux options bien pratiques~: \texttt{-h} pour avoir un résumé des options disponibles @@ -674,7 +692,7 @@ Quelques petits proggies pour exporter notre format\index{.fimg} secret vers des choses plus directement utilisables. À condition que le code soit écrit et documenté. -\vspace{1em} +% 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} @@ -684,7 +702,7 @@ 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. -\vspace{1em} +% 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 @@ -694,7 +712,8 @@ de méthodes, toutes plus légitimes que les autres. \section{TODO}\index{TODO}\label{TODO} Il reste plein de choses à faire pour que ce soit vraiment utilisable. -\vspace{1em} + +% XXX XXX XXX\vspace{1em} \begin{itemize} @@ -714,7 +733,7 @@ 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. -\vspace{1em} +% 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 @@ -758,7 +777,8 @@ Projet externe en cours d'expérimentation. 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. -\vspace{1em} + +% 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 @@ -794,9 +814,13 @@ L'option \texttt{-s} doit correspondre à une des résolutions possibles de votre capteur. Le type du fichier en sortie (option \texttt{-o}) est déterminé par l'extension, actuellement -seulement \texttt{.fimg} et \texttt{.pnm} sont reconnus. +seulement \texttt{.fimg}, \texttt{.pnm} et \texttt{.png} +sont reconnus. + La conversion en gris (option \texttt{-g}) mérite un peu plus de travail, et une paramétrisation plus facile. +L'ajustement de contraste (option\texttt{-c}) est +vaguement expliqué page \pageref{contraste}. L'option \texttt{-X} me permet d'intégrer des \textit{fritures} expérimentales dans le binaire, et ne doit donc pas être @@ -815,7 +839,7 @@ 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. -\vspace{1em} +% XXX XXX XXX\vspace{1em} \textbf{Là, il manque un schéma\dots} @@ -848,7 +872,8 @@ un Linux\index{Linux}, et ça \textsl{juste marche}. 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 -\vspace{1em} + +% 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},