-
Notifications
You must be signed in to change notification settings - Fork 0
/
IdentifiedObject.cs
200 lines (177 loc) · 4.46 KB
/
IdentifiedObject.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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
using System;
using Emgu.CV.Structure;
using System.Drawing;
namespace TangibleUISharp
{
public class IdentifiedObject
{
bool _circle;
bool _square;
double size;
int locX;
int locY;
int ID = 0;
bool[] circleOccurences = new bool[50];
bool[] squareOccurences = new bool[50];
double[] measuredAreas = new double[50];
int arrayPosition = 0;
long lastSeen = 0;
bool isnew = true;
long timeRenewed = -1;
double sizeAcc = 0.80;
Bgr color = new Bgr(0,0,0);
MCvBox2D boundingBox;
public IdentifiedObject (int x, int y, double areaSize, bool isCircle, bool isSquare, int ID, long curTime)
{
timeRenewed = curTime;
lastSeen = curTime;
this._circle = isCircle;
this._square = isSquare;
this.locX = x;
this.locY = y;
this.size = areaSize;
this.ID = ID;
// generate random color
Random random = new Random();
int maxValue = 255;
this.color = new Bgr(random.Next (maxValue),random.Next (maxValue),random.Next (maxValue));
}
public bool isNew ()
{
// if true is returned, processing will have to continue, and do an "upgrade shape" afterwards
return isnew;
}
public bool liesWithin (int x, int y, bool recentlyChanged, int accuracy, long curTime, double curSize)
{
if (recentlyChanged || isnew) {
//be alot less sensitive with x and y
// do a size check only when this is not the case
if (locX - (2 * accuracy) < x && locX + (accuracy * 2) > x) {
if (locY - (2 * accuracy) < y && locY + (accuracy * 2) > y) {
// rough method now, perhaps we can smooth this out in the future
locX = x;
locY = y;
lastSeen = curTime;
size = curSize;
// if x and y are within area
// adjust x and y
// update lastSeen
if (!isnew) {
// wipe data
isnew = true;
// make sure this part is triggered for the next couple of frames
timeRenewed = curTime;
}
return true;
}
return false;
} else {
return false;
}
} else if (locX - accuracy < x && locX + accuracy > x) {
if (locY - accuracy < y && locY + accuracy > y) {
if (curSize > sizeAcc * size && curSize < size / sizeAcc)
{
// rough method now, perhaps we can smooth this out in the future
locX = x;
locY = y;
lastSeen = curTime;
// if x and y are within area
// adjust x and y
// update lastSeen
return true;
}
}
return false;
} else {
return false;
}
}
private bool mostOccurred (bool[] array)
{
int trueCounter = 0;
int falseCounter = 0;
int i = 0;
while (i < 50) {
if (array [i] == null)
break;
else if (array [i]) {
trueCounter ++;
} else {
falseCounter ++;
}
}
return (trueCounter > falseCounter);
}
public bool updateShape (double areaSize, bool isCircle, bool isSquare)
{
if (arrayPosition < 50) {
measuredAreas [arrayPosition] = areaSize;
circleOccurences [arrayPosition] = isCircle;
squareOccurences [arrayPosition] = isSquare;
if (this.mostOccurred (circleOccurences))
this._circle = true;
else if (this.mostOccurred (squareOccurences))
this._square = true;
int j = 0;
double totalArea = 0;
while (j < arrayPosition) {
j++;
totalArea += areaSize;
}
if (arrayPosition != 0)
this.size = totalArea / arrayPosition;
else
this.size = areaSize;
// calculate median etc.
arrayPosition++;
return true;
}
// got plenty of data already! no need to update position
else
return false;
}
public bool updateBoundingBox (MCvBox2D box)
{
// this is for determining orientation of square objects
// we'll get this done in M5 or later
this.boundingBox = box;
return true;
}
public MCvBox2D getBoundingBox ()
{
// we'll get this done in M5 or later
return boundingBox;
}
public Bgr getColor()
{
return color;
}
public Point getPosition (long curTime)
{
if (curTime - timeRenewed > 1000) {
isnew = false;
}
// if seen in the last 1 second
if (curTime - lastSeen < 1000) {
return new Point (locX, locY);
} else {
//Console.WriteLine ("(internal) marked for removal");
return new Point(-1,-1);
}
}
public override string ToString ()
{
return (locX + "=x," + locY + "=y,circle=" + _circle + ", square=" +_square);
}
public string getShape ()
{
if (_circle)
return "circle";
else if (_square)
return "square";
else
return "different kind of object";
}
}
}