This repository was archived by the owner on Mar 12, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 10
Expand file tree
/
Copy pathObjectTrackingService.cs
More file actions
153 lines (138 loc) · 6.27 KB
/
Copy pathObjectTrackingService.cs
File metadata and controls
153 lines (138 loc) · 6.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using JetBrains.Annotations;
using LabAssistVision;
using Microsoft.MixedReality.Toolkit.Utilities;
using OpenCVForUnity.CoreModule;
using UnityEngine;
using UnityEngine.Assertions;
using Debug = UnityEngine.Debug;
namespace Microsoft.MixedReality.Toolkit.Extensions
{
[MixedRealityExtensionService(SupportedPlatforms.WindowsStandalone | SupportedPlatforms.WindowsUniversal)]
public class ObjectTrackingService : BaseExtensionService, IObjectTrackingService, IMixedRealityExtensionService
{
public List<TrackedObject> TrackedObjects => new List<TrackedObject>(_trackedObjects);
protected IObjectTracker ObjectTracker;
private readonly Logger _logger;
private readonly ObjectTrackingServiceProfile _objectTrackingServiceProfile;
private List<TrackedObject> _trackedObjects = new List<TrackedObject>();
public ObjectTrackingService(string name, uint priority, BaseMixedRealityProfile profile) : base(name, priority, profile)
{
if (profile == null) throw new ArgumentNullException(nameof(profile));
_objectTrackingServiceProfile = profile as ObjectTrackingServiceProfile;
if (_objectTrackingServiceProfile == null) throw new ArgumentNullException(nameof(_objectTrackingServiceProfile));
Initialize(_objectTrackingServiceProfile.tracker);
_logger = new Logger(new LogHandler());
Assert.IsNotNull(_logger);
}
private void Initialize(Tracker tracker)
{
switch (tracker)
{
case Tracker.MosseTracker:
ObjectTracker = new MosseTracker();
break;
case Tracker.KCFTracker:
ObjectTracker = new KCFTracker();
break;
case Tracker.BoostingTracker:
ObjectTracker = new BoostingTracker();
break;
case Tracker.CSRTTracker:
ObjectTracker = new CSRTTracker();
break;
case Tracker.MedianFlowTracker:
ObjectTracker = new MedianFlowTracker();
break;
case Tracker.TLDTracker:
ObjectTracker = new TLDTracker();
break;
case Tracker.MILTracker:
ObjectTracker = new MILTracker();
break;
default:
throw new ArgumentException("Tracker not implemented");
}
}
public void SwitchTracker(Tracker tracker)
{
ObjectTracker.Reset();
_trackedObjects = new List<TrackedObject>();
Initialize(tracker);
}
public override void Reset()
{
ObjectTracker.Reset();
_trackedObjects = new List<TrackedObject>();
base.Reset();
}
public Vector2 unprojectionOffset => _objectTrackingServiceProfile.unprojectionOffset;
public int FixedTrackerCount => _objectTrackingServiceProfile.fixedTrackerCount;
public bool ForceFixedTrackerCount => _objectTrackingServiceProfile.forceFixedTrackerCount;
public void ToggleFixedTrackerCount()
{
_objectTrackingServiceProfile.forceFixedTrackerCount = !_objectTrackingServiceProfile.forceFixedTrackerCount;
Debug.Log($"Switched force fixed tracker count to {_objectTrackingServiceProfile.forceFixedTrackerCount}");
}
public void ChangeFixedTrackerCount(int value)
{
_objectTrackingServiceProfile.fixedTrackerCount = value;
}
private Stopwatch stopWatch = new Stopwatch();
public List<TrackedObject> TrackSync(CameraFrame frame)
{
if (frame == null) throw new ArgumentNullException(nameof(frame));
stopWatch.Reset();
stopWatch.Start();
List<TrackedObject> trackedObjects = ObjectTracker.Update(frame);
stopWatch.Stop();
FPSUtils.TrackTick();
_trackedObjects = trackedObjects;
return trackedObjects;
}
public List<TrackedObject> InitializeTrackers(List<DetectedObject> detectedObjects)
{
if (detectedObjects == null) throw new ArgumentNullException(nameof(detectedObjects));
List<TrackedObject> trackedObjects = new List<TrackedObject>();
if (_objectTrackingServiceProfile.forceFixedTrackerCount)
{
Debug.Log("Initializing trackers using fixed amount of trackers. Selecting Detection with highest probability");
DetectedObject detectedObject = detectedObjects.OrderByDescending(o => o.Probability).FirstOrDefault();
if (detectedObject == null)
{
_logger.LogWarning("No object detected");
return trackedObjects;
}
List<DetectedObject> clones = new List<DetectedObject>();
for (int i = 0; i < FixedTrackerCount; i++)
{
clones.Add(new DetectedObject(detectedObject));
}
trackedObjects.AddRange(clones.Select(InitializeTracker));
}
else
{
trackedObjects.AddRange(detectedObjects.Select(InitializeTracker));
}
_trackedObjects = trackedObjects;
return trackedObjects;
}
[NotNull]
private TrackedObject InitializeTracker([NotNull] CameraFrame frame, [NotNull] Rect2d rect, [NotNull] string label)
{
if (frame == null) throw new ArgumentNullException(nameof(frame));
if (rect == null) throw new ArgumentNullException(nameof(rect));
if (label == null) throw new ArgumentNullException(nameof(label));
return ObjectTracker.Initialize(frame, rect, label);
}
[NotNull]
private TrackedObject InitializeTracker([NotNull] DetectedObject detectedObject)
{
if (detectedObject == null) throw new ArgumentNullException(nameof(detectedObject));
return InitializeTracker(detectedObject.Frame, detectedObject.Rect, detectedObject.Label);
}
}
}