public void AnalyzePrediction() { using var Trace = new Trace(); //This c# 8.0 using feature will auto dispose when the function is done. MaskResultInfo result = new MaskResultInfo(); try { if (this._cam.enabled) { if (!string.IsNullOrWhiteSpace(this._cam.triggering_objects_as_string)) { if (this._cam.IsRelevant(this.Label)) { // -> OBJECT IS RELEVANT //if confidence limits are satisfied bool OverrideThreshold = this._cururl != null && (this._cururl.Threshold_Lower > 0 || (this._cururl.Threshold_Upper > 0 && this._cururl.Threshold_Upper < 100)); if ((!OverrideThreshold && this.Confidence >= this._cam.threshold_lower && this.Confidence <= this._cam.threshold_upper) || (OverrideThreshold && this.Confidence >= this._cururl.Threshold_Lower && this.Confidence <= this._cururl.Threshold_Upper)) { // -> OBJECT IS WITHIN CONFIDENCE LIMITS //only if the object is outside of the masked area result = AITOOL.Outsidemask(this._cam, this.XMin, this.XMax, this.YMin, this.YMax, this._curimg.Width, this._curimg.Height); this.ImgMaskResult = result.Result; this.ImgMaskType = result.MaskType; this.ImagePointsOutsideMask = result.ImagePointsOutsideMask; if (!result.IsMasked) { this.Result = ResultType.Relevant; } else if (result.MaskType == MaskType.None) //if the object is in a masked area { this.Result = ResultType.NoMask; } else if (result.MaskType == MaskType.Image) //if the object is in a masked area { this.Result = ResultType.ImageMasked; } //check the mask manager if the image mask didnt flag anything if (!result.IsMasked) { //check the dynamic or static masks if (this._cam.maskManager.MaskingEnabled) { ObjectPosition currentObject = new ObjectPosition(this.XMin, this.XMax, this.YMin, this.YMax, this.Label, this._curimg.Width, this._curimg.Height, this._cam.Name, this._curimg.image_path); //creates history and masked lists for objects returned result = this._cam.maskManager.CreateDynamicMask(currentObject); this.DynMaskResult = result.Result; this.DynMaskType = result.MaskType; this.DynamicThresholdCount = result.DynamicThresholdCount; this.PercentMatch = result.PercentMatch; //there is a dynamic or static mask if (result.MaskType == MaskType.Dynamic) { this.Result = ResultType.DynamicMasked; } else if (result.MaskType == MaskType.Static) { this.Result = ResultType.StaticMasked; } } } if (result.Result == MaskResult.Error || result.Result == MaskResult.Unknown) { this.Result = ResultType.Error; Log($"Error: Masking error? '{this._cam.Name}' ('{this.Label}') - DynMaskResult={this.DynMaskResult}, ImgMaskResult={this.ImgMaskResult}", "", this._cam.Name, this._curimg.image_path); } } else //if confidence limits are not satisfied { this.Result = ResultType.NoConfidence; } } else { this.Result = ResultType.UnwantedObject; } } else { Log($"Error: Camera does not have any objects enabled '{this._cam.Name}' ('{this.Label}')", "", this._cam.Name, this._curimg.image_path); this.Result = ResultType.Error; } } else { Log($"Debug: Camera not enabled '{this._cam.Name}' ('{this.Label}')", "", this._cam.Name, this._curimg.image_path); this.Result = ResultType.CameraNotEnabled; } } catch (Exception ex) { Log($"Error: Label '{this.Label}', Camera '{this._cam.Name}': {Global.ExMsg(ex)}", "", this._cam.Name, this._curimg.image_path); this.Result = ResultType.Error; } }