-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbradtrack.py
109 lines (91 loc) · 3.37 KB
/
bradtrack.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
97
98
99
100
101
102
103
104
105
106
107
108
109
import cv2
import numpy as np
import sys, time, os
import irtrack, clicklistener
from PIL import ImageTk
from win32api import GetSystemMetrics
from Tkinter import *
class BradTrack:
def __init__(self, master):
os.chdir("c:\\platform-tools\\bradtrack")
self.cap = cv2.VideoCapture(0)
ret, img = self.cap.read()
self.lkt = irtrack.IRTracker(img)
self.listener = clicklistener.Listener()
# Set default values for the bounding box
self.minX = 0
self.minY = 0
self.maxX = GetSystemMetrics(0)
self.maxY = GetSystemMetrics(1)
self.clock = 0
self.master = master
frame = Frame(master)
frame.pack()
self.corner = 0
self.corner_array = ["arrow_nw.gif", "arrow_sw.gif", "arrow_se.gif", "arrow_ne.gif"]
arrow_img = ImageTk.PhotoImage(file=self.corner_array[self.corner])
self.arrow_label = Label(frame, image=arrow_img)
self.arrow_label.image = arrow_img
self.arrow_label.pack(side=LEFT)
self.timer = StringVar()
self.timer.set("5")
timer_label = Label(frame, textvariable=self.timer, font=("Helvetica", 64), padx=40).pack(side=LEFT)
def runtimer(self):
self.master.attributes("-topmost", True)
self.clock = self.clock + 10
if self.clock % 200 == 0:
if self.tick():
self.corner = self.corner + 1
if self.corner > 3:
self.master.destroy()
return
else:
arrow_img = ImageTk.PhotoImage(file=self.corner_array[self.corner])
self.arrow_label.configure(image = arrow_img)
self.arrow_label.image = arrow_img
else:
ret, img = self.cap.read()
self.lkt.update(img)
self.master.after(10, self.runtimer)
def tick(self):
#print "tick"
time_left = int(self.timer.get())
if time_left > 0:
self.timer.set(str(time_left - 1))
return False
else:
#print "timeout"
ret, img = self.cap.read()
self.lkt.update(img)
points = self.lkt.get_points()
if len(points) > 0:
if self.corner == 0:
self.minX = points[0]
self.minY = points[1]
elif self.corner == 1:
self.minX = points[0]
self.maxY = points[1]
elif self.corner == 2:
self.maxX = points[0]
self.maxY = points[1]
elif self.corner == 3:
self.maxX = points[0]
self.minY = points[1]
self.timer.set("3")
return True
def track(self):
scaleX = GetSystemMetrics(0) / (self.maxX - self.minX)
scaleY = GetSystemMetrics(1) / (self.maxY - self.minY)
self.lkt.set_mapping(self.minX, self.minY, scaleX, scaleY)
while True:
self.listener.listen()
ret, img = self.cap.read()
self.lkt.update(img, mouse=True)
if (cv2.waitKey(10) == 27):
break
root = Tk()
bradtrack = BradTrack(root)
root.geometry("450x300+" + str(max(100, GetSystemMetrics(0) - 1225)) + "+150")
root.after(10, bradtrack.runtimer)
root.mainloop()
bradtrack.track()