Esempio n. 1
0
        private double GetSizeDifferencePercentage(YoloTrackingItemExtended item1, YoloItem item2)
        {
            var area1 = item1.Width * item1.Height;
            var area2 = item2.Width * item2.Height;

            if (area1 == area2)
            {
                return(0);
            }

            if (area1 > area2)
            {
                var change1 = 100.0 * area2 / area1;
                return(100 - change1);
            }

            var change = 100.0 * area1 / area2;

            return(100 - change);
        }
Esempio n. 2
0
        public IEnumerable <YoloTrackingItem> Analyse(IEnumerable <YoloItem> items)
        {
            _processIndex++;

            if (_trackingItems.Count == 0)
            {
                foreach (var item in items)
                {
                    var trackingItem = new YoloTrackingItemExtended(item, GetObjectId());
                    _trackingItems.Add(trackingItem.ObjectId, trackingItem);
                }

                return(new YoloTrackingItem[0]);
            }

            var trackingItems = new List <YoloTrackingItem>();

            foreach (var item in items)
            {
                var bestMatch = _trackingItems.Values.Select(o => new
                {
                    Item = o,
                    DistancePercentage = DistancePercentage(o.Center(), item.Center()),
                    SizeDifference     = GetSizeDifferencePercentage(o, item)
                })
                                .Where(o => !trackingItems.Select(x => x.ObjectId).Contains(o.Item.ObjectId) && o.DistancePercentage <= 15 && o.SizeDifference < 30)
                                .OrderBy(o => o.DistancePercentage)
                                .FirstOrDefault();

                if (bestMatch == null || bestMatch.Item.ProcessIndex + 25 < _processIndex)
                {
                    var trackingItem1 = new YoloTrackingItemExtended(item, GetObjectId())
                    {
                        ProcessIndex = _processIndex
                    };

                    _trackingItems.Add(trackingItem1.ObjectId, trackingItem1);
                    continue;
                }

                bestMatch.Item.X            = item.X;
                bestMatch.Item.Y            = item.Y;
                bestMatch.Item.Width        = item.Width;
                bestMatch.Item.Height       = item.Height;
                bestMatch.Item.ProcessIndex = _processIndex;
                bestMatch.Item.IncreaseTrackingConfidence();

                if (bestMatch.Item.TrackingConfidence >= 60)
                {
                    var trackingItem = new YoloTrackingItem(item, bestMatch.Item.ObjectId);
                    trackingItems.Add(trackingItem);
                }
            }

            var itemsWithoutHits = _trackingItems.Values.Where(o => o.ProcessIndex != _processIndex);

            foreach (var item in itemsWithoutHits)
            {
                item.DecreaseTrackingConfidence();
            }

            return(trackingItems);
        }