From 81af7d9295e555e2eb29f3d8f8a040eec62773bf Mon Sep 17 00:00:00 2001 From: KennethLavrsen Date: Tue, 21 Feb 2006 08:42:45 +0000 Subject: [PATCH] Added some constants in video.c function v4l_picture_controls() which can help people hack an optimal set of values for controlling auto brighness for their particular camera. For now I am do not want to add all of these to the already too large number of motion config options. Maybe based on feedback we can permanently change the constants and add an additional auto brightness option. Or maybe a combined option that sets more constant based on an algoritm. (Kenneth Lavrsen) http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2006x02x07x212816 --- CHANGELOG | 8 ++++++++ CREDITS | 8 ++++++++ alg.c | 12 ++++++------ video.c | 34 ++++++++++++++++++++++++++++------ 4 files changed, 50 insertions(+), 12 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 12e797c9..15fccae3 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -35,6 +35,14 @@ problem related to building with ffmpeg. (Angel Carpintero) * Implemented fix for missed snapshots with slow network cameras (Kenneth Lavrsen) http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2006x02x07x162149 + * Added some constants in video.c function v4l_picture_controls() which can help + people hack an optimal set of values for controlling auto brighness for their + particular camera. For now I am do not want to add all of these to the already + too large number of motion config options. Maybe based on feedback we can + permanently change the constants and add an additional auto brightness option. + Or maybe a combined option that sets more constant based on an algoritm. + (Kenneth Lavrsen) + http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2006x02x07x212816 3.2.4 Formal Release. Summary of changes diff --git a/CREDITS b/CREDITS index 9749a4b9..2a148df1 100644 --- a/CREDITS +++ b/CREDITS @@ -825,6 +825,14 @@ Kenneth Lavrsen (Currently project managing Motion) http://www.lavrsen.dk/twiki/bin/view/Motion/PwcConfiguration * Implemented fix for missed snapshots with slow network cameras http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2006x02x07x162149 + * Added some constants in video.c function v4l_picture_controls() which can help + people hack an optimal set of values for controlling auto brighness for their + particular camera. For now I am do not want to add all of these to the already + too large number of motion config options. Maybe based on feedback we can + permanently change the constants and add an additional auto brightness option. + Or maybe a combined option that sets more constant based on an algoritm. + (Kenneth Lavrsen) + http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2006x02x07x212816 Mike Lees * Added the onffmpegclose feature. diff --git a/alg.c b/alg.c index 20fc441c..80c51e7d 100644 --- a/alg.c +++ b/alg.c @@ -194,7 +194,7 @@ void alg_draw_location(struct coord *cent, struct images *imgs, int width, unsig #define NDIFF(x, y) (ABS(x)*NORM/(ABS(x)+2*DIFF(x,y))) -void alg_noise_tune (struct context *cnt, unsigned char *new) +void alg_noise_tune(struct context *cnt, unsigned char *new) { struct images *imgs=&cnt->imgs; int i; @@ -338,7 +338,7 @@ static int iflood(int x, int y, return count; } -static int alg_labeling (struct context *cnt) +static int alg_labeling(struct context *cnt) { struct images *imgs=&cnt->imgs; unsigned char *out=imgs->out; @@ -970,7 +970,7 @@ int alg_diff_standard (struct context *cnt, unsigned char *new) Very fast diff function, does not do nightcompensation or mask overlaying. */ -static char alg_diff_fast (struct context *cnt, int max_n_changes, unsigned char *new) +static char alg_diff_fast(struct context *cnt, int max_n_changes, unsigned char *new) { struct images *imgs=&cnt->imgs; int i, diffs=0, step=imgs->motionsize/10000; @@ -1000,7 +1000,7 @@ static char alg_diff_fast (struct context *cnt, int max_n_changes, unsigned char /* alg_diff uses diff_fast to quickly decide if there is anything worth * sending to diff_standard. */ -int alg_diff (struct context *cnt, unsigned char *new) +int alg_diff(struct context *cnt, unsigned char *new) { int diffs=0; @@ -1014,7 +1014,7 @@ int alg_diff (struct context *cnt, unsigned char *new) It is assumed to be the light being switched on or a camera displacement. In any way the user doesn't think it is worth capturing. */ -int alg_lightswitch (struct context *cnt, int diffs) +int alg_lightswitch(struct context *cnt, int diffs) { struct images *imgs=&cnt->imgs; @@ -1030,7 +1030,7 @@ int alg_lightswitch (struct context *cnt, int diffs) return 0; } -int alg_switchfilter (struct context *cnt, int diffs, unsigned char *newimg) +int alg_switchfilter(struct context *cnt, int diffs, unsigned char *newimg) { int linediff = diffs / cnt->imgs.height; unsigned char *out = cnt->imgs.out; diff --git a/video.c b/video.c index 0bed0ced..052918d4 100644 --- a/video.c +++ b/video.c @@ -26,6 +26,26 @@ #define MAX2(x, y) ((x) > (y) ? (x) : (y)) #define MIN2(x, y) ((x) < (y) ? (x) : (y)) +/* Constants used by auto brightness feature + * Defined as constant to make it easier for people to tweak code for a + * difficult camera. + * The experience gained from people could help improving the feature without + * adding too many new options. + * AUTOBRIGHT_HYSTERESIS sets the minimum the light intensity must change before + * we adjust brigtness. + * AUTOBRIGHTS_DAMPER damps the speed with which we adjust the brightness + * When the brightness changes a lot we step in large steps and as we approach the + * target value we slow down to avoid overshoot and oscillations. If the camera + * adjusts too slowly decrease the DAMPER value. If the camera oscillates try + * increasing the DAMPER value. DAMPER must be minimum 1. + * MAX and MIN are the max and min values of brightness setting we will send to + * the camera device. + */ +#define AUTOBRIGHT_HYSTERESIS 10 +#define AUTOBRIGHT_DAMPER 5 +#define AUTOBRIGHT_MAX 255 +#define AUTOBRIGHT_MIN 0 + static void v4l_picture_controls(struct context *cnt, struct video_dev *viddev) { int dev = viddev->fd; @@ -79,8 +99,8 @@ static void v4l_picture_controls(struct context *cnt, struct video_dev *viddev) else brightness_target = 128; - brightness_window_high = MIN2(brightness_target + 10, 255); - brightness_window_low = MAX2(brightness_target - 10, 1); + brightness_window_high = MIN2(brightness_target + AUTOBRIGHT_HYSTERESIS, 255); + brightness_window_low = MAX2(brightness_target - AUTOBRIGHT_HYSTERESIS, 1); for (i = 0; i < cnt->imgs.motionsize; i += 101) { avg += image[i]; @@ -96,8 +116,9 @@ static void v4l_picture_controls(struct context *cnt, struct video_dev *viddev) } /* average is above window - turn down brightness - go for the target */ if (avg > brightness_window_high) { - step = MIN2((avg - brightness_target)/5+1, viddev->brightness); - if (viddev->brightness > step+1) { + step = MIN2((avg - brightness_target)/AUTOBRIGHT_DAMPER + 1, + viddev->brightness - AUTOBRIGHT_MIN); + if (viddev->brightness > step + 1 - AUTOBRIGHT_MIN) { viddev->brightness -= step; vid_pic.brightness = viddev->brightness * 256; make_change = 1; @@ -105,8 +126,9 @@ static void v4l_picture_controls(struct context *cnt, struct video_dev *viddev) } /* average is below window - turn up brightness - go for the target */ if (avg < brightness_window_low) { - step = MIN2((brightness_target - avg)/5+1, 255 - viddev->brightness); - if (viddev->brightness < 255-step ) { + step = MIN2((brightness_target - avg)/AUTOBRIGHT_DAMPER + 1, + AUTOBRIGHT_MAX - viddev->brightness); + if (viddev->brightness < AUTOBRIGHT_MAX - step ) { viddev->brightness += step; vid_pic.brightness = viddev->brightness * 256; make_change = 1;