public static AreaOfInterest GetArea(RegistryKey camKey, Guid areaID) { using (RegistryKey key = camKey.OpenSubKey(areaID.ToString())) { int x = (int)key.GetValue("x"); int y = (int)key.GetValue("y"); int width = (int)key.GetValue("width"); int height = (int)key.GetValue("height"); Rectangle rect = new Rectangle(x, y, width, height); AreaOfInterest area = new AreaOfInterest( areaID, (string)key.GetValue("AreaName"), (AOIType)Enum.Parse(typeof(AOIType), (string)key.GetValue("AOIType")), rect, (int)key.GetValue("OriginalXResolution"), (int)key.GetValue("OriginalYResolution"), (MovementType)Enum.Parse(typeof(MovementType), (string)key.GetValue("MovementType")), GetNotificationOption(key), GetCharacteristics(key) ); return(area); } }
public static void DeleteArea(string cameraPath, string cameraPrefix, AreaOfInterest area) { using (RegistryKey camKey = FindCameraKey(cameraPath, cameraPrefix)) { camKey.DeleteSubKey(area.ID.ToString()); } }
public static void SaveArea(AreaOfInterest area) { using (RegistryKey key = FindCameraKey(GetGlobalString("CurrentCameraPath"), GetGlobalString("CurrentCameraPrefix"))) { SaveArea(key, area); } }
public static async Task Publish(string camera, AreaOfInterest area, Frame frame, InterestingObject io) { bool result = true; _loggedError = false; _loggedNotConnected = false; if (area != null && frame != null) { string baseTopic = Storage.GetGlobalString("MQTTMotionTopic"); baseTopic = baseTopic.Replace("{Camera}", camera); baseTopic = baseTopic.Replace("{Area}", area.AOIName); baseTopic = baseTopic.Replace("{Motion}", "on"); string topic = baseTopic; topic = topic.Replace("{Object}", io.FoundObject.Label); string payload = Storage.GetGlobalString("MQTTMotionPayload"); payload = payload.Replace("{File}", frame.Item.PendingFile); payload = payload.Replace("{Confidence}", ((int)(io.FoundObject.Confidence * 100.0)).ToString()); if (payload.Contains("{Image}")) { payload = payload.Replace("{Image}", LoadImage(frame.Item.PendingFile)); } payload = payload.Replace("{Object}", io.FoundObject.Label); payload = payload.Replace("{Motion}", "on"); await SendToServer(topic, payload).ConfigureAwait(false); } }
public static void SaveArea(string cameraPath, string cameraPrefix, AreaOfInterest area) { using (RegistryKey camKey = FindCameraKey(cameraPath, cameraPrefix)) { SaveArea(camKey, area); } }
public static void DeleteArea(string cameraPath, string cameraPrefix, AreaOfInterest area) { if (!string.IsNullOrEmpty(cameraPath) && !string.IsNullOrEmpty(cameraPrefix) && area != null) { using (RegistryKey camKey = FindCameraKey(cameraPath, cameraPrefix)) { camKey.DeleteSubKey(area.ID.ToString()); } } }
public static void SaveArea(CameraData cam, AreaOfInterest area) { using (RegistryKey cameraKey = FindCameraKey(cam.Path, cam.CameraPrefix)) { if (null != cameraKey) { SaveArea(cameraKey, area); } } }
// Copy constructor for an area. public AreaOfInterest(AreaOfInterest src) { ID = src.ID; // AOIName = src.AOIName; AOIType = src.AOIType; AreaRect = src.AreaRect; OriginalXResolution = src.OriginalXResolution; OriginalYResolution = src.OriginalYResolution; MovementType = src.MovementType; Notifications = new AreaNotificationOption(src.Notifications); SearchCriteria = new List <ObjectCharacteristics>(src.SearchCriteria); }
private void OnActivate(object sender, EventArgs e) { ListViewItem item = areasListView.SelectedItems[0]; AreaOfInterest area = (AreaOfInterest)item.Tag; AreaOfInterest adjustedArea = new AreaOfInterest(area); if (area.OriginalXResolution != BitmapResolution.XResolution || area.OriginalYResolution != BitmapResolution.YResolution) { // OK, we are editing an area at a resolution we did not create it at. // Therefore, we need to adjust the area so we can edit it. adjustedArea.AreaRect = area.GetRect(); adjustedArea.OriginalXResolution = BitmapResolution.XResolution; adjustedArea.OriginalYResolution = BitmapResolution.YResolution; } using (CreateAOI dlg = new CreateAOI(adjustedArea)) { DialogResult result = dlg.ShowDialog(); if (dlg.DeleteItem) { _areas.Remove(area.ID); areasListView.Items.RemoveAt(areasListView.SelectedIndices[0]); area.Dispose(); // the original area adjustedArea.Dispose(); // the copy } else if (result == DialogResult.OK) { item.Text = adjustedArea.AOIName; // it may have changed. item.Tag = adjustedArea; area.AreaRect = adjustedArea.GetRect(); item.SubItems[1].Text = adjustedArea.GetRect().X.ToString(); item.SubItems[2].Text = adjustedArea.GetRect().Y.ToString(); item.SubItems[3].Text = adjustedArea.GetRect().Width.ToString(); item.SubItems[4].Text = adjustedArea.GetRect().Height.ToString(); _areas.UpdateArea(adjustedArea); area.Dispose(); // the original, unmodified one _areas.Save(); } else if (result == DialogResult.Yes) { // An artificial response indicating we should edit an area of interest EditAreaID = adjustedArea.ID; _areas.UpdateArea(adjustedArea); _areas.Save(); area.Dispose(); // the original unmodified one DialogResult = DialogResult.Yes; Close(); } } }
static int ObjectToAreaOverlap(ImageObject imageObject, AreaOfInterest area) { int overlap; int objectArea = imageObject.ObjectRectangle.Width * imageObject.ObjectRectangle.Height; _ = area.GetRect().Width *area.GetRect().Height; Rectangle intersect = Rectangle.Intersect(imageObject.ObjectRectangle, area.GetRect()); int intersectArea = intersect.Width * intersect.Height; double percentage = (100.0 * intersectArea) / objectArea; overlap = (int)Math.Round(percentage); return(overlap); }
public NotificationOptionsDialog(AreaOfInterest area) { _area = area; InitializeComponent(); int count = 0; if (area.Notifications != null && area.Notifications.Urls != null) { foreach (var urlOptions in area.Notifications.Urls) { ListViewItem urlItem = new ListViewItem(new string[] { urlOptions.Url, urlOptions.WaitTime.ToString(), urlOptions.CoolDown.CooldownTime.ToString() }); urlsList.Items.Add(urlItem); urlItem.Tag = urlOptions; ++count; } if (urlsList.Items.Count > 0) { urlsList.Items[0].Selected = true; urlsList.Select(); } NoMotionUrlNotify.Text = area.Notifications.NoMotionUrlNotify; NoMotionMQTTCheck.Checked = area.Notifications.NoMotionMQTTNotify; UseMQTTBox.Checked = area.Notifications.UseMQTT; } count = 0; if (area.Notifications.Email != null) { foreach (var address in area.Notifications.Email) { ListViewItem emailItem = new ListViewItem(address); emailsList.Items.Add(emailItem); ++count; } if (emailsList.Items.Count > 0) { emailsList.Items[0].Selected = true; emailsList.Select(); } } UseMQTTBox.Checked = area.Notifications.UseMQTT; }
public static SortedDictionary <Guid, AreaOfInterest> GetAllAreas(string cameraPath, string cameraPrefix) { SortedDictionary <Guid, AreaOfInterest> areas = new SortedDictionary <Guid, AreaOfInterest>(); using (RegistryKey camKey = FindCameraKey(cameraPath, cameraPrefix)) { if (null != camKey) { foreach (var areaID in camKey.GetSubKeyNames()) // A GUID { AreaOfInterest area = GetArea(camKey, Guid.Parse(areaID)); areas.Add(area.ID, area); } } } return(areas); }
public static void SaveArea(RegistryKey camKey, AreaOfInterest area) { camKey.DeleteSubKeyTree(area.ID.ToString(), false); using (RegistryKey key = camKey.CreateSubKey(area.ID.ToString(), true)) { key.SetValue("x", area.AreaRect.X, RegistryValueKind.DWord); key.SetValue("y", area.AreaRect.Y, RegistryValueKind.DWord); key.SetValue("width", area.AreaRect.Width, RegistryValueKind.DWord); key.SetValue("height", area.AreaRect.Height, RegistryValueKind.DWord); key.SetValue("AreaName", area.AOIName, RegistryValueKind.String); key.SetValue("AOIType", area.AOIType.ToString(), RegistryValueKind.String); key.SetValue("OriginalXResolution", area.OriginalXResolution, RegistryValueKind.DWord); key.SetValue("OriginalYResolution", area.OriginalYResolution, RegistryValueKind.DWord); key.SetValue("MovementType", area.MovementType.ToString(), RegistryValueKind.String); SaveNotificationOption(key, area.Notifications); SaveCharacteristcs(key, area.SearchCriteria); } }
public CreateAOI(Rectangle imageRect, Point zoneFocus, int xResolution, int yResolution) // The area on the actual image, not the display image { InitializeComponent(); Area = new AreaOfInterest { ZoneFocus = zoneFocus, OriginalXResolution = xResolution, OriginalYResolution = yResolution, }; _rectangle = imageRect; doorButton.Checked = true; anyActivityButton.Checked = true; if (imageRect.X < -5000) { imageRect.X = -5000; } if (imageRect.Y < -5000) { imageRect.Y = -5000; } xNumeric.Value = imageRect.X; yNumeric.Value = imageRect.Y; widthNumeric.Value = imageRect.Width; heighNumeric.Value = imageRect.Height; OriginalXResolution = xResolution; OriginalYResolution = yResolution; if (!Storage.GetGlobalBool("EmailSetup")) { MessageBox.Show("In order to set Areas of Interest you must first set your email contact information. This is a one time only requirement."); using (OutgoingEmailDialog dlg = new OutgoingEmailDialog()) { dlg.ShowDialog(); } } }
public static async Task Publish(string camera, AreaOfInterest area, Frame frame) { string baseTopic = Settings.Default.MQTTMotionTopic; baseTopic = baseTopic.Replace("{Camera}", camera); baseTopic = baseTopic.Replace("{Area}", area.AOIName); baseTopic = baseTopic.Replace("{Motion}", "on"); foreach (InterestingObject io in frame.Interesting) { string topic = baseTopic; topic = topic.Replace("{Object}", io.FoundObject.Label); string payload = Settings.Default.MQTTMotionPayload; payload = payload.Replace("{File}", frame.Item.PendingFile); payload = payload.Replace("{Confidence}", ((int)(io.FoundObject.Confidence * 100.0)).ToString()); payload = payload.Replace("{Image}", LoadImage(frame.Item.PendingFile)); payload = payload.Replace("{Object}", io.FoundObject.Label); payload = payload.Replace("{Motion}", "on"); await Publish(topic, payload).ConfigureAwait(false); } }
public CreateAOI(AreaOfInterest area) // The area on the actual image, not the display image { InitializeComponent(); Area = area; if (area != null) { _rectangle = area.AreaRect; Area.ZoneFocus = area.ZoneFocus; Rectangle rect = area.AreaRect; doorButton.Checked = true; anyActivityButton.Checked = true; OriginalXResolution = area.OriginalXResolution; OriginalYResolution = area.OriginalYResolution; if (rect.X > 5000) { rect.X = 5000; } if (rect.Y > 3000) { rect.Y = 3000; } if (rect.X < -5000) { rect.X = -5000; } if (rect.Y < -5000) { rect.Y = -5000; } xNumeric.Value = rect.X; yNumeric.Value = rect.Y; widthNumeric.Value = rect.Width; heighNumeric.Value = rect.Height; aoiNameText.Text = area.AOIName; switch (area.AOIType) { case AOIType.Door: doorButton.Checked = true; break; case AOIType.PeopleWalking: peopleWalkingButton.Checked = true; break; case AOIType.GarageDoor: garageButton.Checked = true; break; case AOIType.Driveway: drivewayButton.Checked = true; break; case AOIType.IgnoreObjects: ignoreButton.Checked = true; break; } switch (area.MovementType) { case MovementType.AnyActivity: anyActivityButton.Checked = true; break; case MovementType.Arrival: arrivingButton.Checked = true; break; case MovementType.Departure: departingButton.Checked = true; break; } if (null != area.SearchCriteria) { foreach (ObjectCharacteristics obj in area.SearchCriteria) { ListViewItem item = new ListViewItem(new string[] { obj.ObjectType.ToString(), obj.Confidence.ToString(), obj.MinPercentOverlap.ToString(), obj.MinimumXSize.ToString(), obj.MinimumYSize.ToString(), obj.TimeFrame.ToString() }); ObjectsListView.Items.Add(item); item.Tag = obj; } } } }
public CreateAOI(AreaOfInterest area) // The area on the actual image, not the display image { InitializeComponent(); Area = area; _rectangle = area.AreaRect; Area.ZoneFocus = area.ZoneFocus; Rectangle rect = area.AreaRect; doorButton.Checked = true; anyActivityButton.Checked = true; OriginalXResolution = area.OriginalXResolution; OriginalYResolution = area.OriginalYResolution; if (rect.X < -5000) { rect.X = -5000; } if (rect.Y < -5000) { rect.Y = -5000; } xNumeric.Value = rect.X; yNumeric.Value = rect.Y; widthNumeric.Value = rect.Width; heighNumeric.Value = rect.Height; aoiNameText.Text = area.AOIName; switch (area.AOIType) { case AOIType.Door: doorButton.Checked = true; break; case AOIType.PeopleWalking: peopleWalkingButton.Checked = true; break; case AOIType.GarageDoor: garageButton.Checked = true; break; case AOIType.Driveway: drivewayButton.Checked = true; break; case AOIType.IgnoreObjects: ignoreButton.Checked = true; break; } switch (area.MovementType) { case MovementType.AnyActivity: anyActivityButton.Checked = true; break; case MovementType.Arrival: arrivingButton.Checked = true; break; case MovementType.Departure: departingButton.Checked = true; break; } if (null != area.SearchCriteria) { foreach (ObjectCharacteristics obj in area.SearchCriteria) { switch (obj.ObjectType) { case ImageObjectType.People: peopleCheck.Checked = true; peopleConfidenceNumeric.Value = obj.Confidence; peopleMinimumOverlap.Value = obj.MinPercentOverlap; peopleFramesNumeric.Value = obj.TimeFrame; peopleMinXNumeric.Value = obj.MinimumXSize; peopleMinYNumeric.Value = obj.MinimumYSize; break; case ImageObjectType.Cars: carsCheck.Checked = true; carsConfidenceNumeric.Value = obj.Confidence; carsOverlapNumeric.Value = obj.MinPercentOverlap; carsFramesNumeric.Value = obj.TimeFrame; carsMinXNumeric.Value = obj.MinimumXSize; carsMinYNumeric.Value = obj.MinimumYSize; break; case ImageObjectType.Motorcycles: motorcycleCheck.Checked = true; motorcyclesConfidenceNumeric.Value = obj.Confidence; motorcyclesOverlapNumeric.Value = obj.MinPercentOverlap; motorcyclesFramesNumeric.Value = obj.TimeFrame; motorcyclesMinXNumeric.Value = obj.MinimumXSize; motorcyclesMinYNumeric.Value = obj.MinimumYSize; break; case ImageObjectType.Trucks: truckCheck.Checked = true; trucksConfidenceNumeric.Value = obj.Confidence; trucksOverlapNumeric.Value = obj.MinPercentOverlap; trucksFramesNumeric.Value = obj.TimeFrame; trucksMinXNumeric.Value = obj.MinimumXSize; trucksMinYNumeric.Value = obj.MinimumYSize; break; case ImageObjectType.Bikes: bikeCheck.Checked = true; bikesConfidenceNumeric.Value = obj.Confidence; bikesOverlapNumeric.Value = obj.MinPercentOverlap; bikesFramesNumeric.Value = obj.TimeFrame; bikesMinXNumeric.Value = obj.MinimumXSize; bikesMinYNumeric.Value = obj.MinimumYSize; break; case ImageObjectType.Bears: bearsCheck.Checked = true; bearsConfidenceNumeric.Value = obj.Confidence; bearsOverlapNumeric.Value = obj.MinPercentOverlap; bearsFramesNumeric.Value = obj.TimeFrame; bearsMinXNumeric.Value = obj.MinimumXSize; bearsMinYNumeric.Value = obj.MinimumXSize; break; case ImageObjectType.Animals: animalsCheck.Checked = true; animalsConfidenceNumeric.Value = obj.Confidence; animalsOverlapNumeric.Value = obj.MinPercentOverlap; animalsFramesNumeric.Value = obj.TimeFrame; animalsMinXNumeric.Value = obj.MinimumXSize; animalsMinYNumeric.Value = obj.MinimumXSize; break; } } } }
public InterestingObject(AreaOfInterest area, ImageObject found, int overlap) { Area = area; FoundObject = found; Overlap = overlap; }