Compare commits

...

3 Commits

Author SHA1 Message Date
tth
c7a428c5f0 introduction des ajustements de contraste 2019-11-15 10:39:22 +01:00
tth
210af322b0 error handling 2019-11-15 06:07:06 +01:00
tth
3e60fed5ed messages... 2019-11-14 22:21:18 +01:00
7 changed files with 86 additions and 38 deletions

4
.gitignore vendored
View File

@ -1,6 +1,10 @@
lib/*.o lib/*.o
lib/t lib/t
lib/*.fimg
lib/*.png
lib/*.gif
funcs/*.o funcs/*.o
*.a *.a

View File

@ -2,7 +2,7 @@
* floatimg.h * floatimg.h
*/ */
#define FIMG_VERSION 75 #define FIMG_VERSION 76
/* /*
* in memory descriptor * in memory descriptor
@ -36,6 +36,12 @@ typedef struct {
#define FILE_TYPE_PNM 2 #define FILE_TYPE_PNM 2
#define FILE_TYPE_PNG 3 #define FILE_TYPE_PNG 3
/* lib/contrast.c */
#define CONTRAST_NONE 0
#define CONTRAST_SQRT 1
#define CONTRAST_POW2 2
#define CONTRAST_COS01 3
/* /*
* core module * core module
*/ */

View File

@ -1,3 +1,7 @@
/*
* contrast.c - part of libfloatimg
*/
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h> #include <unistd.h>
@ -9,6 +13,9 @@
extern int verbosity; extern int verbosity;
/* ---------------------------------------------------------------- */ /* ---------------------------------------------------------------- */
/*
* if the second parameter is NULL, operate 'in-place'
*/
int fimg_square_root(FloatImg *s, FloatImg *d, double maxval) int fimg_square_root(FloatImg *s, FloatImg *d, double maxval)
{ {
int nbre, idx; int nbre, idx;
@ -23,6 +30,13 @@ if (s->type != FIMG_TYPE_RGB) {
if (NULL==d) { if (NULL==d) {
d = s; d = s;
} }
else {
if (d->type != FIMG_TYPE_RGB) {
fprintf(stderr, "%s : dst type %d invalide\n",
__func__, d->type);
return -4;
}
}
nbre = s->width * s->height * 3; nbre = s->width * s->height * 3;
@ -52,7 +66,7 @@ if (NULL==d) {
else { else {
if (d->type != FIMG_TYPE_RGB) { if (d->type != FIMG_TYPE_RGB) {
fprintf(stderr, "%s : dst type %d invalide\n", fprintf(stderr, "%s : dst type %d invalide\n",
__func__, s->type); __func__, d->type);
return -4; return -4;
} }
} }
@ -73,7 +87,6 @@ return 0;
#macro Cos_01( X ) #macro Cos_01( X )
(0.5-0.5*cos( 3.141592654 * X)) (0.5-0.5*cos( 3.141592654 * X))
#end #end
*/ */
int fimg_cos_01(FloatImg *s, FloatImg *d, double maxval) int fimg_cos_01(FloatImg *s, FloatImg *d, double maxval)
{ {
@ -89,6 +102,13 @@ if (s->type != FIMG_TYPE_RGB) {
if (NULL==d) { if (NULL==d) {
d = s; d = s;
} }
else {
if (d->type != FIMG_TYPE_RGB) {
fprintf(stderr, "%s : dst type %d invalide\n",
__func__, d->type);
return -4;
}
}
nbre = s->width * s->height * 3; nbre = s->width * s->height * 3;

View File

@ -33,6 +33,9 @@ if (FIMG_TYPE_RGB != src->type) {
if (FIMG_TYPE_GRAY != dst->type) { if (FIMG_TYPE_GRAY != dst->type) {
fprintf(stderr, "%s : bad dst type %d on %p\n", __func__, fprintf(stderr, "%s : bad dst type %d on %p\n", __func__,
dst->type, dst); dst->type, dst);
/*
* may be we can convert dst picture on the fly ?
*/
return -9; return -9;
} }

View File

@ -1,21 +1,23 @@
#!/bin/bash #!/bin/bash
grabvidseq -s 960x720 -n 600 -p 0.5 -vv -g -o original.fimg ../v4l2/grabvidseq -s 960x720 -n 10000 -p 0.078 \
-vv -g -c none \
-o original.fimg
make t && ./t make t && ./t
for picz in original power2 squareroot cos_01 for picz in original power2 squareroot cos_01
do do
echo _______________ ${picz} echo _______________________ ${picz}
# ../tools/fimgstats -v ${picz}.fimg # ../tools/fimgstats -v ${picz}.fimg
../tools/fimg2pnm -v ${picz}.fimg ${picz}.pnm ../tools/fimg2pnm -v ${picz}.fimg ${picz}.pnm
convert -pointsize 36 \ convert -pointsize 48 \
-fill white -annotate +10+28 "${picz}" \ -fill black -annotate +14+40 "${picz}" \
-fill black -annotate +12+30 "${picz}" \ -fill white -annotate +16+42 "${picz}" \
${picz}.pnm ${picz}.png ${picz}.pnm ${picz}.png
rm ${picz}.pnm rm ${picz}.pnm

24
lib/t.c
View File

@ -13,29 +13,6 @@
int verbosity; int verbosity;
/* ---------------------------------------------------------------- */
int petit_dessin(FloatImg *img)
{
int x, y;
float r, g, b;
for (y=0; y<img->height; y++) {
r = (float)y / (float)img->height;
for (x=0; x<img->width; x++) {
g = (float)x / (float)img->width;
b = 0.0;;
fimg_plot_rgb(img, x, y, r, g, b);
}
}
return -1;
}
/* ---------------------------------------------------------------- */ /* ---------------------------------------------------------------- */
int essai_2gray(FloatImg *picz, char *outname) int essai_2gray(FloatImg *picz, char *outname)
@ -77,7 +54,6 @@ double maxi;
foo = fimg_create_from_dump(fname, &dessin); foo = fimg_create_from_dump(fname, &dessin);
foo = fimg_clone(&dessin, &copy, 0); foo = fimg_clone(&dessin, &copy, 0);
maxi = (double)fimg_get_maxvalue(&dessin); maxi = (double)fimg_get_maxvalue(&dessin);
fprintf(stderr, "image source valeur maxi = %f\n", maxi); fprintf(stderr, "image source valeur maxi = %f\n", maxi);

View File

@ -64,6 +64,16 @@ if (r == -1) {
} }
} }
/* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */
int contraste(char *str)
{
if (!strcmp(str, "sqrt")) return CONTRAST_SQRT;
if (!strcmp(str, "pow2")) return CONTRAST_POW2;
if (!strcmp(str, "cos01")) return CONTRAST_COS01;
return -1;
}
/* --------------------------------------------------------------------- */
void help(int v) void help(int v)
{ {
if (verbosity) { if (verbosity) {
@ -74,9 +84,10 @@ puts("\t-d /dev/?\tselect video device");
puts("\t-g\t\tconvert to gray"); puts("\t-g\t\tconvert to gray");
puts("\t-n NNN\t\thow many frames ?"); puts("\t-n NNN\t\thow many frames ?");
puts("\t-O ./\t\tset Output dir"); puts("\t-O ./\t\tset Output dir");
puts("\t-o bla\t\tset output filename"); puts("\t-o bla.xxx\tset output filename");
puts("\t-p NN.N\t\tperiod in seconds"); puts("\t-p NN.N\t\tperiod in seconds");
puts("\t-s WxH\t\tsize of capture"); puts("\t-s WxH\t\tsize of capture");
puts("\t-c mode\t\tcontrast enhancement");
puts("\t-u\t\ttry upscaling..."); puts("\t-u\t\ttry upscaling...");
puts("\t-v\t\tincrease verbosity"); puts("\t-v\t\tincrease verbosity");
exit(0); exit(0);
@ -104,9 +115,10 @@ int nbre_capt = 1; /* nombre de captures */
int opt; int opt;
int width = 640; int width = 640;
int height = 480; int height = 480;
double t_final; double t_final, maxvalue;
int to_gray = 0; int to_gray = 0;
int upscaling = 0; int upscaling = 0;
int contrast = 0;
char *dest_dir = "."; /* no trailing slash */ char *dest_dir = "."; /* no trailing slash */
char *outfile = "out.pnm"; char *outfile = "out.pnm";
@ -114,8 +126,9 @@ char *outfile = "out.pnm";
FloatImg cumul; FloatImg cumul;
#endif #endif
while ((opt = getopt(argc, argv, "d:ghn:o:O:p:s:uv")) != -1) { while ((opt = getopt(argc, argv, "c:d:ghn:o:O:p:s:uv")) != -1) {
switch(opt) { switch(opt) {
case 'c': contrast = contraste(optarg); break;
case 'd': dev_name = optarg; break; case 'd': dev_name = optarg; break;
case 'g': to_gray = 1; break; case 'g': to_gray = 1; break;
case 'h': help(0); break; case 'h': help(0); break;
@ -140,9 +153,10 @@ while ((opt = getopt(argc, argv, "d:ghn:o:O:p:s:uv")) != -1) {
if (verbosity) { if (verbosity) {
fprintf(stderr, "running %s pid=%d\n", argv[0], getpid()); fprintf(stderr, "running %s pid=%d\n", argv[0], getpid());
fprintf(stderr, "grabing %d picz\n", nbre_capt);
fprintf(stderr, "period is %.3f milliseconds\n", period/1e3); fprintf(stderr, "period is %.3f milliseconds\n", period/1e3);
fprintf(stderr, "framesize is %dx%d\n", width, height); fprintf(stderr, "framesize is %dx%d\n", width, height);
fprintf(stderr, "upscaling is %s\n", upscaling ? "on" : "off"); if (upscaling) fprintf(stderr, "upscaling is on\n");
} }
fd = v4l2_open(dev_name, O_RDWR | O_NONBLOCK, 0); fd = v4l2_open(dev_name, O_RDWR | O_NONBLOCK, 0);
@ -160,11 +174,11 @@ fmt.fmt.pix.field = V4L2_FIELD_INTERLACED;
xioctl(fd, VIDIOC_S_FMT, &fmt); xioctl(fd, VIDIOC_S_FMT, &fmt);
if (fmt.fmt.pix.pixelformat != V4L2_PIX_FMT_RGB24) { if (fmt.fmt.pix.pixelformat != V4L2_PIX_FMT_RGB24) {
/* are others formats usable ? */ /* are others formats usable ? */
printf("Libv4l didn't accept RGB24 format. Can't proceed.\n"); fprintf(stderr, "Libv4l didn't accept RGB24 format. Can't proceed.\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
if ((fmt.fmt.pix.width != width) || (fmt.fmt.pix.height != height)) { if ((fmt.fmt.pix.width != width) || (fmt.fmt.pix.height != height)) {
printf("Warning: driver is sending image at %dx%d\n", fprintf(stderr, "Warning: driver is sending image at %dx%d\n",
fmt.fmt.pix.width, fmt.fmt.pix.height); fmt.fmt.pix.width, fmt.fmt.pix.height);
} }
@ -316,6 +330,29 @@ if (to_gray) {
// save cumul to file // save cumul to file
if (verbosity) fprintf(stderr, "saving cumul to '%s'\n", outfile); if (verbosity) fprintf(stderr, "saving cumul to '%s'\n", outfile);
/* ----- nouveau 15 nov 2019 */
maxvalue = cumul.fval * cumul.count;
if (verbosity) {
fprintf(stderr, "computed maxvalue = %g\n", maxvalue);
}
switch (contrast) {
case CONTRAST_NONE:
fprintf(stderr, "contrast: none\n");
break;
case CONTRAST_SQRT:
fimg_square_root(&cumul, NULL, maxvalue);
break;
case CONTRAST_POW2:
fimg_power_2(&cumul, NULL, maxvalue);
break;
case CONTRAST_COS01:
fimg_cos_01(&cumul, NULL, maxvalue);
break;
default:
fprintf(stderr, "bad contrast method\n");
break;
}
foo = format_from_extension(outfile); foo = format_from_extension(outfile);
switch (foo) { switch (foo) {
case FILE_TYPE_FIMG: case FILE_TYPE_FIMG: