/// <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;
 }
Exemple #2
0
        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++;
                }
            }
        }
Exemple #3
0
 /// <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);
        }
Exemple #5
0
 public SpectroscopyStarTracker(TrackedObjectConfig starConfig)
 {
     TrackedStar = new TrackedObject(0, starConfig);
     TrackedStar.LastKnownGoodPosition = new ImagePixel(starConfig.ApertureStartingX, starConfig.ApertureStartingY);
 }
Exemple #6
0
 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);
            }
        }