Compare commits
7 Commits
89c49282f1
...
e0d154c37e
Author | SHA1 | Date | |
---|---|---|---|
e0d154c37e | |||
c9de7cdc80 | |||
014b1cc47a | |||
cd8346362e | |||
a940bba100 | |||
5b0670006a | |||
3cb969866f |
@ -1,20 +1,20 @@
|
|||||||
|
|
||||||
|
|
||||||
COPT = -g -no-pie -Wall -O3 -DDEBUG_LEVEL=0 -Werror=parentheses
|
COPT = -g -no-pie -Wall -DDEBUG_LEVEL=0 -Werror=parentheses
|
||||||
LIBS = -lfloatimg -lpnglite -lm
|
LIBS = -lfloatimg -lpnglite -lm
|
||||||
OBJS = fonctions.o sfx.o crapulator.o
|
OBJS = fonctions.o sfx.o crapulator.o
|
||||||
DEPS = fonctions.h crapulator.h
|
DEPS = fonctions.h crapulator.h
|
||||||
|
|
||||||
fonderie: fonderie.c fonctions.h ${OBJS} Makefile
|
fonderie: fonderie.c ${DEPS} ${OBJS} Makefile
|
||||||
gcc ${COPT} $< ${OBJS} ${LIBS} -o $@
|
gcc ${COPT} $< ${OBJS} ${LIBS} -o $@
|
||||||
|
|
||||||
crapulator.o: crapulator.c ${DEPS}
|
crapulator.o: crapulator.c ${DEPS} Makefile
|
||||||
gcc ${COPT} -c $<
|
gcc ${COPT} -c $<
|
||||||
|
|
||||||
fonctions.o: fonctions.c fonctions.h Makefile
|
fonctions.o: fonctions.c ${DEPS} Makefile
|
||||||
gcc ${COPT} -c $<
|
gcc ${COPT} -c $<
|
||||||
|
|
||||||
sfx.o: sfx.c fonctions.h Makefile
|
sfx.o: sfx.c ${DEPS} Makefile
|
||||||
gcc ${COPT} -c $<
|
gcc ${COPT} -c $<
|
||||||
|
|
||||||
# ---------------------------------------------------------
|
# ---------------------------------------------------------
|
||||||
|
@ -10,13 +10,60 @@ de **films flous**.
|
|||||||
Le programme principal, utilisé à partir de la ligne de commande
|
Le programme principal, utilisé à partir de la ligne de commande
|
||||||
avec une foule d'options aux mnémoniques abscons.
|
avec une foule d'options aux mnémoniques abscons.
|
||||||
|
|
||||||
Rassurez-vous, en général ils sont wrappables dans des scripts
|
Rassurez-vous, en général il est wrappable dans des scripts
|
||||||
shell. Il est même possible un jour qu'ils puissent lire des
|
écrits en Bash. Il est même possible un jour qu'ils puissent lire des
|
||||||
paramètres dans `$(env)`.
|
paramètres dans `$(env)`.
|
||||||
|
|
||||||
|
```
|
||||||
|
tth@delirium:~/Devel/FloatImg/Fonderie$ ./fonderie -h
|
||||||
|
*** ./fonderie :
|
||||||
|
compiled by tTh, Nov 3 2020 03:42:29
|
||||||
|
pid 3424
|
||||||
|
*** FloatImg library, alpha v112 (Nov 2 2020, 00:31:33)
|
||||||
|
FONDERIE
|
||||||
|
options:
|
||||||
|
-g convert to gray
|
||||||
|
-I input glob pattern
|
||||||
|
-O output directory
|
||||||
|
-T fifo size
|
||||||
|
-v increase verbosity
|
||||||
|
-w input effect
|
||||||
|
-x output effect
|
||||||
|
```
|
||||||
|
|
||||||
## crapulator
|
## exemple d'utilisation
|
||||||
|
|
||||||
|
Voici comment appeler ce truc depuis la ligne de commande
|
||||||
|
tel qu'il m'arrive de pratiquer :
|
||||||
|
|
||||||
|
```
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
GRABDIR="/spool/tth/fonderie"
|
||||||
|
FONDEUR="$HOME/Devel/FloatImg/Fonderie/fonderie"
|
||||||
|
GLOB=${GRABDIR}'/?????.fimg'
|
||||||
|
|
||||||
|
${FONDEUR} -v -T 40 -I "$GLOB" -w 10 -x 0
|
||||||
|
```
|
||||||
|
|
||||||
|
Ensuite il suffit d'encoder toutes les images générées dans
|
||||||
|
`p8/` (répertoire de sortie par défaut
|
||||||
|
avec une incantation de ffmpeg :
|
||||||
|
|
||||||
|
```
|
||||||
|
ffmpeg -nostdin \
|
||||||
|
-loglevel error \
|
||||||
|
-y -r 30 -f image2 -i p8/%05d.png \
|
||||||
|
-c:v libx264 -pix_fmt yuv420p \
|
||||||
|
foo.mp4
|
||||||
|
```
|
||||||
|
|
||||||
|
## crapulator.c
|
||||||
|
|
||||||
C'est dans ce module qu'est codé le moteur de filtrage, utilisé
|
C'est dans ce module qu'est codé le moteur de filtrage, utilisé
|
||||||
aussi bien en entrée qu'en sortie.
|
aussi bien en entrée qu'en sortie. Il est, à l'heure actuelle,
|
||||||
|
assez rudimentaire, avec un paramétrage simpliste, et un manque
|
||||||
|
criant de documentation...
|
||||||
|
|
||||||
|
**Use the source, Luke**
|
||||||
|
|
||||||
|
@ -55,8 +55,8 @@ return 0;
|
|||||||
*/
|
*/
|
||||||
int crapulator(FloatImg *image, int idFx, float fval)
|
int crapulator(FloatImg *image, int idFx, float fval)
|
||||||
{
|
{
|
||||||
int retval, foo;
|
int retval;
|
||||||
FloatImg imgtmp;
|
// FloatImg imgtmp;
|
||||||
static int count = 0;
|
static int count = 0;
|
||||||
int flag_debug = 0;
|
int flag_debug = 0;
|
||||||
|
|
||||||
@ -116,6 +116,10 @@ switch (idFx) {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 10:
|
||||||
|
retval = binarize(image, 0);
|
||||||
|
break;
|
||||||
|
|
||||||
default :
|
default :
|
||||||
fprintf(stderr, "%s : effect #%d invalid\n",
|
fprintf(stderr, "%s : effect #%d invalid\n",
|
||||||
__func__, idFx);
|
__func__, idFx);
|
||||||
|
@ -40,6 +40,8 @@ int create_fifo(int nbslot, int w, int h, int t);
|
|||||||
* funcs in 'sfx.c'
|
* funcs in 'sfx.c'
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
int binarize(FloatImg *pimg, int notused);
|
||||||
|
|
||||||
int brotche_rand48_a(FloatImg *fimg, float ratio, float mval);
|
int brotche_rand48_a(FloatImg *fimg, float ratio, float mval);
|
||||||
int brotche_rand48_b(FloatImg *fimg, float ratio, float mval);
|
int brotche_rand48_b(FloatImg *fimg, float ratio, float mval);
|
||||||
int colors_brotcher(FloatImg *fimg, float fval);
|
int colors_brotcher(FloatImg *fimg, float fval);
|
||||||
|
@ -41,13 +41,13 @@ numero++; /* VERY IMPORTANT :) */
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
/* -------------------------------------------------------------- */
|
/* -------------------------------------------------------------- */
|
||||||
int insert_blank(FloatImg *image, int nbre, int pproc)
|
int insert_blank(FloatImg *image, int nbre, int pproc, float fval)
|
||||||
{
|
{
|
||||||
int idx, foo;
|
int idx, foo;
|
||||||
|
|
||||||
fimg_clear(image);
|
fimg_clear(image);
|
||||||
for (idx=0; idx<nbre; idx++) {
|
for (idx=0; idx<nbre; idx++) {
|
||||||
fimg_vdeg_a(image, 16.64);
|
fimg_vdeg_a(image, fval);
|
||||||
// brotche_rand48_b(image, drand48()*0.10, 1e5);
|
// brotche_rand48_b(image, drand48()*0.10, 1e5);
|
||||||
if ((foo=traite_une_image(image, pproc, 1))) {
|
if ((foo=traite_une_image(image, pproc, 1))) {
|
||||||
fprintf(stderr, "%s : err %d from 'traite_une_image'\n",
|
fprintf(stderr, "%s : err %d from 'traite_une_image'\n",
|
||||||
@ -61,7 +61,7 @@ puts("");
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
/* -------------------------------------------------------------- */
|
/* -------------------------------------------------------------- */
|
||||||
#define BLANK 40
|
#define BLANK 30
|
||||||
|
|
||||||
int demarre_la_machine(char *pattern, char *outdir, int szfifo,
|
int demarre_la_machine(char *pattern, char *outdir, int szfifo,
|
||||||
int infx, int outfx, int step)
|
int infx, int outfx, int step)
|
||||||
@ -71,11 +71,12 @@ glob_t globbuf;
|
|||||||
char *cptr;
|
char *cptr;
|
||||||
FloatImg input;
|
FloatImg input;
|
||||||
double fin;
|
double fin;
|
||||||
|
float maxvalue;
|
||||||
int datas[3];
|
int datas[3];
|
||||||
|
|
||||||
#if DEBUG_LEVEL
|
#if DEBUG_LEVEL
|
||||||
fprintf(stderr, ">>> %s ( '%s' -> '%s' %d )\n", __func__,
|
fprintf(stderr, ">>> %s ( '%s' -> '%s' %d eff:%d:%d)\n", __func__,
|
||||||
pattern, outdir, szfifo);
|
pattern, outdir, szfifo, infx, outfx);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (1 != step) fprintf(stderr, "\tstep is %d\n", step);
|
if (1 != step) fprintf(stderr, "\tstep is %d\n", step);
|
||||||
@ -94,21 +95,29 @@ fprintf(stderr, "glob '%s' -> %d, %ld files found\n", pattern, foo,
|
|||||||
|
|
||||||
/* get the size of the inputs images */
|
/* get the size of the inputs images */
|
||||||
foo = fimg_fileinfos(globbuf.gl_pathv[0], datas);
|
foo = fimg_fileinfos(globbuf.gl_pathv[0], datas);
|
||||||
width = datas[0];
|
width = datas[0]; height = datas[1];
|
||||||
height = datas[1];
|
fprintf(stderr, "image size %dx%d\n", width, height);
|
||||||
|
|
||||||
|
fimg_create(&input, width, height, 3);
|
||||||
|
|
||||||
|
/* get the maximum value of the first pic */
|
||||||
|
foo = fimg_load_from_dump(globbuf.gl_pathv[0], &input);
|
||||||
|
if (foo) {
|
||||||
|
fprintf(stderr, "%s: err %d loading %s\n",
|
||||||
|
__func__, foo, globbuf.gl_pathv[0]);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
maxvalue = fimg_get_maxvalue(&input);
|
||||||
|
fprintf(stderr, "maxvalue %f\n", maxvalue);
|
||||||
|
|
||||||
foo = create_fifo(szfifo, width, height, FIMG_TYPE_RGB);
|
foo = create_fifo(szfifo, width, height, FIMG_TYPE_RGB);
|
||||||
fprintf(stderr, "init fifo (%d slots) --> %d\n", szfifo, foo);
|
fprintf(stderr, "init fifo (%d slots) --> %d\n", szfifo, foo);
|
||||||
|
|
||||||
fimg_create(&input, width, height, 3);
|
/* XXX inject a few strange pics in the fifo */
|
||||||
|
insert_blank(&input, BLANK, outfx, maxvalue);
|
||||||
/* XXX inject a few stange pics in the fifo */
|
|
||||||
insert_blank(&input, BLANK, outfx);
|
|
||||||
|
|
||||||
for (idx=0; idx<globbuf.gl_pathc; idx++) {
|
for (idx=0; idx<globbuf.gl_pathc; idx++) {
|
||||||
|
|
||||||
cptr = globbuf.gl_pathv[idx];
|
cptr = globbuf.gl_pathv[idx];
|
||||||
|
|
||||||
/* first step : read the current grabed picz from disk,
|
/* first step : read the current grabed picz from disk,
|
||||||
and put it in our private buffer */
|
and put it in our private buffer */
|
||||||
foo = fimg_load_from_dump(cptr, &input);
|
foo = fimg_load_from_dump(cptr, &input);
|
||||||
@ -116,7 +125,6 @@ for (idx=0; idx<globbuf.gl_pathc; idx++) {
|
|||||||
fprintf(stderr, "load #%d from dump -> %d\n", idx, foo);
|
fprintf(stderr, "load #%d from dump -> %d\n", idx, foo);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ========================= */
|
/* ========================= */
|
||||||
/* FSCKING INPUT FILTER HERE */
|
/* FSCKING INPUT FILTER HERE */
|
||||||
foo = crapulator(&input, infx, 0.42);
|
foo = crapulator(&input, infx, 0.42);
|
||||||
@ -124,7 +132,6 @@ for (idx=0; idx<globbuf.gl_pathc; idx++) {
|
|||||||
fprintf(stderr, "%s crapulator -> %d\n", __func__, foo);
|
fprintf(stderr, "%s crapulator -> %d\n", __func__, foo);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
foo = traite_une_image(&input, outfx, step);
|
foo = traite_une_image(&input, outfx, step);
|
||||||
if (foo) {
|
if (foo) {
|
||||||
fprintf(stderr, "traitement %s -> %d WTF?\n", cptr, foo);
|
fprintf(stderr, "traitement %s -> %d WTF?\n", cptr, foo);
|
||||||
@ -132,10 +139,13 @@ for (idx=0; idx<globbuf.gl_pathc; idx++) {
|
|||||||
}
|
}
|
||||||
fprintf(stderr, "\t%5d\r", idx);
|
fprintf(stderr, "\t%5d\r", idx);
|
||||||
}
|
}
|
||||||
|
|
||||||
fputs("\n", stderr);
|
fputs("\n", stderr);
|
||||||
|
|
||||||
insert_blank(&input, BLANK, outfx);
|
insert_blank(&input, BLANK*2, outfx, maxvalue);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* PLEASE, FLUSH THE FIFO !
|
||||||
|
*/
|
||||||
|
|
||||||
fin = fimg_timer_get(0);
|
fin = fimg_timer_get(0);
|
||||||
if (idx) {
|
if (idx) {
|
||||||
|
@ -13,12 +13,41 @@
|
|||||||
#include "fonctions.h"
|
#include "fonctions.h"
|
||||||
|
|
||||||
/* -------------------------------------------------------------- */
|
/* -------------------------------------------------------------- */
|
||||||
/* global vars from main
|
/* here are global vars exported by the main module
|
||||||
*/
|
*/
|
||||||
extern int verbosity;
|
extern int verbosity;
|
||||||
|
|
||||||
/* -------------------------------------------------------------- */
|
/* -------------------------------------------------------------- */
|
||||||
|
int binarize(FloatImg *pimg, int notused)
|
||||||
|
{
|
||||||
|
float mm[6], mR, mG, mB;
|
||||||
|
int foo, size;
|
||||||
|
|
||||||
|
#if DEBUG_LEVEL
|
||||||
|
fprintf(stderr, ">>> %s ( %p %d )\n", __func__, pimg, notused);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
foo = fimg_get_minmax_rgb(pimg, mm);
|
||||||
|
mR = (mm[1] - mm[0]) / 2.0;
|
||||||
|
mG = (mm[3] - mm[2]) / 2.0;
|
||||||
|
mB = (mm[5] - mm[4]) / 2.0;
|
||||||
|
|
||||||
|
if (verbosity > 1)
|
||||||
|
fprintf(stderr, "%s: %f %f %f\n", __func__, mR, mG, mB);
|
||||||
|
|
||||||
|
size = pimg->width * pimg->height;
|
||||||
|
|
||||||
|
for (foo=0; foo<size; foo++) {
|
||||||
|
if (pimg->R[foo] < mR) pimg->R[foo] = mm[0];
|
||||||
|
else pimg->R[foo] = mm[1];
|
||||||
|
if (pimg->G[foo] < mG) pimg->G[foo] = mm[2];
|
||||||
|
else pimg->G[foo] = mm[3];
|
||||||
|
if (pimg->B[foo] < mB) pimg->B[foo] = mm[4];
|
||||||
|
else pimg->B[foo] = mm[5];
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
/* -------------------------------------------------------------- */
|
/* -------------------------------------------------------------- */
|
||||||
int brotche_rand48_a(FloatImg *fimg, float ratio, float mval)
|
int brotche_rand48_a(FloatImg *fimg, float ratio, float mval)
|
||||||
{
|
{
|
||||||
|
27
README.md
27
README.md
@ -22,6 +22,29 @@ Par ailleurs, d'autres expérimentations sont
|
|||||||
sur le traitement et l'assemblage de ces images floues dans le but de faire
|
sur le traitement et l'assemblage de ces images floues dans le but de faire
|
||||||
des films flous.
|
des films flous.
|
||||||
|
|
||||||
Un logiciel à base de [moyenne mobile](fonderie/) est en bonne voie.
|
|
||||||
|
|
||||||
*En avant vers l'infini, et au-delà...*
|
*En avant vers l'infini, et au-delà...*
|
||||||
|
|
||||||
|
## Dépendances
|
||||||
|
|
||||||
|
Bien entendu, avant tout, il faut installer quelques outils et
|
||||||
|
dépendances. Je vais tenter de les lister dans le plus grand
|
||||||
|
désordre (à la sauce Debian) :
|
||||||
|
|
||||||
|
- libtiff-dev
|
||||||
|
- libpnglite-dev
|
||||||
|
- liblo-dev
|
||||||
|
- libv4l2-dev
|
||||||
|
|
||||||
|
Certains outils externes sont aussi utiles :
|
||||||
|
|
||||||
|
- gnuplot
|
||||||
|
- ImageMagick
|
||||||
|
- LaTeX
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
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)
|
||||||
|
|
||||||
|
Your mileage may vary...
|
||||||
|
Loading…
Reference in New Issue
Block a user