Added option to not generate analysis images.

git-svn-id: http://svn.zoneminder.com/svn/zm/trunk@695 e3e1d417-86f3-4887-817a-d78f3d33393f
This commit is contained in:
stan 2003-11-21 10:38:41 +00:00
parent 568a25cda6
commit 34f902e87b
5 changed files with 42 additions and 29 deletions

View File

@ -225,7 +225,7 @@ void Event::AddFrames( int n_frames, struct timeval **timestamps, const Image **
} }
} }
void Event::AddFrame( struct timeval timestamp, const Image *image, const Image *alarm_image, unsigned int score ) void Event::AddFrame( struct timeval timestamp, const Image *image, unsigned int score, const Image *alarm_image )
{ {
frames++; frames++;
@ -240,27 +240,30 @@ void Event::AddFrame( struct timeval timestamp, const Image *image, const Image
Debug( 1, ( "Adding frame %d to DB", frames )); Debug( 1, ( "Adding frame %d to DB", frames ));
static char sql[BUFSIZ]; static char sql[BUFSIZ];
sprintf( sql, "insert into Frames ( EventId, FrameId, AlarmFrame, ImagePath, Delta, Score ) values ( %d, %d, %d, '%s', %s%ld.%02ld, %d )", id, frames, alarm_image!=0, event_file, delta_time.positive?"":"-", delta_time.sec, delta_time.fsec, score ); sprintf( sql, "insert into Frames ( EventId, FrameId, AlarmFrame, ImagePath, Delta, Score ) values ( %d, %d, %d, '%s', %s%ld.%02ld, %d )", id, frames, score>0, event_file, delta_time.positive?"":"-", delta_time.sec, delta_time.fsec, score );
if ( mysql_query( &dbconn, sql ) ) if ( mysql_query( &dbconn, sql ) )
{ {
Error(( "Can't insert frame: %s", mysql_error( &dbconn ) )); Error(( "Can't insert frame: %s", mysql_error( &dbconn ) ));
exit( mysql_errno( &dbconn ) ); exit( mysql_errno( &dbconn ) );
} }
if ( alarm_image ) if ( score )
{ {
end_time = timestamp; end_time = timestamp;
alarm_frames++; alarm_frames++;
sprintf( event_file, "%s/analyse-%03d.jpg", path, frames );
Debug( 1, ( "Writing analysis frame %d", frames ));
WriteFrameImage( alarm_image, event_file, true );
tot_score += score; tot_score += score;
if ( score > max_score ) if ( score > max_score )
max_score = score; max_score = score;
if ( alarm_image )
{
sprintf( event_file, "%s/analyse-%03d.jpg", path, frames );
Debug( 1, ( "Writing analysis frame %d", frames ));
WriteFrameImage( alarm_image, event_file, true );
}
} }
} }

View File

@ -81,7 +81,7 @@ public:
bool WriteFrameImage( const Image *image, const char *event_file, bool alarm_frame=false ); bool WriteFrameImage( const Image *image, const char *event_file, bool alarm_frame=false );
void AddFrames( int n_frames, struct timeval **timestamps, const Image **images ); void AddFrames( int n_frames, struct timeval **timestamps, const Image **images );
void AddFrame( struct timeval timestamp, const Image *image, const Image *alarm_frame=NULL, unsigned int score=0 ); void AddFrame( struct timeval timestamp, const Image *image, unsigned int score=0, const Image *alarm_frame=NULL );
static void StreamEvent( const char *path, int event_id, int rate=1, int scale=1, FILE *fd=stdout ); static void StreamEvent( const char *path, int event_id, int rate=1, int scale=1, FILE *fd=stdout );
}; };

View File

@ -638,11 +638,9 @@ bool Monitor::Analyse()
pre_index = (pre_index+1)%image_buffer_count; pre_index = (pre_index+1)%image_buffer_count;
} }
event->AddFrames( pre_event_count, timestamps, images ); event->AddFrames( pre_event_count, timestamps, images );
//event->AddFrame( now, &image );
} }
shared_data->state = state = TAPE; shared_data->state = state = TAPE;
} }
//last_alarm_count = image_count;
} }
if ( score ) if ( score )
{ {
@ -664,7 +662,6 @@ bool Monitor::Analyse()
pre_index = (pre_index+1)%image_buffer_count; pre_index = (pre_index+1)%image_buffer_count;
} }
event->AddFrames( pre_event_count, timestamps, images ); event->AddFrames( pre_event_count, timestamps, images );
//event->AddFrame( now, &image );
} }
} }
shared_data->state = state = ALARM; shared_data->state = state = ALARM;
@ -699,19 +696,26 @@ bool Monitor::Analyse()
{ {
if ( state == ALARM ) if ( state == ALARM )
{ {
Image alarm_image( *image ); if ( (bool)config.Item( ZM_CREATE_ANALYSIS_IMAGES ) )
for( int i = 0; i < n_zones; i++ )
{ {
if ( zones[i]->Alarmed() ) Image alarm_image( *image );
for( int i = 0; i < n_zones; i++ )
{ {
alarm_image.Overlay( zones[i]->AlarmImage() ); if ( zones[i]->Alarmed() )
if ( record_event_stats )
{ {
zones[i]->RecordStats( event ); alarm_image.Overlay( zones[i]->AlarmImage() );
if ( record_event_stats )
{
zones[i]->RecordStats( event );
}
} }
} }
event->AddFrame( *timestamp, image, score, &alarm_image );
}
else
{
event->AddFrame( *timestamp, image, score );
} }
event->AddFrame( *timestamp, image, &alarm_image, score );
} }
else if ( state == ALERT ) else if ( state == ALERT )
{ {
@ -1208,7 +1212,7 @@ unsigned int Monitor::Compare( const Image &image )
} }
else else
{ {
// Find all alarm pixels in exclusion zones // Find all alarm pixels in exclusive zones
for ( int n_zone = 0; n_zone < n_zones; n_zone++ ) for ( int n_zone = 0; n_zone < n_zones; n_zone++ )
{ {
Zone *zone = zones[n_zone]; Zone *zone = zones[n_zone];

View File

@ -104,8 +104,6 @@ bool Zone::CheckAlarms( const Image *delta_image )
} }
} }
//diff_image->WriteJpeg( "diff1.jpg" );
if ( !alarm_pixels ) return( false ); if ( !alarm_pixels ) return( false );
if ( min_alarm_pixels && alarm_pixels < min_alarm_pixels ) return( false ); if ( min_alarm_pixels && alarm_pixels < min_alarm_pixels ) return( false );
if ( max_alarm_pixels && alarm_pixels > max_alarm_pixels ) return( false ); if ( max_alarm_pixels && alarm_pixels > max_alarm_pixels ) return( false );
@ -162,8 +160,6 @@ bool Zone::CheckAlarms( const Image *delta_image )
} }
} }
//diff_image->WriteJpeg( "diff2.jpg" );
if ( !alarm_filter_pixels ) return( false ); if ( !alarm_filter_pixels ) return( false );
if ( min_filter_pixels && alarm_filter_pixels < min_filter_pixels ) return( false ); if ( min_filter_pixels && alarm_filter_pixels < min_filter_pixels ) return( false );
if ( max_filter_pixels && alarm_filter_pixels > max_filter_pixels ) return( false ); if ( max_filter_pixels && alarm_filter_pixels > max_filter_pixels ) return( false );
@ -301,7 +297,6 @@ bool Zone::CheckAlarms( const Image *delta_image )
} }
} }
//diff_image->WriteJpeg( "diff3.jpg" );
if ( !alarm_blobs ) return( false ); if ( !alarm_blobs ) return( false );
alarm_blob_pixels = alarm_filter_pixels; alarm_blob_pixels = alarm_filter_pixels;
@ -381,11 +376,14 @@ bool Zone::CheckAlarms( const Image *delta_image )
if ( alarm_blobs ) if ( alarm_blobs )
{ {
alarm = true; alarm = true;
//Image *high_image = image = diff_image->HighlightEdges( alarm_rgb, &limits );
image = diff_image->HighlightEdges( alarm_rgb, &limits );
delete diff_image; if ( (type < PRECLUSIVE) && (bool)config.Item( ZM_CREATE_ANALYSIS_IMAGES ) )
//high_image->WriteJpeg( "diff4.jpg" ); {
image = diff_image->HighlightEdges( alarm_rgb, &limits );
// Only need to delete this when 'image' becomes detached and points somewhere else
delete diff_image;
}
Info(( "%s: Alarm Pixels: %d, Filter Pixels: %d, Blob Pixels: %d, Blobs: %d, Score: %d", Label(), alarm_pixels, alarm_filter_pixels, alarm_blob_pixels, alarm_blobs, score )); Info(( "%s: Alarm Pixels: %d, Filter Pixels: %d, Blob Pixels: %d, Blobs: %d, Score: %d", Label(), alarm_pixels, alarm_filter_pixels, alarm_blob_pixels, alarm_blobs, score ));
} }

View File

@ -778,6 +778,14 @@ my @options =
type => $types{boolean}, type => $types{boolean},
category => 'system', category => 'system',
}, },
{
name => "ZM_CREATE_ANALYSIS_IMAGES",
default => "yes",
description => "Whether to create analysed alarm images with motion outlined",
help => "By default during an alarm ZoneMinder records both the raw captured image and one that has been analysed and had areas where motion was detected outlined. This can be very useful during zone configuration or in analysing why events occured. However it also incurs some overhead and in a stable system may no longer be necessary. This parameter allows you to switch the generation of these images off.",
type => $types{boolean},
category => 'system',
},
{ {
name => "ZM_WEB_REFRESH_METHOD", name => "ZM_WEB_REFRESH_METHOD",
default => "javascript", default => "javascript",