Merge pull request #188 from Mr-DaveDev/mask_resize

Mask resize
This commit is contained in:
Mr-Dave
2016-09-23 22:19:16 -06:00
committed by GitHub
3 changed files with 34 additions and 17 deletions

View File

@@ -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;

View File

@@ -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

View File

@@ -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;
}