-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.py
116 lines (95 loc) · 5.93 KB
/
main.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
110
111
112
113
114
115
116
# All media file is available for download as a zip file
import tkinter #Tkinter is our inbuilt package no need to install it..
#It is a standard Python interface to the Tk GUI toolkit shipped with Python. Python with tkinter is the fastest and easiest way to create the GUI applications
import cv2 # pip install opencv-python //cv2, it is module //OpenCV is a cross-platform library using which we can develop real-time computer vision applications. It mainly focuses on image processing, video capture and analysis including features like face detection and object detection.
# OpenCV is a huge open-source library for computer vision, machine learning, and image processing. OpenCV supports a wide variety of programming languages like Python, C++, Java, etc. It can process images and videos to identify objects, faces, or even the handwriting of a human.
import PIL.Image, PIL.ImageTk # pip install pillow //python imaging library , Image Tk is used for showing image in Tkinter
from functools import partial
# Functools module is for higher-order functions that work on other functions. It provides functions for working with other functions and callable objects to use or extend them without completely rewriting them. This module has two classes – partial and partialmethod.
#Partial class
#A partial function is an original function for particular argument values. They can be created in Python by using “partial” from the functools library. The __name__ and __doc__ attributes are to be created by the programmer as they are not created automatically. Objects created by partial() have three read-only attributes:
import threading # we are using this for preventing the program from blocking , and take care of changing the responsibility of images and if mainloop() does not work our GUI will be hanged
import time
import imutils # pip install imutils # used for resizing
stream = cv2.VideoCapture("clip.mp4")
flag = True
def play(speed):
global flag
print(f"You clicked on play. Speed is {speed}")
# Play the video in reverse mode
frame1 = stream.get(cv2.CAP_PROP_POS_FRAMES)
stream.set(cv2.CAP_PROP_POS_FRAMES, frame1 + speed)
grabbed, frame = stream.read() #grabbed is a boolean var which tells have you took frame correctly or not
if not grabbed:
exit()
frame = imutils.resize(frame, width=SET_WIDTH, height=SET_HEIGHT)
frame = PIL.ImageTk.PhotoImage(image = PIL.Image.fromarray(frame))
canvas.image = frame
canvas.create_image(0,0, image=frame, anchor=tkinter.NW)
if flag: # for blinking decision pending
canvas.create_text(134, 26, fill="black", font="Times 26 bold", text="Decision Pending")
flag = not flag
def pending(decision):
# 1. Display decision pending image
frame = cv2.cvtColor(cv2.imread("lordsDecisionPending.jpg"), cv2.COLOR_BGR2RGB)
frame = imutils.resize(frame, width=SET_WIDTH, height=SET_HEIGHT)
frame = PIL.ImageTk.PhotoImage(image=PIL.Image.fromarray(frame)) # making image as tkinter compaitable
canvas.image = frame
canvas.create_image(0,0, image=frame, anchor=tkinter.NW)
# 2. Wait for 1 second
time.sleep(1.5)
# 3. Display sponsor image
frame = cv2.cvtColor(cv2.imread("lordsSponsor.jpg"), cv2.COLOR_BGR2RGB)
frame = imutils.resize(frame, width=SET_WIDTH, height=SET_HEIGHT)
frame = PIL.ImageTk.PhotoImage(image=PIL.Image.fromarray(frame)) # making image as tkinter compaitable
canvas.image = frame
canvas.create_image(0,0, image=frame, anchor=tkinter.NW)
# 4. Wait for 1.5 second
time.sleep(2.5)
# 5. Display out/notout image
if decision == 'out':
decisionImg = "lordsOut.jpg"
else:
decisionImg = "lordsNotOut.jpg"
frame = cv2.cvtColor(cv2.imread(decisionImg), cv2.COLOR_BGR2RGB)
frame = imutils.resize(frame, width=SET_WIDTH, height=SET_HEIGHT)
frame = PIL.ImageTk.PhotoImage(image=PIL.Image.fromarray(frame))
canvas.image = frame
canvas.create_image(0,0, image=frame, anchor=tkinter.NW)
def out():
thread = threading.Thread(target=pending, args=("out",)) # ',' is used as this is a tuple..
thread.daemon = 1 # In multitasking computer operating systems, a daemon is a computer program that runs as a background process, rather than being under the direct control of an interactive user.
thread.start()
print("Player is out")
def not_out():
thread = threading.Thread(target=pending, args=("not out",))
thread.daemon = 1
thread.start()
print("Player is not out")
# Width and height of our main screen
SET_WIDTH = 613
SET_HEIGHT = 368
# SET_WIDTH = 1788
# SET_HEIGHT = 1073
# Tkinter gui starts here
window = tkinter.Tk()
window.title("Shashwat Tyagi Third Umpire Decision Review Kit")
cv_img = cv2.cvtColor(cv2.imread("lordsWelcome.jpg"), cv2.COLOR_BGR2RGB)
canvas = tkinter.Canvas(window, width=SET_WIDTH, height=SET_HEIGHT)
photo = PIL.ImageTk.PhotoImage(image=PIL.Image.fromarray(cv_img))
image_on_canvas = canvas.create_image(0, 0, ancho=tkinter.NW, image=photo) # NW-north-west, positioning
canvas.pack()
# Buttons to control playback
btn = tkinter.Button(window, text="<< Previous (fast)", width=50, command=partial(play, -25)) # we can't give arguments in the function so we use partial so that ot behaves that we didn't pass the arguments
btn.pack()
btn = tkinter.Button(window, text="<< Previous (slow)", width=50, command=partial(play, -2))
btn.pack()
btn = tkinter.Button(window, text="Next (slow) >>", width=50, command=partial(play, 2))
btn.pack()
btn = tkinter.Button(window, text="Next (fast) >>", width=50, command=partial(play, 25))
btn.pack()
btn = tkinter.Button(window, text="Give Out", width=50, command=out)
btn.pack()
btn = tkinter.Button(window, text="Give Not Out", width=50, command=not_out)
btn.pack()
window.mainloop() # for running windows