def __init__(self): # TODO: having inconsistencies detecting faces with given classifier self.face_cascade = cv2.CascadeClassifier( 'haarcascade_frontalface_default.xml') self.cap = cv2.VideoCapture(0) self.cap.set(3, 1028) self.cap.set(4, 720) self.player = MediaPlayer() self.state = True
def __init__(self, root): super(VideoFrame, self).__init__(root) self.grid() self.root = root self.root.title("CV Media Controller") self.root.tk.call('wm', 'iconphoto', root._w, tk.PhotoImage(file='icon.png')) self.root.configure(bg='red') self.root.resizable(False, False) self.mode = tk.IntVar() self.mode.set(1) self.state_message = tk.StringVar() self.state_message.set("Enter a YouTube URL and press start to begin!") self.last_input_message = tk.StringVar() self.last_input_message.set("") self.player_time = tk.StringVar() self.player_time.set("") self.center_window() self.frame = tk.Frame(self, width=1200, height=700, bd=5) self.frame.configure(bg="black") self.frame.grid(row=0, column=0, columnspan=10, padx=8, pady=8) self.progress = ttk.Progressbar(self, orient="horizontal", length="900", mode="indeterminate") self.progress.grid(row=1, column=0, pady=10, columnspan=9, sticky="E") self.player_time_label = tk.Label(self, height=1, width=30, textvariable=self.player_time) self.player_time_label.grid(row=1, column=9, columnspan=1, padx=8, sticky='W') self.url_label = tk.Label(self, text="YouTube URL:") self.url_label.grid(row=2, column=0, columnspan=1, padx=35) self.url_input = tk.Text(self, height=1, width=50) self.url_input.grid(row=2, column=1, columnspan=1, padx=8, sticky='W') self.start_button = tk.Button(self, text='Start', command=self.initialize_player) self.start_button.grid(row=2, column=2, columnspan=2, padx=8) self.mode_label = tk.Label(self, text="Mode:") self.mode_label.grid(row=3, column=0, columnspan=1, padx=10, pady=8, sticky="S") self.face_select = tk.Radiobutton(self, text="Facial Recognition", variable=self.mode, value=1) self.face_select.grid(row=3, column=1, columnspan=1, padx=8, sticky='SW') self.gesture_select = tk.Radiobutton(self, text="Gesture Recognition", variable=self.mode, value=2) self.gesture_select.grid(row=4, column=1, columnspan=1, padx=8, pady=8, sticky='NW') self.state_label = tk.Label(self, textvariable=self.state_message) self.state_label.grid(row=3, column=9, columnspan=1, padx=8, sticky="SE") self.last_input_message_label = tk.Label(self, textvariable=self.last_input_message) self.last_input_message_label.grid(row=4, column=9, columnspan=1, pady=8, padx=8, sticky='NE') self.player = MediaPlayer() self.player.player.set_hwnd(self.frame.winfo_id())
from MediaModule import MediaPlayer from CVModule import FaceDetector import tkinter as tk import tkinter.simpledialog root = tk.Tk() root.withdraw() url = tk.simpledialog.askstring("Computer Vision Media Controller", "Please Enter a valid YouTube URL") player = MediaPlayer() player.initialize(url) face_detector = FaceDetector() # These states dictate the direction of the main loop. State[0] indicates what mode the program should be operating in # (state[0] == True iff face mode, state[0] == False iff gesture mode) while state[1] indicates if the program shou=ld # continue to run or not (state[1] == True if we want to quit). state = [True, False] while not state[1]: if state[0]: state = face_detector.detect(player) else: print("gesture mode")
class VideoFrame(tk.Frame): def __init__(self, root): super(VideoFrame, self).__init__(root) self.grid() self.root = root self.root.title("CV Media Controller") self.root.tk.call('wm', 'iconphoto', root._w, tk.PhotoImage(file='icon.png')) self.root.configure(bg='red') self.root.resizable(False, False) self.mode = tk.IntVar() self.mode.set(1) self.state_message = tk.StringVar() self.state_message.set("Enter a YouTube URL and press start to begin!") self.last_input_message = tk.StringVar() self.last_input_message.set("") self.player_time = tk.StringVar() self.player_time.set("") self.center_window() self.frame = tk.Frame(self, width=1200, height=700, bd=5) self.frame.configure(bg="black") self.frame.grid(row=0, column=0, columnspan=10, padx=8, pady=8) self.progress = ttk.Progressbar(self, orient="horizontal", length="900", mode="indeterminate") self.progress.grid(row=1, column=0, pady=10, columnspan=9, sticky="E") self.player_time_label = tk.Label(self, height=1, width=30, textvariable=self.player_time) self.player_time_label.grid(row=1, column=9, columnspan=1, padx=8, sticky='W') self.url_label = tk.Label(self, text="YouTube URL:") self.url_label.grid(row=2, column=0, columnspan=1, padx=35) self.url_input = tk.Text(self, height=1, width=50) self.url_input.grid(row=2, column=1, columnspan=1, padx=8, sticky='W') self.start_button = tk.Button(self, text='Start', command=self.initialize_player) self.start_button.grid(row=2, column=2, columnspan=2, padx=8) self.mode_label = tk.Label(self, text="Mode:") self.mode_label.grid(row=3, column=0, columnspan=1, padx=10, pady=8, sticky="S") self.face_select = tk.Radiobutton(self, text="Facial Recognition", variable=self.mode, value=1) self.face_select.grid(row=3, column=1, columnspan=1, padx=8, sticky='SW') self.gesture_select = tk.Radiobutton(self, text="Gesture Recognition", variable=self.mode, value=2) self.gesture_select.grid(row=4, column=1, columnspan=1, padx=8, pady=8, sticky='NW') self.state_label = tk.Label(self, textvariable=self.state_message) self.state_label.grid(row=3, column=9, columnspan=1, padx=8, sticky="SE") self.last_input_message_label = tk.Label(self, textvariable=self.last_input_message) self.last_input_message_label.grid(row=4, column=9, columnspan=1, pady=8, padx=8, sticky='NE') self.player = MediaPlayer() self.player.player.set_hwnd(self.frame.winfo_id()) def center_window(self): w = 1200 h = 700 ws = self.root.winfo_screenwidth() # width of the screen hs = self.root.winfo_screenheight() # height of the screen # calculate x and y coordinates for the Tk root window x = (ws / 2) - (w / 2) y = (hs / 2) - (h / 2) - 100 self.root.geometry('+%d+%d' % (x, y)) def initialize_player(self): url = self.url_input.get("1.0", "end-1c") while not self.player.validate_url(url): self.update_status("Invalid URL") self.player.initialize(url) def current_mode(self): return self.mode.get() def update_state_status(self, message): self.state_message.set(message) def update_last_call(self, call): if call == 0: message = "Last Input Received: play" self.last_input_message.set(message) elif call == 1: message = "Last Input Received: pause" self.last_input_message.set(message) elif call == 2: message = "Last Input Received: jump forward" self.last_input_message.set(message) elif call == 3: message = "Last Input Received: jump back" self.last_input_message.set(message) elif call == 4: message = "Last Input Received: volume up ( " + str(self.player.get_volume()) + " )" self.last_input_message.set(message) elif call == 5: message = "Last Input Received: volume down ( " + str(self.player.get_volume()) + " )" self.last_input_message.set(message) def update_time(self): time = self.player.get_time() percent_complete = 0 if time[1] != 0: percent_complete = (time[0]/time[1]) * 100 self.progress["value"] = percent_complete minute = int(int(time[0]/1000) / 60) second = int(time[0]/1000) % 60 if second < 10: formatted_time = str(minute) + ":0" + str(second) else: formatted_time = str(minute) + ":" + str(second) self.player_time.set(formatted_time)
def setUp(self): self.media_player = MediaPlayer()
class TestMediaPlayer(TestCase): def setUp(self): self.media_player = MediaPlayer() def test_play(self): self.media_player.play() assert (self.media_player.state == 0) def test_pause(self): self.media_player.pause() assert (self.media_player.state == 1) def test_increase_volume(self): # test with volume below 100 starting_volume = 50 self.media_player.volume = starting_volume self.media_player.increase_volume() assert (self.media_player.volume == starting_volume + 2) # test with volume already at max starting_volume = 100 self.media_player.volume = starting_volume self.media_player.increase_volume() assert (self.media_player.volume == starting_volume) def test_decrease_volume(self): # test with volume above 0 starting_volume = 50 self.media_player.volume = starting_volume self.media_player.decrease_volume() assert (self.media_player.volume == starting_volume - 2) # test with volume already at min starting_volume = 0 self.media_player.volume = starting_volume self.media_player.decrease_volume() assert (self.media_player.volume == starting_volume) def test_get_volume(self): assert (self.media_player.volume == self.media_player.get_volume()) def test_get_state(self): assert (self.media_player.state == self.media_player.get_state())
# jump forward: press 4, # jump backward: press 5 # # ############################################################################################## import keyboard import tkinter as tk import tkinter.simpledialog import time from MediaModule import VideoFrame, MediaPlayer root = tk.Tk() root.title = "Computer Vision Media Controller" # url = tk.simpledialog.askstring("Computer Vision Media Controller", "Please Enter a valid YouTube URL") url = "https://www.youtube.com/watch?v=LXb3EKWsInQ" player = MediaPlayer() frame = VideoFrame(root, player) player.initialize(url) while True: root.update() # quit application if keyboard.is_pressed('q'): print("quit") break # play if keyboard.is_pressed('0'): player.play() # pause