diff --git a/doc/the_floatimg_hack.tex b/doc/the_floatimg_hack.tex index be61ca8..238d977 100644 --- a/doc/the_floatimg_hack.tex +++ b/doc/the_floatimg_hack.tex @@ -10,7 +10,7 @@ % \lstset{frame=single} % dessin d'un cadre autour du listing \lstset{basicstyle=\ttfamily\small} -\lstset{aboveskip=0.1em,belowskip=0.1em} +\lstset{aboveskip=0.01em,belowskip=0.1em} \usepackage{babel} % ? @@ -41,7 +41,7 @@ \makeindex % ------ a few new commands -\newcommand{\interparagraphe { \vspace{60pt} } } +\newcommand{\interparagraphe { \vspace{50pt} } } % ------------------------------------------------------------------- \title{Floating images processing (for fun and profit ?)} @@ -77,7 +77,8 @@ pour ceux qui suivent le canal \texttt{\#tetalab} sur le réseau IRC de \textsl{libera.chat}. \textbf{Attention !} ce document commence par une bonne rafale -de technique parfois \textsl{hardue}, avec des pointeurs dedans. +de technique parfois \textsl{hardue}\footnote{hard + ardue = private +joke Usenet}, avec des pointeurs dedans. Vous avez parfaitement le droit de sauter directement à la page \pageref{outils} pour quelque chose de plus concret. @@ -92,7 +93,7 @@ certains points. Je vais tenter de répondre à ces FAQ~:% « Fréquentes et Absurdes Questions » avec des réponses absurdes et précises. -\subsubsection*{c'est quoi un image d'un point de vue physique ?} +\subsubsection*{c'est quoi une image d'un point de vue physique ?} Une représentation approximative d'un monde physique invisible. L'infinie bio-complexité de notre système oculaire et ses interactions @@ -103,7 +104,7 @@ physique. Les détails techniques sur cette représentation sont en page \pageref{FloatImg desc}, avec des pointeurs dedans. -Ah, les pointeurs, la pire chose du monde\dots +Ah, les pointeurs, la pire chose du monde, mais pourquoi s'en passer\dots \subsubsection*{quelques rappels de comment on acquiert et numérise une image} @@ -140,7 +141,7 @@ la glisser dans le capitalisme de surveillance. \pagebreak \setlength \parskip {0.40em} -\layout \pagebreak +% XXX \layout \pagebreak % =================================================================== \section{Théorie}\index{théorie} @@ -169,6 +170,8 @@ quelques milliers d'images standard à 256 niveaux, sans trop avoir à se soucier des éventuelles pertes de précision. Mais ça demande à être confirmé par des esprits supérieurs. +https://dl.acm.org/doi/pdf/10.1145/103162.103163 + \subsection{Dynamique}\index{dynamique} Dynamique, précision et \textsl{macheps} ? Peu de gens connaissent @@ -181,7 +184,10 @@ effectuée afin d'éviter les potentiels inconvénients. Il est très difficle d'imaginer une lumière négative. Sauf peut-être si nous songeons à des coefficients d'absorption, ou un canal \textsl{alpha} qui inverserait les valeurs ? Un domaine dont -l'exploration peut confiner au mysticisme. +l'exploration peut confiner au mysticisme de part la multitude +des traitement possibles : valeur absolue, \textsl{clamping}, +report sur les autres composantes. Votre imagination est +la limite. % =================================================================== @@ -203,7 +209,7 @@ 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\footnote{Enfin, non, il y a déja longtemps, -avant la grande pandémie.} +avant la grande pandémie.}. Tout d'abord, nous devons déclarer et garnir quelques variables pour gérer la machinerie interne. @@ -1259,7 +1265,7 @@ if (foo) { \end{verbatim} À condition d'avoir bien réglé votre ulimit pour la génération d'un coredump, -vous aurez sous la main un fichier \textsc{core} qui vous permettra +vous aurez sous la main un fichier \texttt{core} qui vous permettra de, par exemple, remonter la pile d'appel avec la commande \texttt{back} de gdb. Mais pour le moment, juste une infime partie du code est instrumentée avec ce dispositif. @@ -1489,11 +1495,11 @@ v4l2. \subsection{grabvidseq}\index{grabvidseq}\label{grabvidseq} -Un logiciel en évolution (trop ?) lente, qui permet déja la capture -d'images en +Un logiciel en évolution (vraiment trop) lente, qui permet déja +la capture d'images en \textsl{longue pose} selon la méthode du cumul\index{cumul}, et devrait bientôt retrouver sa capacité à enregistrer des -séquences d'images. +séquences d'images. (\textsl{workaround}~: écrire une boucle en shell) \begin{verbatim} tth@debian:~/Devel/FloatImg/v4l2$ ./grabvidseq -h @@ -1564,7 +1570,7 @@ Options : Je me sens obligé d'avouer qu'il reste quelques points mystérieux dans l'\textsc{api} de \textsc{v4l2}, et donc, que ce que raconte ce logiciel doit être pris avec des pincettes. En particulier -la liste des résolutions disponibles. +des choses essentielles comme la liste des résolutions disponibles. \subsection{nc-camcontrol} @@ -1596,7 +1602,7 @@ devez mettre ce bout de XML\index{XML} dans le fichier C'est juste un hack rapide, qui ne fonctionne pas très bien avec d'autres commande de IM, comme identify, qui a tendance à raconter un peu n'importe quoi, puisqu'elle se base sur le -résultat de la conversion\dots +résultat de la conversion. Je compte donc sur le bouquin de \textsl{Brunus} pour avancer\dots \subsection{Gimp}\index{Gimp} @@ -1604,7 +1610,8 @@ Je compte donc sur le bouquin de \textsl{Brunus} pour avancer\dots Mmmmm... Ça semble un peu plus compliqué. La documentation à ce sujet me semble ésotérique. D'un autre coté, il -faut faire ça en \textbf{C}, ce qui ne peut pas être négatif. +faut faire ça en \textbf{C}, ce qui ne peut pas être totalement négatif. +Sauf pour les riiRistes. \subsection{ffmpeg}\index{ffmpeg} @@ -1617,23 +1624,33 @@ ffmpeg -nostdin \ -c:v libx264 \ -pix_fmt yuv420p \ -tune film \ + -metadata artist='---[ tTh ]---' \ + -metadata title='awesome video' \ stereo.mp4 \end{lstlisting} +Il existe environ un gazillion d'options pour encoder avec ffmpeg. +Bon courage pour toutes les explorer, voire même juste les comprendre. + \subsection{Et encore ?}\index{krita}\index{geeqie} Il y a d'autres logiciels pour lesquels écrire une fonction d'importation serait bien~: \textsl{Geeqie}, un visualiseur d'image fort pratique, ou \textsl{Krita} qui semble avoir les faveurs de dessinateurs de talent\footnote{Oui, David, c'est à toi que je pense.}. +Ce qui nous conduit à une question importante~: quels sont les logiciels +qui gèrent le chargement d'image par un système de +\textsl{plugin}\index{plugin}, +parce que recompiler tout Gimp juste pour ça, c'est un peu overkill. % =================================================================== \section{Le flou temporel} -Et si nous jouions sur l'axe du temps ? +\textit{\hspace{7em}Et si nous jouions sur l'axe du temps ?} -Nous avons plus ou moins la magie du cumul sur la prise de vue -d'\textbf{image} en enchainant plusieurs capture d'image. +Nous avons déja plus ou moins la magie du cumul sur la prise de vue +d'\textbf{image} en enchainant plusieurs captures d'image accumulées +en une seule. Maintenant, voyons ce que l'on peut faire à partir de plusieurs images. On peut d'abord penser faire une moyenne (ou la somme, en fait) de toutes ces images. Mais ce n'est qu'une façon déguisée de faire du cumul. @@ -1641,15 +1658,51 @@ C'est à ce moment que nous changeons l'axe de vue du défi. Par ailleurs, il m'a semblé pertinent d'inclure dans le projet une foultitude d'effets spéciaux. +Qui manquent cruellement de possibilités de paramétrage. +Mais peuvent être enchainés dans ce que j'appelle des +\textsl{filter-chains}~: ces effets seront appliqués dans +l'ordre aux image traitées soit en entrée soit en sortie. +Je pense qu'un schéma\footnote{omg, apprendre un nouveau truc en +\LaTeX, quel challenge étourdissant !} s'impose. -\subsection{\textsl{moving average}} -\texttt{./fonderie} : Basé sur la moyenne mobile, avec une structure de +\subsection{\texttt{./fonderie} : \textsl{moving average}} + +Basé sur la moyenne mobile, avec une structure de fifo\index{fifo} particulièrement mal conçue. +Qui, en fait, n'est pas vraiment un fifo, mais plutôt un buffer +circulaire. Pour chaque image source, elle est lue, passe dans la chaine de +filtre d'entrée et est insérée dans ce buffer. +Ensuite on calcule la moyenne des images contenues dans ce buffer. +Et pour conclure, cette image moyennée passe au travers de la +chaine de filtre de sortie, avant d'être enregistrée en PNG\index{PNG} +dans le répertoire de destination. + +\begin{verbatim} +*** fonderie compiled Jan 23 2023, 10:43:56, pid 23366 +options: + -E input:filter:chain + -F output:filter:chain + -I input glob pattern + -L list available filters + -O output directory + -T fifo size + -v increase verbosity +\end{verbatim} + +Euh, c'est quoi '\texttt{input glob pattern}' ? C'est ce qui vous permet +de sélectionner un peu les images que vous voulez traiter, exactement +comme vous pourriez le faire avec un shell classique. +Par exemple pour choisir une image sur dix, le glob-pattern sera +'\texttt{frames/????0.fimg}', et vous trouverez les explications détaillées +dans le manuel~: \texttt{glob(7)}, et \texttt{glob(3)} pour la +fonction utilisée. \subsection{Interpolator}\index{interpolator} -Juste des calculs pas si simple que ça. +Juste des calculs pas si simple que ça. Je pense qu'il faut +se lancer dans des calculs splinesques pour améliorer les choses dans +la création des images intermédiaires. \subsection{Singlepass} @@ -1657,6 +1710,23 @@ Ce programme \texttt{singlepass} prétend vous permettre de tester tous les filtres disponibles, dont on peut avoir la liste avec l'option \texttt{-L}\footnote{liste hélas peu machinable.} +\begin{verbatim} +usage: + -F define:the:filter:chain + -g input glob pattern + -L list available filters + -O /output/directory (default ./p8) + -r N repetiiing factor + -v spit more messages +\end{verbatim} + +Il n'y a pas de moyenne mobile, pas d'interpolation, mais un facteur de +répétition qui permet de dupliquer $N$ fois une image dans le flux de +sortie. Si bous globez \texttt{frames/????[02468]}, vous prenez +une image sur deux, alors un facteur de répétition à $2$ conservera +la 'vitesse' de la séquence, mais avec une petite sacade régulière +de bon aloi \textit{:)} + \subsection{Déviance} Là, nous tombons dans de la \textsl{troiD}\index{3d} de haut niveau,