Compare commits

..

23 Commits

Author SHA1 Message Date
tTh
8202df9a63 check for the export directory (singlepass) 2024-11-13 13:37:54 +01:00
tTh
67ba638690 check for the export directory (interpolator) 2024-11-13 13:35:22 +01:00
tTh
e8a7bf28e3 check for the export directory (fonderie) 2024-11-12 22:58:55 +01:00
tTh
b19107d71b add two molly-guard 2024-11-12 12:50:31 +01:00
tTh
fabe94792b add two molly-guard 2024-11-12 12:49:43 +01:00
tTh
d1e67f7397 add a missing exit() 2024-11-12 11:36:57 +01:00
tTh
28453e862a msg when export dir not writable 2024-11-11 17:24:03 +01:00
tTh
2147d4b164 tweaking help text 2024-11-11 17:15:53 +01:00
tTh
b0983ab18b msg bug + better exit 2024-11-11 17:13:20 +01:00
tTh
08fcf513cc checking export directory, first try 2024-11-10 13:55:25 +01:00
tTh
e6b72e5faa minor changes 2024-10-27 16:37:10 +01:00
tTh
756766ca42 + libncurses-dev 2024-10-12 00:34:27 +02:00
tTh
9ede78fa5d signaler création répertoire pour export 2024-10-11 23:54:23 +02:00
tTh
506bf39393 cosmetic 2024-10-11 23:30:41 +02:00
tTh
26e82619fb little tweak 2024-09-29 20:14:13 +02:00
tTh
91440e7ea5 add shift to zero filter 2024-09-29 19:04:10 +02:00
tTh
5fbff721d8 cosmetic 2024-09-29 18:46:38 +02:00
tTh
d510e56d44 various enhancements 2024-08-29 18:24:01 +02:00
tTh
2a8348f0f9 hide a non-essential msg 2024-08-29 18:23:03 +02:00
tTh
f473a58f75 cosmetic + bla 2024-08-28 22:41:47 +02:00
tTh
556e1ad825 bump the version 2024-08-28 22:24:18 +02:00
tTh
23842595fd add a default target 2024-08-28 21:23:55 +02:00
tTh
6069c45b5a working on readme files 2024-08-28 21:23:09 +02:00
26 changed files with 304 additions and 88 deletions

View File

@@ -7,12 +7,12 @@ COPT = -g -fpic -no-pie -Wall -DDEBUG_LEVEL=0 -Werror=parentheses
LIBS = ../libfloatimg.a -ltiff -lpnglite -lm -lz -lcfitsio
OBJS = fifo.o sfx.o crapulator.o glitches.o metriques.o \
filterstack.o single.o
filterstack.o single.o utilfuncs.o
DEPS = ../floatimg.h \
../libfloatimg.a \
fifo.h crapulator.h metriques.h glitches.h sfx.h \
filterstack.h crapdef.h crapstr.h single.h
filterstack.h crapdef.h crapstr.h single.h utilfuncs.h
all: fonderie interpolator singlepass t
@@ -71,4 +71,7 @@ metriques.o: metriques.c metriques.h Makefile
glitches.o: glitches.c glitches.h Makefile
gcc ${COPT} -c $<
utilfuncs.o: utilfuncs.c utilfuncs.h Makefile
gcc ${COPT} -c $<
# ---------------------------------------------------------

View File

@@ -7,8 +7,10 @@ de **films flous** dans le domaine spatio-temporel.
À l'heure actuelle, il y a plusieurs programmes distincts. Le premier
(fonderie) fait une moyenne mobile sur N images consécutives,
et le second (interpolator) fait un fondu-enchainé de N pas
entre deux images consécutives.
le second (interpolator) fait un fondu-enchainé de N pas
entre deux images consécutives,
et le troisième (singlepass) fait d'autres trucs, comme
répéter N fois un image pour avoir une vidéo sacadée.
Mais avant et après un de ces deux traitements, il y a des chaines
de filtres...
@@ -72,6 +74,8 @@ GLOB=${GRABDIR}'/?????.fimg'
${FONDEUR} -I "$GLOB" -E cos01:trinitron -F classtrial -T 30
```
Par défaut le répertoire où sont exportées les images est nommé
`p8/` et il doit être là, c'est donc à vous de le créer.
Votre machine va maintenant mouliner avec entrain et persévérance,
puis
ensuite il vous suffira d'encoder toutes les images générées dans
@@ -94,7 +98,7 @@ assez rudimentaire, avec un paramétrage simpliste, et un manque
criant de documentation...
Dans la même équipe, vous pouvez aussi aller contempler `glitches.c`
pour voir le genre de traitement que l'on fait subir à nox pixels
pour voir le genre de traitement que l'on fait subir à nos pixels
flottants.
## Interpolator
@@ -111,8 +115,8 @@ usage:
interpolator [options] <inglob> <outdir> <nbsteep>
options:
-S nn mysterious sort
-E i:bla:k input filter chain
-F name:j output filter chain
-E foo:bla:kr input filter chain
-F name:just output filter chain
-L list available filters
-v increase verbosity
```
@@ -129,6 +133,7 @@ usage:
-F define:the:filter:chain
-g input glob pattern
-L list available filters
-r N repetiiing factor
-O /output/directory
-v spit more messages
```

View File

@@ -514,6 +514,11 @@ switch (idFx) {
retval = fimg_to_gray(image);
break;
case CR_shift0:
/* added Sun Sep 29 16:55:54 UTC 2024 */
retval = fimg_auto_shift_to_zero(image, image);
// fprintf(stderr, "******** Shift Zero -> %d\n", retval);
break;
default :
fprintf(stderr, "%s : effect #%d invalid\n",

View File

@@ -47,5 +47,6 @@
80 thermocol 1 0
81 triptyq 1 0
90 togray 1 0
91 shift0 1 0
-1 end 1 1.0

View File

@@ -10,6 +10,7 @@
#include <glob.h>
#include "../floatimg.h"
#include "utilfuncs.h"
#include "fifo.h"
#include "glitches.h"
#include "crapulator.h"
@@ -186,10 +187,12 @@ puts("\t-F\toutput:filter:chain");
// puts("\t-g\tconvert to gray");
puts("\t-I\tinput glob pattern");
puts("\t-L\tlist available filters");
puts("\t-O\toutput directory");
puts("\t-O\toutput directory (default p8/)");
puts("\t-T\tfifo size");
puts("\t-v\tincrease verbosity");
if (verbosity) { puts(""); fimg_print_version(2); puts(""); }
exit(0);
}
/* -------------------------------------------------------------- */
@@ -206,7 +209,6 @@ char *OutFchain = "none";
fprintf(stderr, "*** %s\n\tcompiled %s, %s, pid %d\n",
argv[0], __DATE__, __TIME__, getpid());
if (verbosity) fimg_print_version(2);
while ((opt = getopt(argc, argv, "B:E:F:ghI:LO:T:vw:x:")) != -1) {
switch(opt) {
@@ -240,6 +242,15 @@ if (verbosity) {
fprintf(stderr, "\tout filter '%s'\n", OutFchain);
fprintf(stderr, "\tfifo size %d\n", fifosize);
}
/*
* check for the export directory
*/
foo = check_if_export_dir_is_valid(out_dir, 0);
if ( !foo ) {
fprintf(stderr, "** export dir (%s) not valid\n", out_dir);
fprintf(stderr, "** may be you have to create it ?\n");
exit(1);
}
foo = parse_filter_chain(0, InFchain);
if (foo) {

View File

@@ -17,6 +17,7 @@
#include "../floatimg.h"
#include "utilfuncs.h"
#include "fifo.h"
#include "glitches.h"
#include "crapulator.h"
@@ -55,7 +56,7 @@ IdxValue *idxvalues;
#if DEBUG_LEVEL
fprintf(stderr, ">>> %s ( %p %p %d %p)\n", __func__, ptr_glob,
ptr_idxval, method, average);
ptr_idxval, method, p_average);
#endif
if (0==method && verbosity) {
@@ -140,8 +141,8 @@ foo = glob(pattern, 0, NULL, &globbuf);
fprintf(stderr, " globbing '%s' -> %d, %d files found\n",
pattern, foo, (int)globbuf.gl_pathc);
if (0 == globbuf.gl_pathc) {
fprintf(stderr, "%s : no file found, aborting\n", __func__);
return -1;
fprintf(stderr, "%s : no file found, ABEND\n", __func__);
exit(1);
}
idx_values = NULL;
@@ -240,9 +241,7 @@ puts("\t-S nn\t\tmysterious sort");
puts("\t-L\t\tlist available filters");
puts("\t-v\t\tincrease verbosity");
if (verbosity) {
list_crapulors("available filters");
}
if (verbosity) { puts(""); fimg_print_version(2); puts(""); }
exit(0);
}
@@ -257,6 +256,7 @@ int opt;
int sort = 0;
char *InFchain = "0";
char *OutFchain = "0";
char *out_dir = "p8/";
fprintf(stderr, "*** %s\n\tcompiled on %s %s\n", argv[0],
__DATE__, __TIME__);
@@ -292,6 +292,18 @@ if (3 != (argc-optind)) {
exit(1);
}
out_dir = argv[optind+1];
/*
* check for the export directory
*/
foo = check_if_export_dir_is_valid(out_dir, 0);
if ( !foo ) {
fprintf(stderr, "** export dir (%s) not valid\n", out_dir);
fprintf(stderr, "** may be you have to create it ?\n");
exit(1);
}
foo = parse_filter_chain(0, InFchain);
if (foo) {
fprintf(stderr, "err %d parsing '%s'\n", foo, InFchain);

View File

@@ -13,6 +13,7 @@
#include "../floatimg.h"
#include "utilfuncs.h"
#include "crapulator.h"
#include "filterstack.h"
#include "single.h"
@@ -198,6 +199,13 @@ if (repeat < 1) {
exit(2);
}
foo = check_if_export_dir_is_valid(outdir, 0);
if ( !foo ) {
fprintf(stderr, "** export dir (%s) not valid\n", outdir);
fprintf(stderr, "** may be you have to create it ?\n");
exit(1);
}
foo = parse_filter_chain(FILTERS, filterchain);
if (foo) {
fprintf(stderr, "err %d in parse_filter_chain\n", foo);

View File

@@ -16,6 +16,8 @@
#include "crapulator.h"
#include "single.h"
#include "utilfuncs.h"
/* ----------------------------------------------------------- */
int verbosity;
@@ -28,6 +30,30 @@ int verbosity;
#define STK 6
/* ----------------------------------------------------------- */
/* new Sat Nov 9 22:17:46 UTC 2024 */
int essai_test_export_dir(char *footxt)
{
int foo;
#if DEBUG_LEVEL
fprintf(stderr, ">>> %s ( '%s' )\n", __func__, footxt);
#endif
foo = check_if_export_dir_is_valid("/tmp/quux", 0);
fprintf(stderr, " got %d\n\n", foo);
foo = check_if_export_dir_is_valid("/home", 0);
fprintf(stderr, " got %d\n\n", foo);
foo = check_if_export_dir_is_valid("./", 0);
fprintf(stderr, " got %d\n\n", foo);
foo = check_if_export_dir_is_valid("Makefile", 0);
fprintf(stderr, " got %d\n\n", foo);
return -1;
}
/* ----------------------------------------------------------- */
int essai_filterstack(char *fIname, char *fOname)
@@ -36,6 +62,11 @@ int foo;
FloatImg image;
double debut, fin;
#if DEBUG_LEVEL
fprintf(stderr, ">>> %s ( '%s' '%s' )\n", __func__, fIname, fOname);
#endif
// filterstack_list(STK, __func__);
foo = fimg_create_from_dump(fIname, &image);
@@ -218,15 +249,23 @@ while ((opt = getopt(argc, argv, "hF:g:i:Lo:O:svx")) != -1) {
}
#if DEBUG_LEVEL
fprintf(stderr, "%s : argc = %d, optind = %d\n", argv[0], argc, optind);
fprintf(stderr, ">>> %s : argc=%d, optind=%d\n", argv[0], argc, optind);
#endif
foo = essai_test_export_dir("bla bla");
if (foo) {
fprintf(stderr, "err %d in essai_test_export_dir\n", foo);
exit(1);
}
exit(0);
foo = parse_filter_chain(STK, filterchain);
if (foo) {
fprintf(stderr, "err %d in parse_filter_chain\n", foo);
exit(1);
}
if (do_xper) {
experiment(infile);
return 0;

53
Fonderie/utilfuncs.c Normal file
View File

@@ -0,0 +1,53 @@
/*
* utilfuncs.c
*
* new Sat Nov 9 22:15:15 UTC 2024
*/
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "utilfuncs.h"
extern int verbosity;
/* -------------------------------------------------------------- */
int check_if_export_dir_is_valid(char *path, int action)
{
int foo;
struct stat statbuf;
#if DEBUG_LEVEL
fprintf(stderr, ">>> %s ( '%s', %d )\n", __func__, path, action);
#endif
foo = stat(path, &statbuf);
if (foo) {
if (verbosity) perror(path);
return 0;
}
#if DEBUG_LEVEL
fprintf(stderr, " mode 0x%x\n", statbuf.st_mode);
#endif
if ((statbuf.st_mode & S_IFMT) != S_IFDIR) {
if (verbosity) fprintf(stderr, "%s: Not a directory\n", path);
return 0;
}
/* OK, c'est un repertoire, mais peut-on écrire dedans ? */
foo = access(path, W_OK);
#if DEBUG_LEVEL
fprintf(stderr, " access '%s' = %d\n", path, foo);
#endif
if (0 != foo) {
if (verbosity) fprintf(stderr, "%s: can't write\n", path);
return 0;
}
return 1; /* export dir is OK */
}
/* -------------------------------------------------------------- */

11
Fonderie/utilfuncs.h Normal file
View File

@@ -0,0 +1,11 @@
/*
* utilfuncs.c
*
* new Sat Nov 9 22:15:49 UTC 2024
*/
/* -------------------------------------------------------------- */
int check_if_export_dir_is_valid(char *path, int action);
/* -------------------------------------------------------------- */

View File

@@ -7,7 +7,6 @@ voire même des [films flous](Fonderie/).
![horloge floue](http://la.buvette.org/photos/cumul/horloge.png "horloge floue")
Il y a une [description](http://la.buvette.org/photos/cumul/) bien plus
pas trop longue pour les curieux, et un début de
[documentation](http://la.buvette.org/photos/cumul/the_floatimg_hack.pdf)
@@ -22,7 +21,20 @@ Par ailleurs, d'autres expérimentations sont
sur le traitement et l'assemblage de ces images floues dans le but de faire
des films flous.
*En avant vers l'infini, et au-delà...*
## *Show us the code !*
Il y a plusieurs répertoires contenant le code source, en voici
la liste :
* [lib](lib/README.md) : le noyau du système, fonctions de base.
* [funcs](funcs/README.md) : fonctions de support : export, traitement
filtrage, effets...
* [tools](tools/README.md) : utilitaires divers, outils de debug et gadgets.
* [v4l2](v4l2/README.md): gestion des webcams sous Linux.
* [experiment](experiment/README.md) : fonctions en chantier, qui migreront
un jour dans d'autres catégories.
* [contrib](contrib/README.md) : des choses peu ou pas maintenues.
## Dépendances
@@ -37,16 +49,15 @@ apt install liblo-dev
apt install libv4l2-dev
apt install libcfitsio-dev
apt install libnetpbm-dev
apt install libncurses-dev
```
Bon, OK, je suis en train de changer de machine, et ça serait vraiment
cool d'avoir juste une ligne à c'n'p, donc voila :
```
apt install libtiff-dev libpnglite-dev liblo-dev libv4l2-dev \
libcfitsio-dev libnetpbm-dev
libcfitsio-dev libnetpbm-dev libncurses-dev
```
Il est probable que j'en oublie.
Et ya Debian qui change des trucs, alors, ça marche plus, du
genre que c'est la deuxième fois que ça m'arrive.
@@ -63,9 +74,9 @@ coté de pkg-config.
Certains outils externes sont aussi utiles :
- gnuplot
- ImageMagick
- LaTeX
- gnuplot, pour analyser des données,
- ImageMagick, parce que Brunus aime ça,
- LaTeX, pour la (trop maigre) documentation.
## Documentation
@@ -73,4 +84,10 @@ Encore trop légère, mais déja [présente](doc/).
C'est à vous de compiler le
[PDF](http://la.buvette.org/photos/cumul/the_floatimg_hack.pdf)
## TODO
https://berthub.eu/articles/posts/always-do-this-floating-point/
## Conclusion
*Your mileage may vary...*

View File

@@ -1,5 +1,7 @@
#!/bin/bash
set -e ; set -u
# ------------------------------------------------------------------
function build

View File

@@ -27,8 +27,8 @@
\usepackage[verbose]{layout}
\usepackage{ulem}
\setlength \parskip {0.15em}
\setcounter{tocdepth}{1} % XXX à regarder un de ces jours ?
\setlength \parskip {0.18em}
\setcounter{tocdepth}{2} % XXX à regarder un de ces jours ?
\makeatletter
% explication de ce truc ?
@@ -54,11 +54,9 @@
\section*{Une image flottante ?}
\textsl{Back in a far past part of history.}
\vspace{2em}
\textsl{Mais de quoi parle-t-on exactement ?}
% XXX XXX XXX\vspace{1em}
\vspace{2em}
Traditionnellement, les valeurs des pixels dans les images
informatiques sont mémorisées sur 8 bits, un octet\index{octet},
@@ -112,7 +110,8 @@ numériques quand certains ont songé à passer du flou mental à la grille
physique.
Les détails techniques sur cette représentation sont en page
\pageref{FloatImg desc}, avec des pointeurs dedans.
\pageref{FloatImg desc}, avec des pointeurs et des
tableaux dedans.
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}
@@ -159,7 +158,8 @@ la glisser dans le capitalisme de surveillance.
Pour le moment, seule la quête de l'empirisme absolu a été
visée. Les justifications mathématiques attendront le retour
du schmod777. Ceci dit, rien ne nous empêche d'aller consulter
de monsieur Schmod777.
Ceci dit, rien ne nous empêche d'aller consulter
Wikipedia, afin de mieux connaitre ces nombres flottants
que nous allons utiliser~:
@@ -193,7 +193,8 @@ effectuée afin d'éviter les potentiels inconvénients.
Ceci dit, le standard \textsl{ieee754}\index{ieee754} nous indique qu'il
y a 23 bits pour la mantisse, ce qui nous propose déja
plus de huit millions de valeurs. Considérons un cas typique~:
plus de huit millions de valeurs possibles.
Considérons un cas typique~:
le cumul de $N$ images ayant un niveau maximum $Vm$.
\subsection{Pixel négatif ?}
@@ -217,7 +218,7 @@ mais nous sommes tous là pour améliorer les choses, dans
la mesure de nos moyens.
Nous allons donc directement rentrer au cœur du problème,
en écrivant quelques lignes de code montrant le fonctionnement
général de la chose.
général de la chose vu du coté de la machine.
\subsection{L'idée}
@@ -242,8 +243,8 @@ en mémoire centrale, l'initialisation des valeurs de chaque pixel à 0.0
(une valeur que certains associent au noir complet, et d'autres à une
impossibilité quantique),
et pour conclure, l'enregistrement de cette image dans un
fichier\footnote{Au format
ésotérique, mais très véloce.} binaire.
fichier\footnote{Au format ésotérique, mais très véloce.}
binaire.
\begin{lstlisting}
memset(fimg, 0, sizeof(FloatImg));
@@ -260,7 +261,6 @@ if (foo) {
}
\end{lstlisting}
Une fois ce code enrobé dans un \texttt{main()}, compilé puis exécuté,
nous pouvons entrevoir, grâce au logiciel
\texttt{fimgstats} (décrit en page \pageref{fimgstats}),
@@ -299,7 +299,8 @@ une distribution Debian\index{Debian} récente (amd64 et x86),
mais ça marche quasiment pareil avec Fedora\index{Fedora} 64,
et
probablement Raspbian\index{Raspbian}, modulo les éventuels
soucis de boutisme.
soucis de boutisme que j'ai absolument négligés de prendre
en compte.
\textit{Attention, ça va devenir un peu gore\dots}
\subsection{Prérequis}
@@ -475,17 +476,18 @@ toucher. Les types d'images actuellement gérés sont les trois grands
classiques : niveau de gris, rouge-vert-bleu et rgb avec un canal alpha,
et expliquées quelques lignes plus haut.
XXX\index{XXX} raconter fimg\_clone
Comme vous allez le voir plus loin, il y a plein de fonctions qui
prennent en argument deux images: la source et la destination.
Dans la plupart des cas, ces deux images doivent être compatibles,
c'est à dire même type et mêmes dimensions.
c'est à dire de même type et de mêmes dimensions.
\begin{lstlisting}
/* return 0 if pictures are compatible */
int fimg_images_not_compatible(FloatImg *a, FloatImg *b);
\end{lstlisting}
C'est bien beau d'être enfin une image résidente en mémoire centrale, mais
pouvoir aussi exister à long terme en étant stocké dans la matrice
est tout aussi pertinent.
@@ -532,12 +534,13 @@ intégral\footnote{Un vrai désastre, même...}.
\subsection{Dessiner}
Bon, vous avez une image latente, et vous souhaitez dessiner dessus
(ou dedans ?) avec vos encres flottantes ?
Il y a des fonctions pour ça, par exemple~:
Bon, vous avez en mémoire centrale une image latente,
et vous souhaitez dessiner dessus (ou dedans ?) avec vos encres flottantes ?
Il y a actuellement deux fonctions pour ça, légèrement différentes~:
\begin{lstlisting}
int fimg_plot_rgb(FloatImg *head, int x, int y, float r, float g, float b);
int fimg_put_rgb(FloatImg *head, int x, int y, float rgb[3]);
\end{lstlisting}
Les paramètres sont explicites, mais leur validité doit être
@@ -676,10 +679,11 @@ aux bonnes dimensions (échange W et H).
D'un design très empirique, c'est certainement à revoir pour l'avenir.
La force du \textsl{legacy} va-t-elle dominer le monde ?
Il faudrait normaliser l'endianess et le packing dans les structs%
\footnote{Directives du compilateur ?}, et surtout l'ajout
Il faudrait normaliser l'endianess et le packing dans les
structuress\footnote{Directives du compilateur ?}, et surtout l'ajout
de données sur la prise de vue, du genre type de capteur, date et heure,
réglages divers\dots
réglages divers. Nous appelerons ça les metadonnées, et
nous en parlons dans quelques pages.\dots
\begin{lstlisting}
typedef struct {
@@ -924,7 +928,8 @@ int fimg_filter_3x3(FloatImg *src, FloatImg *dst, FimgFilter3x3 *filtr)
Comme dans la plupart des cas, la gestion des valeurs négatives
de pixel est laissé au hasard, qui fait souvent du portnawak.
Quoique, il doit bien exister
quelques solutions de contournement : clamping ou shift ?
quelques solutions de contournement :
valeur absolue, clamping ou shiftup ?
\textsl{To be continued\index{XXX}\dots}
@@ -937,8 +942,8 @@ 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.
une chose qui est en principe interdite aux programmes
\textsl{enduser}. Soyez donc prudents.
Cette fonction va faire quelque chose
à partir d'une image source et d'une valeur, et écrire le
@@ -981,14 +986,17 @@ de fonctions prévues à cet effet, mais il fallait rester simple\dots
% ===================================================================
\section{Les outils}\label{outils}
\textsf{3615mavie} : sur des projets comme celui-ci, qui travaillent
in-fine sur des objets que l'on peut considérer comme « physiques »,
\textsf{3615mavie} : pour des projets comme celui-ci, qui travaillent
\textit{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 pour partir
sur des bases saines.
normale\footnote{Il y a une vie en dehors de git et des compilations.}
et construire
des briques de base qui mettent en action le code primitif pour
partir sur des bases stables, documentées (ahem\dots), et
directement utilisables.
Ces machins ont en commun quelques options bien pratiques~:
Ces cliwares\index{cliware} 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.
@@ -1227,7 +1235,8 @@ après la grande pandémie\dots
Cet outil accumule\index{cumul} une quantité d'images flottantes
(de même taille et de même type) afin d'obtenir
un flou temporel de meilleure qualité. Aucune mise à l'échelle n'etant
un flou temporel de meilleure qualité.
Aucune mise à l'échelle n'etant
effectuée, les pixels de sortie peuvent atteindre des valeurs
considérables\footnote{Faut-il prévoir une gestion des \textsf{overflows} ?}
@@ -1615,7 +1624,8 @@ des choses essentielles comme la liste des résolutions disponibles.
Ajustement \textsl{Brightness Contrast Saturation Hue\dots}
Probablement pilotable au joystick\index{joystick}.
Probablement pilotable au joystick\index{joystick} et surtout
par OSC (Open Sound Control).
% ===================================================================
\section{À l'extérieur}
@@ -1625,6 +1635,8 @@ il est souvent nécessaire de pouvoir communiquer facilement
avec eux. Nous avons déja quelques possibilité d'exportation,
mais passer par cette étape intermédiaire est parfois délicat
à gérer dans un \textsl{pipedeprod} autrement bien huilé.
De même, nos capacités d'importation sont vraiment trop
réduites, Jpeg et PNG étant les deux priorités.
\subsection{ImageMagick}\index{ImageMagick}
@@ -1700,7 +1712,8 @@ ces images. Mais ce n'est qu'une façon déguisée de faire du cumul.
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.
foultitude d'effets spéciaux%
\footnote{\textsl{aka} IBM\index{IBM} (image brotching module)}.
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
@@ -1800,8 +1813,9 @@ usage:
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 vous globez \texttt{frames/????[02468]}, vous prenez
une image sur deux, alors un facteur de répétition à $2$ conservera
sortie. Si vous globez \texttt{rush/????[02468]}, vous prenez
en compte une image sur deux de la séquence capturée,
alors un facteur de répétition à $2$ conservera
la 'vitesse' de la séquence, mais avec une petite saccade régulière
de bon aloi \textit{:)}
@@ -1829,12 +1843,18 @@ et sans but précis. Je le \textit{runne} et je le \textit{re-runne}
un gazillion de fois dans mon cerveau processique.
Quel va être son facteur $O$ ? Je fais donc des essais.
\subsection{movepixels}
\subsection{muxplanes}
% ===================================================================
\section{Et pour la suite ?}
En fait, je fait de la photo par la méthode du « cumul »\index{cumul}
depuis plusieurs années. Une webcam\index{webcam},
depuis plusieurs années, au début avec vgrabbj et convert,
puis avec floatimg et ses satellites.
Une webcam\index{webcam},
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
@@ -1843,8 +1863,9 @@ en mode portnawak\dots
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
faire des images au bord d'un lac ou dans la campagne de l'Ariège.
Et, comme le dit la sagesse populaire : « fimg at 11 ».
faire des images au bord d'un lac ou dans la campagne du Gers%
\footnote{Aux Bourtoulots, par exemple.}.
Et comme le dit la sagesse populaire : « fimg at 11 ».
% -------------------------------------------------------------------

View File

@@ -1,7 +1,7 @@
# EXPÉRIMENTATIONS ÀLC
# Expérimentations ÀLC
Attention, tout ce qui se trouve dans ce répertoire ne sont que des
essais. Certains aboutissent, et sont migrés vers `funcs/` ou
essais. Certains aboutissent, et sont migrés vers `lib/`, `funcs/` ou
`tools/`, d'autre échouent et restent trainer dans le coin en attente
du retour de l'inspiration.

View File

@@ -65,7 +65,7 @@ for (yd=0; yd<pdst->height; yd++) {
fimg_get_rgb(pshift, xd, yd, disp);
xs = xd + ((disp[0]/dltr*MULT) - OFFS);
ys = yd + ((disp[2]/dltb*MULT) - OFFS);
ys = yd + ((disp[1]/dltb*MULT) - OFFS);
if ( xs<0 || xs>psrc->width ||
ys<0 || ys>psrc->height ) {

View File

@@ -14,9 +14,8 @@ int verbosity;
/* --------------------------------------------------------------- */
int triplane_muxer(FloatImg *sr, FloatImg *sg, FloatImg *sb,
FloatImg *dst, int flags)
FloatImg *dst)
{
int foo;
int sz;
if (FIMG_TYPE_RGB != dst->type) {
@@ -48,6 +47,10 @@ FloatImg imr, img, imb, dest;
fprintf(stderr, "muxing: %s %s %s -> %s\n", fr, fg, fb, dst);
if (flags) {
fprintf(stderr, "%s: flag non 0 ?\n", __FILE__);
}
foo = fimg_create_from_dump(fr, &imr);
if (foo) {
fprintf(stderr, "%s: err %d loading %s\n", __func__, foo, fr);
@@ -66,7 +69,7 @@ if (foo) {
fimg_clone(&imr, &dest, 0);
foo = triplane_muxer(&imr, &img, &imb, &dest, 0);
foo = triplane_muxer(&imr, &img, &imb, &dest);
if (foo) {
fprintf(stderr, "%s: err %d\n", __func__, foo);
return foo;

View File

@@ -20,7 +20,7 @@
* https://git.tetalab.org/tTh/FloatImg
*/
#define FIMG_VERSION (237)
#define FIMG_VERSION (245)
#define RELEASE_NAME ("noname")
#define PATCH_LEVEL ("aaaa")
@@ -72,7 +72,7 @@ typedef struct {
* fimg file header (short version)
*/
typedef struct {
char magic[8]; // this is not an asciiz !
char magic[8]; /* this is not an asciiz ! */
int32_t w, h, t;
/*
* what about the packing ?
@@ -192,7 +192,6 @@ int fimg_split_level(FloatImg *src, FloatImg *dst, int notused);
int fimg_make_triptyq(FloatImg *src, FloatImg *dst, int notused);
/* funcs/rotate.c module */
/* #coronamaison */
int fimg_rotate_90(FloatImg *src, FloatImg *dst, int notused);
int fimg_killrgb_v(FloatImg *src, FloatImg *dst, int k);
@@ -261,7 +260,6 @@ int fimg_halfsize_1(FloatImg *src, FloatImg *dst, int notused);
int fimg_extractor(FloatImg *in, FloatImg *out, FimgArea51 *rect);
int fimg_mirror(FloatImg *src, FloatImg *dst, int notused);
int fimg_incrustator_0(FloatImg *psrc, FloatImg *pdst,
int xpos, int ypos, int flags);
@@ -285,6 +283,9 @@ int fimg_show_metadata(FimgMetaData *pmd, char *title, int notused);
int fimg_default_metadata(FimgMetaData *pmd, int bla);
int fimg_get_metadata_from_file(char *fname, FimgMetaData *pmd);
/*
* FITS, an image fileformat for astronomy
*/
int fimg_save_R_as_fits(FloatImg *src, char *outname, int flags);
int fimg_save_G_as_fits(FloatImg *src, char *outname, int flags);
int fimg_save_B_as_fits(FloatImg *src, char *outname, int flags);
@@ -293,7 +294,6 @@ int fimg_save_plane_as_fits(FloatImg *src, char *oname, char plane, int flags);
int fimg_write_as_tiff(FloatImg *src, char *fname, int flags);
int fimg_save_as_exr(FloatImg *src, char *outname, int flags);
/* mathematics operations */
float fimg_get_plane_maxvalue(FloatImg *psrc, char plane);
float fimg_get_maxvalue(FloatImg *head);

View File

@@ -19,6 +19,8 @@ OBJS = fimg-png.o fimg-tiff.o misc-plots.o filtrage.o utils.o \
#---------------------------------------------------------------
all: t
tests.o: tests.c tests.h $(DEPS)
gcc $(COPT) -I/usr/include/netpbm -c $<

View File

@@ -21,9 +21,10 @@ Et en particulier, elle brotche sur ceux produits par ImageMagick !
### FITS
Ce format de fichier est utilisé en astronomie.
Ce [format de fichier](https://heasarc.gsfc.nasa.gov/docs/software/fitsio/c/c_user/node1.html)
est utilisé en astronomie.
Son support est actuellement minimaliste.
https://heasarc.gsfc.nasa.gov/docs/software/fitsio/c/c_user/node1.html
### DICOM

View File

@@ -54,7 +54,7 @@ if (fits_create_file(&fptr, outname, &status)) {
}
naxes[0] = src->width; naxes[1] = src->height;
if (verbosity) fimg_describe(src, "to be saved as FITS");
if (verbosity > 1) fimg_describe(src, "to be saved as FITS");
if ( fits_create_img(fptr, bitpix, naxis, naxes, &status) ) {
fits_report_error(stderr, status);

View File

@@ -1,5 +1,7 @@
#!/bin/bash -v
set -e ; set -u
cp libfloatimg.a /usr/local/lib
cp floatimg.h /usr/local/include

View File

@@ -21,5 +21,6 @@ typedef struct {
int reserved;
} FloatImg;
```
For the current state of this struc, look at the main
[header file](../floatimg.h), located at the root of the project.

View File

@@ -32,21 +32,23 @@ if (foo) {
fimg_destroy(&fimg);
return -1;
return 0;
}
/* ----------------------------------------------------------------- */
static void help(int k)
{
puts("export to FITS format");
puts("\t-p select colorplane : R, G, B");
puts("\t default is blue");
puts("\t-v increase verbosity");
fimg_print_version(k);
}
/* ----------------------------------------------------------------- */
int main(int argc, char *argv[])
{
int opt;
int plane = '?';
int opt, foo;
int plane = 'b';
while ((opt = getopt(argc, argv, "p:hv")) != -1) {
switch(opt) {
@@ -62,8 +64,11 @@ if (2 != argc-optind) {
exit(1);
}
export_fimg_plane_as_fits(argv[optind], argv[optind+1], plane);
foo = export_fimg_plane_as_fits(argv[optind], argv[optind+1], plane);
if (foo) {
fprintf(stderr, "export_fimg_plane_as_fits --> %d\n", foo);
exit(1);
}
return 0;
}
/* ----------------------------------------------------------------- */

View File

@@ -92,6 +92,7 @@ if (2 != argc-optind) {
foo = convertir_fimg_en_PNG(argv[optind], argv[optind+1], to_gray);
if (foo) {
fprintf(stderr, "%s : got a %d from convertor\n", argv[0], foo);
exit(1);
}
return 0;

View File

@@ -6,12 +6,14 @@
#include <stdlib.h>
#include <unistd.h>
#include <stdint.h>
#include <string.h>
#include "../floatimg.h"
int verbosity; // nasty global var.
/* --------------------------------------------------------------------- */
/* nouveau - Mon Apr 8 11:52:18 UTC 2024 */
int copy_metadata(FloatImg *src, FloatImg *dst)
{
FimgMetaData *mdsrc, *mddst;
@@ -21,7 +23,10 @@ fprintf(stderr, ">>> %s ( %p %p )\n", __func__, src, dst);
#endif
mdsrc = &(src->mdatas); mddst = &(dst->mdatas);
fprintf(stderr, "metadata copy: %p --> %p\n", mdsrc, mddst);
if (verbosity) fprintf(stderr, "%s: %p --> %p\n", __func__, mdsrc, mddst);
mdsrc->reserved[1] = 0x55555555;
memcpy(mddst, mdsrc, sizeof(FimgMetaData));
return 0;
}
@@ -62,11 +67,12 @@ if (foo) {
#endif
return foo;
}
/* XXX
* may be we can also copy the metadate from src to dst ?
* with an option on the command line ?
*/
copy_metadata(&src, &dst);
foo = copy_metadata(&src, &dst);
foo = fimg_dumpmd_to_file(&dst, dstname, NULL, 0);
if (foo) {
@@ -105,6 +111,7 @@ char *output_file = "out.fimg";
while ((opt = getopt(argc, argv, "ho:vx")) != -1) {
switch(opt) {
case 'h': help(); break;
case 'm': break;
case 'o': output_file = optarg; break;
case 'v': verbosity++; break;
case 'x': experiment++; break;

View File

@@ -16,7 +16,7 @@
int verbosity;
enum comId { C_timestamp, C_daytime, C_count, C_fval, C_cpid, C_origin,
C_idcam, C_reserved, C_all };
C_idcam, C_reserved, C_all, C_dayhour };
typedef struct {
char *name;
@@ -26,6 +26,7 @@ typedef struct {
Cmd Cmd_list[] = {
{ "timestamp", C_timestamp },
{ "daytime", C_daytime },
{ "dayhour", C_dayhour },
{ "cpid", C_cpid },
{ "count", C_count },
{ "fval", C_fval },
@@ -86,6 +87,7 @@ int get_print_metadata(char *fname, char *command)
{
int foo, action;
FimgMetaData metadata;
time_t tstamp;
#if DEBUG_LEVEL
fprintf(stderr, ">>> %s ( '%s' '%s' )\n", __func__, fname, command);
@@ -98,11 +100,15 @@ if (foo) return foo;
action = lookup_cmd(command);
// fprintf(stderr, " command '%s' -> %d\n", command, action);
tstamp = metadata.timestamp.tv_sec;
switch(action) {
case C_timestamp:
printf("timestamp %ld\n", metadata.timestamp.tv_sec); break;
printf("timestamp %ld\n", tstamp); break;
case C_daytime:
printf("%s\n", ctime(&metadata.timestamp.tv_sec)); break;
printf("%s\n", ctime(&tstamp)); break;
case C_dayhour:
printf("%s\n", ctime(&tstamp)); break;
case C_count:
printf("count %d\n", metadata.count); break;
case C_fval: