-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathvalidator.py
96 lines (78 loc) · 3.13 KB
/
validator.py
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
# Based on: https://github.com/sarful/People-counter-opencv-python3/blob/master/Person.py
import math
class MyValidator:
tracks = []
def __init__(self, i, xi, yi, max_age):
self.i = i
self.x = xi
self.y = yi
self.tracks = []
self.done = False
self.state = '0'
self.age = 0
self.max_age = max_age
self.dir = None
def getTracks(self):
return self.tracks
def getId(self):
return self.i
def getState(self):
return self.state
def getDir(self):
return self.dir
def getX(self):
return self.x
def getY(self):
return self.y
def updateCoords(self, xn, yn):
self.age = 0
self.tracks.append([self.x, self.y])
self.x = xn
self.y = yn
def setDone(self):
self.done = True
def timedOut(self):
return self.done
def going_DOWN(self, mid_start):
# Check if you have at least 2 coordinates of stored objects
if len(self.tracks) >= 2:
# Check if the condition of the object is zero
# The state of the object will only change when crossing the input threshold
if self.state == '0':
# Euclidian distance calculation
distance = math.sqrt(float((self.tracks[-1][1] - self.tracks[-2][1])**2) + float(
(self.tracks[-1][1] - self.tracks[-2][1])**2))
if distance < 10:
# [-2] are two previous positions of the vector record and [1] is the column containing the
# vertical values (y) of each object
# If the anterior vertical position of the object is greater than the input threshold and if in
# two anterior vertical positions the value is less than or equal to the input threshold
# we updated the state of the object to 1 and indicated that it moved downwards (down)
# We do this to make sure that the object crossed the entrance line, moving from top to bottom
if self.tracks[-1][1] > mid_start and self.tracks[-2][1] <= mid_start:
state = '1'
self.dir = 'down'
return True
else:
return False
else:
return False
def going_UP(self, mid_end):
if len(self.tracks) >= 2:
if self.state == '0':
distance = math.sqrt(float((self.tracks[-1][1] - self.tracks[-2][1])**2) + float(
(self.tracks[-1][1] - self.tracks[-2][1])**2))
if distance < 10:
if self.tracks[-1][1] < mid_end and self.tracks[-2][1] >= mid_end:
state = '1'
self.dir = 'up'
return True
else:
return False
else:
return False
def age_one(self):
self.age += 1
if self.age > self.max_age:
self.done = True
return True