mirror of
https://github.com/Motion-Project/motion.git
synced 2026-04-23 23:47:04 -04:00
3
motion.c
3
motion.c
@@ -1018,6 +1018,9 @@ static void motion_cleanup(struct context *cnt)
|
||||
free(cnt->imgs.smartmask_buffer);
|
||||
cnt->imgs.smartmask_buffer = NULL;
|
||||
|
||||
if (cnt->imgs.mask) free(cnt->imgs.mask);
|
||||
cnt->imgs.mask = NULL;
|
||||
|
||||
free(cnt->imgs.common_buffer);
|
||||
cnt->imgs.common_buffer = NULL;
|
||||
|
||||
|
||||
@@ -2559,8 +2559,8 @@ Areas are numbered like
|
||||
</ul>
|
||||
<p></p>
|
||||
The full path and filename for the masking pgm file.
|
||||
This picture MUST have the same width and height as the frames being
|
||||
captured and be in binary format.
|
||||
If needed, the mask will be resized to match the width and height of the frames being
|
||||
captured.
|
||||
If you have one or more areas of the camera image in which you do NOT want motion detected (e.g. a tree that
|
||||
moves in the wind or a corner of the picture where you can see cars/pedestrians passing by) you need a mask file.
|
||||
This file is a picture that you create in your favorite photo editing program. The areas that you want detected must
|
||||
|
||||
44
picture.c
44
picture.c
@@ -963,9 +963,9 @@ void put_picture(struct context *cnt, char *file, unsigned char *image, int ftyp
|
||||
*/
|
||||
unsigned char *get_pgm(FILE *picture, int width, int height)
|
||||
{
|
||||
int x = 0 , y = 0, maxval;
|
||||
int x, y, mask_width, mask_height, maxval;
|
||||
char line[256];
|
||||
unsigned char *image;
|
||||
unsigned char *image, *resized_image;
|
||||
|
||||
line[255] = 0;
|
||||
|
||||
@@ -986,18 +986,12 @@ unsigned char *get_pgm(FILE *picture, int width, int height)
|
||||
if (!fgets(line, 255, picture))
|
||||
return NULL;
|
||||
|
||||
/* Check size */
|
||||
if (sscanf(line, "%d %d", &x, &y) != 2) {
|
||||
/* Read image size */
|
||||
if (sscanf(line, "%d %d", &mask_width, &mask_height) != 2) {
|
||||
MOTION_LOG(ERR, TYPE_ALL, SHOW_ERRNO, "%s: Failed reading size in pgm file");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (x != width || y != height) {
|
||||
MOTION_LOG(ERR, TYPE_ALL, SHOW_ERRNO, "%s: Wrong image size %dx%d should be %dx%d",
|
||||
x, y, width, height);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Maximum value */
|
||||
line[0] = '#';
|
||||
while (line[0] == '#')
|
||||
@@ -1011,17 +1005,37 @@ unsigned char *get_pgm(FILE *picture, int width, int height)
|
||||
|
||||
/* Read data */
|
||||
|
||||
image = mymalloc(width * height);
|
||||
image = mymalloc(mask_width * mask_height);
|
||||
|
||||
for (y = 0; y < height; y++) {
|
||||
if ((int)fread(&image[y * width], 1, width, picture) != width)
|
||||
for (y = 0; y < mask_height; y++) {
|
||||
if ((int)fread(&image[y * mask_width], 1, mask_width, picture) != mask_width)
|
||||
MOTION_LOG(ERR, TYPE_ALL, SHOW_ERRNO, "%s: Failed reading image data from pgm file");
|
||||
|
||||
for (x = 0; x < width; x++)
|
||||
image[y * width + x] = (int)image[y * width + x] * 255 / maxval;
|
||||
for (x = 0; x < mask_width; x++)
|
||||
image[y * mask_width + x] = (int)image[y * mask_width + x] * 255 / maxval;
|
||||
|
||||
}
|
||||
|
||||
/* Resize mask if required */
|
||||
if (mask_width != width || mask_height != height) {
|
||||
MOTION_LOG(WRN, TYPE_ALL, NO_ERRNO, "%s: The mask file specified is not the same size as image from camera.");
|
||||
MOTION_LOG(WRN, TYPE_ALL, NO_ERRNO, "%s: Attempting to resize mask image from %dx%d to %dx%d",
|
||||
mask_width, mask_height, width, height);
|
||||
|
||||
resized_image = mymalloc(width * height);
|
||||
|
||||
for (y = 0; y < height; y++) {
|
||||
for (x = 0; x < width; x++) {
|
||||
resized_image[y * width + x] = image[
|
||||
(mask_height - 1) * y / (height - 1) * mask_width +
|
||||
(mask_width - 1) * x / (width - 1)];
|
||||
}
|
||||
}
|
||||
|
||||
free(image);
|
||||
image = resized_image;
|
||||
}
|
||||
|
||||
return image;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user