/// <summary> /// Initializes a new instance of the <see cref="RuleContext"/> class. /// </summary> /// <param name="trackedObject">The tracked object.</param> /// <param name="rule">The rule to apply.</param> public RuleContext(TrackedObject trackedObject, IRule rule) { TrackedObject = trackedObject; Rule = rule; Message = rule.ErrorMessage; Success = false; }
private void updateTrackedObjects(List <Rect> detectedObjects) { int N1 = (int)trackedObjects.Count; int N2 = (int)detectedObjects.Count; for (int i = 0; i < N1; i++) { trackedObjects [i].numDetectedFrames++; } int[] correspondence = new int[N2]; for (int i = 0; i < N2; i++) { correspondence [i] = (int)TrackedState.NEW_RECTANGLE; } for (int i = 0; i < N1; i++) { TrackedObject curObject = trackedObjects [i]; int bestIndex = -1; int bestArea = -1; int numpositions = (int)curObject.lastPositions.Count; //if (numpositions > 0) UnityEngine.Debug.LogError("numpositions > 0 is false"); Rect prevRect = curObject.lastPositions [numpositions - 1]; for (int j = 0; j < N2; j++) { if (correspondence [j] >= 0) { //Debug.Log("DetectionBasedTracker::updateTrackedObjects: j=" + i + " is rejected, because it has correspondence=" + correspondence[j]); continue; } if (correspondence [j] != (int)TrackedState.NEW_RECTANGLE) { //Debug.Log("DetectionBasedTracker::updateTrackedObjects: j=" + j + " is rejected, because it is intersected with another rectangle"); continue; } Rect r = Intersect(prevRect, detectedObjects [j]); if ((r.width > 0) && (r.height > 0)) { //LOGD("DetectionBasedTracker::updateTrackedObjects: There is intersection between prevRect and detectedRect, r={%d, %d, %d x %d}", // r.x, r.y, r.width, r.height); correspondence [j] = (int)TrackedState.INTERSECTED_RECTANGLE; if (r.area() > bestArea) { //LOGD("DetectionBasedTracker::updateTrackedObjects: The area of intersection is %d, it is better than bestArea=%d", r.area(), bestArea); bestIndex = j; bestArea = (int)r.area(); } } } if (bestIndex >= 0) { //LOGD("DetectionBasedTracker::updateTrackedObjects: The best correspondence for i=%d is j=%d", i, bestIndex); correspondence [bestIndex] = i; for (int j = 0; j < N2; j++) { if (correspondence [j] >= 0) { continue; } Rect r = Intersect(detectedObjects [j], detectedObjects [bestIndex]); if ((r.width > 0) && (r.height > 0)) { //LOGD("DetectionBasedTracker::updateTrackedObjects: Found intersection between " // "rectangles j=%d and bestIndex=%d, rectangle j=%d is marked as intersected", j, bestIndex, j); correspondence [j] = (int)TrackedState.INTERSECTED_RECTANGLE; } } } else { //LOGD("DetectionBasedTracker::updateTrackedObjects: There is no correspondence for i=%d ", i); curObject.numFramesNotDetected++; } } //LOGD("DetectionBasedTracker::updateTrackedObjects: start second cycle"); for (int j = 0; j < N2; j++) { int i = correspondence [j]; if (i >= 0) //add position //Debug.Log("DetectionBasedTracker::updateTrackedObjects: add position"); { trackedObjects [i].lastPositions.Add(detectedObjects [j]); while ((int)trackedObjects [i].lastPositions.Count > (int)innerParameters.numLastPositionsToTrack) { trackedObjects [i].lastPositions.Remove(trackedObjects [i].lastPositions [0]); } trackedObjects [i].numFramesNotDetected = 0; } else if (i == (int)TrackedState.NEW_RECTANGLE) //new object //Debug.Log("DetectionBasedTracker::updateTrackedObjects: new object"); { trackedObjects.Add(new TrackedObject(detectedObjects [j])); } else { Debug.Log("DetectionBasedTracker::updateTrackedObjects: was auxiliary intersection"); } } int t = 0; TrackedObject it; while (t < trackedObjects.Count) { it = trackedObjects [t]; if ((it.numFramesNotDetected > parameters.maxTrackLifetime) || ((it.numDetectedFrames <= innerParameters.numStepsToWaitBeforeFirstShow) && (it.numFramesNotDetected > innerParameters.numStepsToTrackWithoutDetectingIfObjectHasNotBeenShown))) { //int numpos = (int)it.lastPositions.Count; //if (numpos > 0) UnityEngine.Debug.LogError("numpos > 0 is false"); //Rect r = it.lastPositions [numpos - 1]; //Debug.Log("DetectionBasedTracker::updateTrackedObjects: deleted object " + r.x + " " + r.y + " " + r.width + " " + r.height); trackedObjects.Remove(it); } else { t++; } } }
/// <summary> /// Track a change to |obj|. /// </summary> /// <param name="obj"></param> /// <param name="isUndo">If true, the change counter of the object is decremented, /// otherwise incremented.</param> public void Change(object obj, bool isUndo = false) { lock (_trackedObjects) { if (!_trackedObjects.ContainsKey(obj)) { _trackedObjects[obj] = new TrackedObject(); } var entry = _trackedObjects[obj]; entry.TicksOfLastChange = Tick(); entry.CountChanges += (isUndo ? -1 : 1); } }
private void ProcessFrameOnTimerTick(object sender, EventArgs e) { _captureTimer.Stop(); // Get Min and MaxColorRange var minColor = _setting.RgbColorMin; var maxColor = _setting.RgbColorMax; // processed image var imgOriginal = _capture.RetrieveBgrFrame(); imgOriginal = imgOriginal.Flip(FLIP.HORIZONTAL); var imgProcessed = imgOriginal.InRange(new Bgr(minColor.Blue, minColor.Green, minColor.Red), new Bgr(maxColor.Blue, maxColor.Green, maxColor.Red)); imgProcessed = imgProcessed.SmoothGaussian(_setting.GaussianBlur); var circles = imgProcessed.HoughCircles(new Gray(_setting.CannyThreashold), new Gray(_setting.AccumulatorThreashold), 2, imgProcessed.Height / 4f, _setting.MinRadiusDetectedCircles, _setting.MaxRadiusDetectedCircles)[0]; _setting.CollectDataOfObjects = 0; _setting.TrackedObjects.Clear(); foreach (var circle in circles) { _setting.CollectDataOfObjects++; // start by 1 object var tb = new TrackedObject { Id = _setting.CollectDataOfObjects, X = circle.Center.X, Y = circle.Center.Y, Radius = circle.Radius }; /* * _setting.BallPosition = "ball position : x = " + circle.Center.X.ToString().PadLeft(4) + * ", y =" + circle.Center.Y.ToString().PadLeft(4) + * ", radius = " + circle.Radius.ToString("###.000").PadLeft(7); * */ CvInvoke.cvCircle(imgOriginal, new Point((int)circle.Center.X, (int)circle.Center.Y), 3, new MCvScalar(0, 255, 0), -1, LINE_TYPE.CV_AA, 0); var color = _setting.CollectDataOfObjects > 1 ? Color.Blue : Color.Red; imgOriginal.Draw(circle, new Bgr(color), 3); _setting.TrackedObjects.Add(tb); if (_setting.CollectDataOfObjects > 1) { continue; } foreach (var bindValue in _setting.BindValues) { switch (bindValue.OscToValue) { case BindingOscValue.Radius: bindValue.Value = circles[0].Radius; break; case BindingOscValue.X: bindValue.Value = circles[0].Center.X; break; case BindingOscValue.Y: bindValue.Value = circles[0].Center.Y; break; } } } // Set Image to Settings: _setting.OrginalImage = BitmapSourceConvert.ToBitmapSource(imgOriginal); _setting.ProcessedImage = BitmapSourceConvert.ToBitmapSource(imgProcessed); }
public SpectroscopyStarTracker(TrackedObjectConfig starConfig) { TrackedStar = new TrackedObject(0, starConfig); TrackedStar.LastKnownGoodPosition = new ImagePixel(starConfig.ApertureStartingX, starConfig.ApertureStartingY); }
public void SetUpTrackedSceneObject() { // Setup tracked training scene object TrackedTrainingSceneObject = TrackedObject.AddComponent <TrainingSceneObject>(); }
public void CreateDefaultActionMapInputs() { trackedObjectInput = (TrackedObject)CreateActionMapInput(m_TrackedObjectActionMap, null); }
protected override void Attach() { if (!(TrackedObject is IEnumerable)) { throw new ArgumentException($"Failed to track collection changes on object of type {TrackedObject.GetType()}. The object does not implement {nameof(IEnumerable)}."); } TrackedObject.CollectionChanged += OnCollectionChanged; // Scan through the items and create an ObjectTracker // for each item. var i = 0; foreach (var item in TrackedObject as IEnumerable) { InsertTrackerAt(i++, item); } }