-
-
Notifications
You must be signed in to change notification settings - Fork 483
/
Copy pathHandTrackingGraph.cs
131 lines (98 loc) · 4.66 KB
/
HandTrackingGraph.cs
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
using Mediapipe;
using System.Collections.Generic;
using UnityEngine;
public class HandTrackingGraph : DemoGraph {
[SerializeField] private bool useGPU = true;
private const string handednessStream = "handedness";
private OutputStreamPoller<ClassificationList> handednessStreamPoller;
private ClassificationListPacket handednessPacket;
private const string handRectStream = "hand_rect";
private OutputStreamPoller<NormalizedRect> handRectStreamPoller;
private NormalizedRectPacket handRectPacket;
private const string handLandmarksStream = "hand_landmarks";
private OutputStreamPoller<NormalizedLandmarkList> handLandmarksStreamPoller;
private NormalizedLandmarkListPacket handLandmarksPacket;
private const string palmDetectionsStream = "palm_detections";
private OutputStreamPoller<List<Detection>> palmDetectionsStreamPoller;
private DetectionVectorPacket palmDetectionsPacket;
private const string palmDetectionsPresenceStream = "palm_detections_presence";
private OutputStreamPoller<bool> palmDetectionsPresenceStreamPoller;
private BoolPacket palmDetectionsPresencePacket;
private GameObject annotation;
void Awake() {
annotation = GameObject.Find("HandTrackingAnnotation");
}
public override Status StartRun(SidePacket sidePacket) {
handednessStreamPoller = graph.AddOutputStreamPoller<ClassificationList>(handednessStream).ConsumeValue();
handednessPacket = new ClassificationListPacket();
handRectStreamPoller = graph.AddOutputStreamPoller<NormalizedRect>(handRectStream).ConsumeValue();
handRectPacket = new NormalizedRectPacket();
handLandmarksStreamPoller = graph.AddOutputStreamPoller<NormalizedLandmarkList>(handLandmarksStream).ConsumeValue();
handLandmarksPacket = new NormalizedLandmarkListPacket();
palmDetectionsStreamPoller = graph.AddOutputStreamPoller<List<Detection>>(palmDetectionsStream).ConsumeValue();
palmDetectionsPacket = new DetectionVectorPacket();
palmDetectionsPresenceStreamPoller = graph.AddOutputStreamPoller<bool>(palmDetectionsPresenceStream).ConsumeValue();
palmDetectionsPresencePacket = new BoolPacket();
return graph.StartRun(sidePacket);
}
public override void RenderOutput(WebCamScreenController screenController, Color32[] pixelData) {
var handTrackingValue = FetchNextHandTrackingValue();
RenderAnnotation(screenController, handTrackingValue);
var texture = screenController.GetScreen();
texture.SetPixels32(pixelData);
texture.Apply();
}
private HandTrackingValue FetchNextHandTrackingValue() {
var handedness = FetchNextHandedness();
var handLandmarks = FetchNextHandLandmarks();
var handRect = FetchNextHandRect();
if (!FetchNextPalmDetectionsPresence()) {
return new HandTrackingValue(handedness, handLandmarks, handRect);
}
var palmDetections = FetchNextPalmDetections();
return new HandTrackingValue(handedness, handLandmarks, handRect, palmDetections);
}
private ClassificationList FetchNextHandedness() {
if (!handednessStreamPoller.Next(handednessPacket)) {
Debug.LogWarning($"Failed to fetch next packet from {handednessStream}");
return null;
}
return handednessPacket.GetValue();
}
private NormalizedRect FetchNextHandRect() {
if (!handRectStreamPoller.Next(handRectPacket)) {
Debug.LogWarning($"Failed to fetch next packet from {handRectStream}");
return null;
}
return handRectPacket.GetValue();
}
private NormalizedLandmarkList FetchNextHandLandmarks() {
if (!handLandmarksStreamPoller.Next(handLandmarksPacket)) {
Debug.LogWarning($"Failed to fetch next packet from {handLandmarksStream}");
return null;
}
return handLandmarksPacket.GetValue();
}
private bool FetchNextPalmDetectionsPresence() {
if (!palmDetectionsPresenceStreamPoller.Next(palmDetectionsPresencePacket)) {
Debug.LogWarning($"Failed to fetch next packet from {palmDetectionsPresenceStream}");
return false;
}
return palmDetectionsPresencePacket.GetValue();
}
private List<Detection> FetchNextPalmDetections() {
if (!palmDetectionsStreamPoller.Next(palmDetectionsPacket)) {
Debug.LogWarning($"Failed to fetch next packet from {palmDetectionsStream}");
return new List<Detection>();
}
return palmDetectionsPacket.GetValue();
}
private void RenderAnnotation(WebCamScreenController screenController, HandTrackingValue value) {
// NOTE: input image is flipped
annotation.GetComponent<HandTrackingAnnotationController>().Draw(
screenController.transform, value.Handedness, value.HandLandmarkList, value.HandRect, value.PalmDetections, true);
}
public override bool shouldUseGPU() {
return useGPU;
}
}