Description
I did not need 24x7 Motion detection, So I added a new Feature where zones have a Timestart and timeend. I needed An Active zone for Midnight till 3am.
My modifications for putting on/off time on Zones:
Modify zm_create.sql file:
In CREATE TABLE ZonePresets
( Section add:
OverloadFrames
smallint(5) unsigned NOT NULL default '0',
++TimeStart
tinyint(2) unsigned NOT NULL default '0',
++TimeEnd
tinyint(2) unsigned NOT NULL default '23' ,
In CREATE TABLE Zones
( Section add:
OverloadFrames
smallint(5) unsigned NOT NULL default '0',
++TimeStart
tinyint(2) unsigned NOT NULL default '0',
++TimeEnd
tinyint(2) unsigned NOT NULL default '23' ,
ADD TWO COLUMNS: ,0,23
--INSERT INTO ZonePresets VALUES (1,'Fast, low sensitivity','Active','Percent','AlarmedPixels',60,NULL,20,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,);
--INSERT INTO ZonePresets VALUES (2,'Fast, medium sensitivity','Active','Percent','AlarmedPixels',40,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0);
--INSERT INTO ZonePresets VALUES (3,'Fast, high sensitivity','Active','Percent','AlarmedPixels',20,NULL,5,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,);
--INSERT INTO ZonePresets VALUES (4,'Best, low sensitivity','Active','Percent','Blobs',60,NULL,36,NULL,7,7,24,NULL,20,NULL,1,NULL,0);
--INSERT INTO ZonePresets VALUES (5,'Best, medium sensitivity','Active','Percent','Blobs',40,NULL,16,NULL,5,5,12,NULL,10,NULL,1,NULL,0);
--INSERT INTO ZonePresets VALUES (6,'Best, high sensitivity','Active','Percent','Blobs',20,NULL,8,NULL,3,3,6,NULL,5,NULL,1,NULL,0);
++INSERT INTO ZonePresets VALUES (1,'Fast, low sensitivity','Active','Percent','AlarmedPixels',60,NULL,20,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,0,23);
++INSERT INTO ZonePresets VALUES (2,'Fast, medium sensitivity','Active','Percent','AlarmedPixels',40,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,0,23);
++INSERT INTO ZonePresets VALUES (3,'Fast, high sensitivity','Active','Percent','AlarmedPixels',20,NULL,5,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,0,23);
++INSERT INTO ZonePresets VALUES (4,'Best, low sensitivity','Active','Percent','Blobs',60,NULL,36,NULL,7,7,24,NULL,20,NULL,1,NULL,0,0,23);
++INSERT INTO ZonePresets VALUES (5,'Best, medium sensitivity','Active','Percent','Blobs',40,NULL,16,NULL,5,5,12,NULL,10,NULL,1,NULL,0,0,23);
++INSERT INTO ZonePresets VALUES (6,'Best, high sensitivity','Active','Percent','Blobs',20,NULL,8,NULL,3,3,6,NULL,5,NULL,1,NULL,0,0,23);
Modify your favorite language file, default: en_gb.php:
'TimeStamp' => 'Time Stamp',
++ 'TimeStart' => 'TimeStart',
++ 'TimeEnd' => 'TimeEnd',
and also:
'ZoneOverloadFrames' => 'Overload Frame Ignore Count',
++ 'ZoneTimeStart' => 'Time Start',
++ 'ZoneTimeEnd' => 'Time End',
Modify big5_big5.php
add:
'ZoneOverloadFrames' => 'Overload Frame Ignore Count',
++ 'ZoneTimeStart' => 'Time Start',
++ 'ZoneTimeEnd' => 'Time End',
Modify zone.php:
'OverloadFrames' => '',
++ 'TimeStart' => '0',
++ 'TimeEnd' => '23',
and:
++
++
++ <input type="text" name="newZone[TimeStart]" value="" size="4"++
++ onchange="limitRange( this, 0,23 )"
++ />
++
++
++
++ <input type="text" name="newZone[TimeEnd]" value="" size="4"
++ onchange="limitRange( this, 0,23 )"
++ />
++
// The avove fixes Database structure, and new additions. Now to SRC Files::
In Src file zm_zone.h add:
int overload_frames;
++ int time_start;
++ int time_end;
--protected:
-- void Setup( Monitor *p_monitor, int p_id, const char *p_label, ZoneType p_type, const Polygon &p_polygon, const Rgb p_alarm_rgb, CheckMethod p_check_method, int p_min_pixel_threshold, int p_max_pixel_threshold, int p_min_alarm_pixels, int p_max_alarm_pixels, const Coord &p_filter_box, int p_min_filter_pixels, int p_max_filter_pixels, int p_min_blob_pixels, int p_max_blob_pixels, int p_min_blobs, int p_max_blobs, int p_overload_frames, int p_time_start, int p_time_end);
--public:
-- Zone( Monitor *p_monitor, int p_id, const char *p_label, ZoneType p_type, const Polygon &p_polygon, const Rgb p_alarm_rgb, CheckMethod p_check_method, int p_min_pixel_threshold=15, int p_max_pixel_threshold=0, int p_min_alarm_pixels=50, int p_max_alarm_pixels=75000, const Coord &p_filter_box=Coord( 3, 3 ), int p_min_filter_pixels=50, int p_max_filter_pixels=50000, int p_min_blob_pixels=10, int p_max_blob_pixels=0, int p_min_blobs=0, int p_max_blobs=0, int p_overload_frames=0 , int p_time_start=0, int p_time_end=23)
-- {
-- Setup( p_monitor, p_id, p_label, p_type, p_polygon, p_alarm_rgb, p_check_method, p_min_pixel_threshold, p_max_pixel_threshold, p_min_alarm_pixels, p_max_alarm_pixels, p_filter_box, p_min_filter_pixels, p_max_filter_pixels, p_min_blob_pixels, p_max_blob_pixels, p_min_blobs, p_max_blobs, p_overload_frames, p_time_start, p_time_end );
-- }
-- Zone( Monitor *p_monitor, int p_id, const char *p_label, const Polygon &p_polygon, const Rgb p_alarm_rgb, CheckMethod p_check_method, int p_min_pixel_threshold=15, int p_max_pixel_threshold=0, int p_min_alarm_pixels=50, int p_max_alarm_pixels=75000, const Coord &p_filter_box=Coord( 3, 3 ), int p_min_filter_pixels=50, int p_max_filter_pixels=50000, int p_min_blob_pixels=10, int p_max_blob_pixels=0, int p_min_blobs=0, int p_max_blobs=0, int p_overload_frames=0, int p_time_start=0, int p_time_end=23 )
-- {
-- Setup( p_monitor, p_id, p_label, Zone::ACTIVE, p_polygon, p_alarm_rgb, p_check_method, p_min_pixel_threshold, p_max_pixel_threshold, p_min_alarm_pixels, p_max_alarm_pixels, p_filter_box, p_min_filter_pixels, p_max_filter_pixels, p_min_blob_pixels, p_max_blob_pixels, p_min_blobs, p_max_blobs, p_overload_frames , p_time_start, p_time_end);
-- }
++protected:
++ void Setup( Monitor *p_monitor, int p_id, const char *p_label, ZoneType p_type, const Polygon &p_polygon, const Rgb p_alarm_rgb, CheckMethod p_check_method, int p_min_pixel_threshold, int p_max_pixel_threshold, int p_min_alarm_pixels, int p_max_alarm_pixels, const Coord &p_filter_box, int p_min_filter_pixels, int p_max_filter_pixels, int p_min_blob_pixels, int p_max_blob_pixels, int p_min_blobs, int p_max_blobs, int p_overload_frames, int p_time_start, int p_time_end);
++
++public:
++ Zone( Monitor *p_monitor, int p_id, const char *p_label, ZoneType p_type, const Polygon &p_polygon, const Rgb p_alarm_rgb, CheckMethod p_check_method, int p_min_pixel_threshold=15, int p_max_pixel_threshold=0, int p_min_alarm_pixels=50, int p_max_alarm_pixels=75000, const Coord &p_filter_box=Coord( 3, 3 ), int p_min_filter_pixels=50, int p_max_filter_pixels=50000, int p_min_blob_pixels=10, int p_max_blob_pixels=0, int p_min_blobs=0, int p_max_blobs=0, int p_overload_frames=0 , int p_time_start=0, int p_time_end=23)
++ {
++ Setup( p_monitor, p_id, p_label, p_type, p_polygon, p_alarm_rgb, p_check_method, p_min_pixel_threshold, p_max_pixel_threshold, p_min_alarm_pixels, p_max_alarm_pixels, p_filter_box, p_min_filter_pixels, p_max_filter_pixels, p_min_blob_pixels, p_max_blob_pixels, p_min_blobs, p_max_blobs, p_overload_frames, p_time_start, p_time_end );
++ }
++ Zone( Monitor *p_monitor, int p_id, const char *p_label, const Polygon &p_polygon, const Rgb p_alarm_rgb, CheckMethod p_check_method, int p_min_pixel_threshold=15, int p_max_pixel_threshold=0, int p_min_alarm_pixels=50, int p_max_alarm_pixels=75000, const Coord &p_filter_box=Coord( 3, 3 ), int p_min_filter_pixels=50, int p_max_filter_pixels=50000, int p_min_blob_pixels=10, int p_max_blob_pixels=0, int p_min_blobs=0, int p_max_blobs=0, int p_overload_frames=0, int p_time_start=0, int p_time_end=23 )
++ {
++ Setup( p_monitor, p_id, p_label, Zone::ACTIVE, p_polygon, p_alarm_rgb, p_check_method, p_min_pixel_threshold, p_max_pixel_threshold, p_min_alarm_pixels, p_max_alarm_pixels, p_filter_box, p_min_filter_pixels, p_max_filter_pixels, p_min_blob_pixels, p_max_blob_pixels, p_min_blobs, p_max_blobs, p_overload_frames , p_time_start, p_time_end);
++ }
--Setup( p_monitor, p_id, p_label, Zone::INACTIVE, p_polygon, RGB_BLACK, (Zone::CheckMethod)0, 0, 0, 0, 0, Coord( 0, 0 ), 0, 0, 0, 0, 0, 0, 0 );
++Setup( p_monitor, p_id, p_label, Zone::INACTIVE, p_polygon, RGB_BLACK, (Zone::CheckMethod)0, 0, 0, 0, 0, Coord( 0, 0 ), 0, 0, 0, 0, 0, 0, 0, 0, 0 );
Lastly:
inline unsigned int Score() const { return( score ); }
++ inline bool TimeFlag() const
++ {
++ int hr;
++ int zonetimestart=time_start;
++ int zonetimeend=time_end;
++ time_t rawtime;
++ struct tm *timeinfo;
++ time( &rawtime );
++ timeinfo=localtime (&rawtime);
++ hr=timeinfo->tm_hour;
++ if ((zonetimeend-zonetimestart) > 0)
++ {
++
++ if ( (hr >= zonetimestart) & (hr <= zonetimeend ) )
++ {
++ return (true);
++ }
++ }
++ if ((zonetimeend-zonetimestart) < 0)
++ {
++ if ( (hr >= zonetimestart) or (hr < zonetimeend ) )
++ {
++ return (true);
++ }
++ }
++ if ((zonetimeend-zonetimestart) == 0)
++ {
++ if ( (hr == zonetimestart) )
++ {
++ return (true);
++ }
++ }
++ return (false );
++ }
In SRC File zm_zone.cpp
--void Zone::Setup( Monitor *p_monitor, int p_id, const char *p_label, ZoneType p_type, const Polygon &p_polygon, const Rgb p_alarm_rgb, CheckMethod p_check_method, int p_min_pixel_threshold, int p_max_pixel_threshold, int p_min_alarm_pixels, int p_max_alarm_pixels, const Coord &p_filter_box, int p_min_filter_pixels, int p_max_filter_pixels, int p_min_blob_pixels, int p_max_blob_pixels, int p_min_blobs, int p_max_blobs, int p_overload_frames )
++void Zone::Setup( Monitor *p_monitor, int p_id, const char *p_label, ZoneType p_type, const Polygon &p_polygon, const Rgb p_alarm_rgb, CheckMethod p_check_method, int p_min_pixel_threshold, int p_max_pixel_threshold, int p_min_alarm_pixels, int p_max_alarm_pixels, const Coord &p_filter_box, int p_min_filter_pixels, int p_max_filter_pixels, int p_min_blob_pixels, int p_max_blob_pixels, int p_min_blobs, int p_max_blobs, int p_overload_frames, int p_time_start, int p_time_end )
ADD:
overload_frames = p_overload_frames;
++ time_start=p_time_start;
++ time_end=p_time_end;
-- Debug( 1, "Initialised zone %d/%s - %d - %dx%d - Rgb:%06x, CM:%d, MnAT:%d, MxAT:%d, MnAP:%d, MxAP:%d, FB:%dx%d, MnFP:%d, MxFP:%d, MnBS:%d, MxBS:%d, MnB:%d, MxB:%d, OF: %d", id, label, type, polygon.Width(), polygon.Height(), alarm_rgb, check_method, min_pixel_threshold, max_pixel_threshold, min_alarm_pixels, max_alarm_pixels, filter_box.X(), filter_box.Y(), min_filter_pixels, max_filter_pixels, min_blob_pixels, max_blob_pixels, min_blobs, max_blobs, overload_frames ,time_start,time_end);
++ Debug( 1, "Initialised zone %d/%s - %d - %dx%d - Rgb:%06x, CM:%d, MnAT:%d, MxAT:%d, MnAP:%d, MxAP:%d, FB:%dx%d, MnFP:%d, MxFP:%d, MnBS:%d, MxBS:%d, MnB:%d, MxB:%d, OF: %d, ZoneTimeStart: %d, ZoneTimeEnd: %d", id, label, type, polygon.Width(), polygon.Height(), alarm_rgb, check_method, min_pixel_threshold, max_pixel_threshold, min_alarm_pixels, max_alarm_pixels, filter_box.X(), filter_box.Y(), min_filter_pixels, max_filter_pixels, min_blob_pixels, max_blob_pixels, min_blobs, max_blobs, overload_frames ,time_start,time_end);
-- snprintf( sql, sizeof(sql), "select Id,Name,Type+0,Units,NumCoords,Coords,AlarmRGB,CheckMethod+0,MinPixelThreshold,MaxPixelThreshold,MinAlarmPixels,MaxAlarmPixels,FilterX,FilterY,MinFilterPixels,MaxFilterPixels,MinBlobPixels,MaxBlobPixels,MinBlobs,MaxBlobs,OverloadFrames from Zones where MonitorId = %d order by Type, Id", monitor->Id() );
++snprintf( sql, sizeof(sql), "select Id,Name,Type+0,Units,NumCoords,Coords,AlarmRGB,CheckMethod+0,MinPixelThreshold,MaxPixelThreshold,MinAlarmPixels,MaxAlarmPixels,FilterX,FilterY,MinFilterPixels,MaxFilterPixels,MinBlobPixels,MaxBlobPixels,MinBlobs,MaxBlobs,OverloadFrames,TimeStart,TimeEnd from Zones where MonitorId = %d order by Type, Id", monitor->Id() );
ADD:
int OverloadFrames = dbrow[col]?atoi(dbrow[col]):0; col++;
++ int TimeStart = dbrow[col]?atoi(dbrow[col]):0; col++;
++ int TimeEnd = dbrow[col]?atoi(dbrow[col]):0; col++;
Add new IF:
-- if ( atoi(dbrow[2]) == Zone::INACTIVE )
-- {
-- zones[i] = new Zone( monitor, Id, Name, polygon );
-- }
-- else
-- {
-- zones[i] = new Zone( monitor, Id, Name, (Zone::ZoneType)Type, polygon, AlarmRGB, (Zone::CheckMethod)CheckMethod, MinPixelThreshold, MaxPixelThreshold, MinAlarmPixels, MaxAlarmPixels, Coord( FilterX, FilterY ), MinFilterPixels, MaxFilterPixels, MinBlobPixels, MaxBlobPixels, MinBlobs, MaxBlobs, OverloadFrames);
-- }
++if ( atoi(dbrow[2]) == Zone::INACTIVE )
++ {
++ zones[i] = new Zone( monitor, Id, Name, polygon );
++ }
++ else
++ {
++ zones[i] = new Zone( monitor, Id, Name, (Zone::ZoneType)Type, polygon, AlarmRGB, (Zone::CheckMethod)CheckMethod, MinPixelThreshold, MaxPixelThreshold, MinAlarmPixels, MaxAlarmPixels, Coord( FilterX, FilterY ), MinFilterPixels, MaxFilterPixels, MinBlobPixels, MaxBlobPixels, MinBlobs, MaxBlobs, OverloadFrames,TimeStart,TimeEnd);
++ }
Now the final code:
In file zm_monitor.cpp
unsigned int Monitor::DetectMotion( const Image &comp_image, Event::StringSet &zoneSet )
{
bool alarm = false;
unsigned int score = 0;
++ bool ZoneTimeFlag;
zone->ClearAlarm();
++ ZoneTimeFlag=zone->TimeFlag() ;
if ( !zone->IsInactive() )
{
continue;
}
++ if ( !ZoneTimeFlag )
++ {
++ {
++ continue;
++ }
Debug( 3, "Blanking inactive zone %s", zone->Label() );
AND:
Zone *zone = zones[n_zone];
++ ZoneTimeFlag=zone->TimeFlag() ;
if ( !zone->IsPreclusive() )
{
continue;
}
++ if ( !ZoneTimeFlag )
++ {
++ continue;
++ }
Debug( 3, "Checking preclusive zone %s", zone->Label() );
AND:
Zone *zone = zones[n_zone];
++ ZoneTimeFlag=zone->TimeFlag() ;
if (!zone->IsActive() )
{
continue;
}
++ if ( !ZoneTimeFlag )
++ {
++
++ continue;
++ }
Debug( 3, "Checking active zone %s", zone->Label() );
AND:
Zone *zone = zones[n_zone];
++ ZoneTimeFlag=zone->TimeFlag() ;
if (!zone->IsInclusive() )
{
continue;
}
++ if ( !ZoneTimeFlag )
++ {
++
++ continue;
++ }
Debug( 3, "Checking inclusive zone %s", zone->Label() );
LASTLY:
Zone *zone = zones[n_zone];
++ ZoneTimeFlag=zone->TimeFlag() ;
if (!zone->IsExclusive() )
{
continue;
}
++ if ( !ZoneTimeFlag )
++ {
++
++ continue;
++ }
Debug( 3, "Checking exclusive zone %s", zone->Label() );
Run And Enjoy
Dennis A. Vitali
vitali@snet.net
P.s.
Have not yet did or yet understand the sql upfdate files for older databases,
thats why i added my stuff to zm_create.sql!
Activity