Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import cv2
- import numpy as np
- import math
- import mediapipe as mp
- # Open Camera
- camera = cv2.VideoCapture(0)
- camera.set(10, 200)
- camera.set(cv2.CAP_PROP_AUTO_EXPOSURE, 0.25)
- camera.set(cv2.CAP_PROP_EXPOSURE, 0.01)
- mp_hands = mp.solutions.hands
- hands = mp_hands.Hands()
- black = (0, 0, 0)
- red = (0, 0, 255)
- green = (0, 255, 0)
- dark_green = (15, 255, 0)
- blue = (255, 0, 0)
- cyan = (255, 255, 0)
- # Create array of shapes and coordinates
- pts = np.array([[5, 240], [105, 340], [105, 140]], np.int32)
- pts = pts.reshape([-1, 1, 2])
- back_arrow = {
- 'pts': pts,
- 'startEnd': [5, 140, 105, 340]
- }
- pts = np.array([[635, 240], [535, 140], [535, 340]], np.int32)
- pts = pts.reshape([-1, 1, 2])
- next_arrow = {
- 'pts': pts,
- 'startEnd': [535, 140, 635, 340]
- }
- menu_comp_zero = {
- 'start': (135, 10),
- 'end': (310, 90),
- 'startEnd': [135, 5, 310, 105],
- 'textPos': (145, 55)
- }
- menu_comp_one = {
- 'start': (330, 10),
- 'end': (520, 90),
- 'startEnd': [330, 5, 505, 105],
- 'textPos': (340, 55)
- }
- menu_comp_two = {
- 'start': (135, 190),
- 'end': (325, 290),
- 'startEnd': [135, 190, 310, 290],
- 'textPos': (145, 250)
- }
- menu_comp_three = {
- 'start': (330, 190),
- 'end': (520, 290),
- 'startEnd': [135, 150, 450, 290],
- 'textPos': (330, 250)
- }
- menu_comp_four = {
- 'start': (135, 390),
- 'end': (290, 475),
- 'startEnd': [135, 375, 550, 475],
- 'textPos': (150, 435)
- }
- menu_comp_five = {
- 'start': (345, 390),
- 'end': (500, 475),
- 'startEnd': [350, 375, 550, 475],
- 'textPos': (365, 435)
- }
- menu_components = [menu_comp_zero, menu_comp_one, menu_comp_two, menu_comp_three, menu_comp_four, menu_comp_five,
- back_arrow, next_arrow]
- numbers_menu = [[205, 395, 305, 475, 245, 425], [5, 5, 105, 85, 45, 35], [205, 5, 305, 85, 245, 35]
- , [405, 5, 505, 85, 445, 35], [5, 135, 105, 215, 45, 165], [205, 135, 305, 215, 245, 165]
- , [405, 135, 505, 215, 445, 165], [5, 265, 105, 345, 45, 295], [205, 265, 305, 345, 245, 295]
- , [405, 265, 505, 345, 445, 295]]
- var_count = 0
- var_page = 0
- menu_item = []
- menu_item.append(["end line", "delete line", "remove last", "backspace", "compile", "space"]) # Screen 0
- menu_item.append(["if", "while", "not", "number", "variable", "print"]) # Screen 1
- menu_item.append(["+", "-", "!", "=", "true", "false"]) # Screen 2
- menu_item.append(["(", ")", "[", "]", "{", "}"]) # Screen 3
- menu_item.append(["none", ":", "'", "''", "no indent", "indent"]) # Screen 3
- menu_page = 0
- act = ""
- change_menu = ""
- code = []
- temp_code = ""
- executable_string = ""
- # Previous state
- selected_bool = False
- error_bool = False
- # hands_bool = False
- # fists_bool = False
- # Current count
- # hands_count = 0
- # fists_count = 0
- # Fist hand function
- def detect_fist(image):
- # Image convert to RGB
- image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
- results = hands.process(image)
- # Are hands in the image
- if results.multi_hand_landmarks:
- for hand_landmarks in results.multi_hand_landmarks:
- # Check if the index and middle fingers are extended
- if (hand_landmarks.landmark[mp_hands.HandLandmark.INDEX_FINGER_TIP].y <
- hand_landmarks.landmark[mp_hands.HandLandmark.MIDDLE_FINGER_TIP].y):
- return True
- return False
- while camera.isOpened():
- # Main Camera
- ret, frame = camera.read()
- if ret:
- gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
- # Draws circle landmarks onto the videocapture
- def draw_landmarks(image, landmarks):
- for landmark in landmarks.landmark:
- x, y = int(landmark.x * image.shape[1]), int(landmark.y * image.shape[0])
- cv2.circle(image, (x, y), 5, (0, 255, 0), -1)
- # Draw landmarks on the image
- results = hands.process(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
- if results.multi_hand_landmarks:
- for hand_landmarks in results.multi_hand_landmarks:
- draw_landmarks(frame, hand_landmarks)
- fist_pos = hand_landmarks.landmark[mp_hands.HandLandmark.INDEX_FINGER_TIP]
- thumb_pos = hand_landmarks.landmark[mp_hands.HandLandmark.MIDDLE_FINGER_TIP]
- # Draw menu components on canvas
- if change_menu == "" or change_menu == "variable":
- cv2.fillPoly(frame, [menu_components[6]['pts']], green)
- cv2.fillPoly(frame, [menu_components[7]['pts']], green)
- for i in range(6):
- frame = cv2.rectangle(frame, menu_components[i]['start'], menu_components[i]['end'], dark_green, -1)
- if change_menu == "":
- frame = cv2.putText(frame, menu_item[menu_page][i], menu_components[i]['textPos'],
- cv2.FONT_HERSHEY_DUPLEX
- , 1, black)
- elif change_menu == "variable":
- if var_page == 0 and i == 0:
- frame = cv2.putText(frame, "new variable", menu_components[i]['textPos'],
- cv2.FONT_HERSHEY_DUPLEX, 1
- , black)
- else:
- variable_id = var_page * 6 + i
- if variable_id <= var_count:
- frame = cv2.putText(frame, "variable " + str(variable_id), menu_components[i]['textPos']
- , cv2.FONT_HERSHEY_DUPLEX, 1, black)
- elif change_menu == "number":
- for i in range(10):
- frame = cv2.rectangle(frame, (numbers_menu[i][0], numbers_menu[i][1])
- , (numbers_menu[i][2], numbers_menu[i][3]), dark_green, -1)
- frame = cv2.putText(frame, str(i), (numbers_menu[i][4], numbers_menu[i][5]), cv2.FONT_HERSHEY_DUPLEX, 1
- , black)
- if detect_fist(frame):
- for (fist_pos, thumb_pos) in landmarks:
- cv2.putText(frame, "Fist detected!", (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2)
- dx = (fist_pos.x - thumb_pos.x)
- dy = (fist_pos.y - thumb_pos.y)
- if change_menu == "" or change_menu == "variable":
- for i in range(len(menu_components)):
- x_shape_start = menu_components[i]['startEnd'][0]
- y_shape_start = menu_components[i]['startEnd'][1]
- x_shape_end = menu_components[i]['startEnd'][2]
- y_shape_end = menu_components[i]['startEnd'][3]
- if (x_shape_start < dx < x_shape_end) and \
- (y_shape_start < dy < y_shape_end):
- if i < 6:
- # Menu Selection Acknowledgment Not Complete
- # menusound.play(1)
- # menusound.wait()
- act = i
- else:
- # Arrow Selection Acknowledgment
- # menusound.play(1)
- # menusound.wait()
- if i == 6:
- act = "back"
- elif i == 7:
- act = "next"
- elif change_menu == "number":
- for i in range(10):
- x_shape_start = numbers_menu[i][0]
- y_shape_start = numbers_menu[i][1]
- x_shape_end = numbers_menu[i][2]
- y_shape_end = numbers_menu[i][3]
- if (x_shape_start < dx < x_shape_end) and (
- y_shape_start < dy < y_shape_end):
- # Number Acknowledgement
- # menusound.play(1)
- # menusound.wait()
- temp_code += str(i)
- change_menu = ""
- selected_bool = True
- cv2.imshow('Fist Navigated GUI Programming', frame)
- k = cv2.waitKey(10)
- if k == 27: # press ESC to exit
- break
- # Action if statements navigating menu pages with GUi grid divisible by six
- if act == "back":
- if change_menu == "" and menu_page > 0:
- menu_page -= 1
- elif change_menu == "variable" and var_page > 0:
- var_page -= 1
- else:
- frame = cv2.putText(frame, "On first page", (10, 30), cv2.FONT_HERSHEY_DUPLEX, 1, red)
- print("On first page")
- error_bool = True
- elif act == "next":
- if change_menu == "" and menu_page < len(menu_item) - 1:
- menu_page += 1
- elif change_menu == "variable" and var_page < math.floor(
- var_count / 6):
- var_page += 1
- else:
- frame = cv2.putText(frame, "On last page", (10, 30), cv2.FONT_HERSHEY_DUPLEX, 1, red)
- print("On last page")
- error_bool = True
- elif act != "":
- if change_menu == "":
- if menu_item[menu_page][act] == "end line":
- if temp_code != "":
- code = code + [temp_code]
- temp_code = ""
- else:
- frame = cv2.putText(frame, "Syntax error", (10, 30), cv2.FONT_HERSHEY_DUPLEX, 1, red)
- print("Syntax error - Cannot end line")
- error_bool = True
- elif menu_item[menu_page][act] == "delete current line":
- temp_code = ""
- elif menu_item[menu_page][act] == "delete last line":
- if code:
- code.pop()
- else:
- frame = cv2.putText(frame, "Syntax error", (10, 30), cv2.FONT_HERSHEY_DUPLEX, 1, red)
- print("Syntax error - Cannot delete last line")
- error_bool = True
- elif menu_item[menu_page][act] == "backspace":
- if temp_code != "":
- temp_code = temp_code[:-1]
- else:
- frame = cv2.putText(frame, "Syntax error", (10, 30), cv2.FONT_HERSHEY_DUPLEX, 1, red)
- print("Syntax error - Cannot backspace")
- error_bool = True
- elif menu_item[menu_page][act] == "space":
- temp_code += " "
- elif menu_item[menu_page][act] == "execute":
- if code:
- try:
- executable_string = "''\n"
- for i in range(len(code)):
- executable_string += code[i] + "\n"
- executable_string += "''"
- exec(executable_string)
- except:
- print("' " + code[i] + " ' encountered an error")
- error_bool = True
- else:
- frame = cv2.putText(frame, "Syntax error", (10, 30), cv2.FONT_HERSHEY_DUPLEX, 1, red)
- print("Syntax error - Cannot execute")
- elif menu_item[menu_page][act] == "if":
- temp_code += "if"
- elif menu_item[menu_page][act] == "while":
- temp_code += "while"
- elif menu_item[menu_page][act] == "not":
- temp_code += "not"
- elif menu_item[menu_page][act] == "number":
- change_menu = "number"
- elif menu_item[menu_page][act] == "variable": # Changeable to new variable on user input
- change_menu = "variable"
- elif menu_item[menu_page][act] == "print":
- temp_code += "print"
- elif menu_item[menu_page][act] == "true":
- temp_code += "true"
- elif menu_item[menu_page][act] == "false":
- temp_code += "false"
- elif menu_item[menu_page][act] == "=":
- temp_code += "="
- elif menu_item[menu_page][act] == "+":
- temp_code += "+"
- elif menu_item[menu_page][act] == "-":
- temp_code += "-"
- elif menu_item[menu_page][act] == "!":
- temp_code += "!"
- elif menu_item[menu_page][act] == "[":
- temp_code += "["
- elif menu_item[menu_page][act] == "]":
- temp_code += "]"
- elif menu_item[menu_page][act] == "(":
- temp_code += "("
- elif menu_item[menu_page][act] == ")":
- temp_code += ")"
- elif menu_item[menu_page][act] == "{":
- temp_code += "{"
- elif menu_item[menu_page][act] == "}":
- temp_code += "}"
- elif menu_item[menu_page][act] == ":":
- temp_code += ":"
- elif menu_item[menu_page][act] == "'":
- temp_code += "'"
- elif menu_item[menu_page][act] == "''":
- temp_code += "''"
- elif menu_item[menu_page][act] == "none":
- temp_code += "none"
- elif menu_item[menu_page][act] == "indent":
- temp_code += " "
- elif menu_item[menu_page][act] == "no indent":
- if temp_code != "":
- temp_code = temp_code[:-4]
- else:
- frame = cv2.putText(frame, "syntax issue", (15, 45), cv2.FONT_HERSHEY_DUPLEX, 1, red)
- print("syntax issue - unable to backspace")
- error_bool = True
- else:
- frame = cv2.putText(frame, "handling issue", (15, 45), cv2.FONT_HERSHEY_DUPLEX, 1, red)
- print("error - input not handled")
- error_bool = True
- elif change_menu == "variable":
- if var_page == 0 and act == 0:
- var_count += 1
- temp_code += "variable" + str(var_count)
- else:
- temp_code += "variable" + str((var_page * 6) + act)
- change_menu = ""
- else:
- frame = cv2.putText(frame, "input error", (15, 45), cv2.FONT_HERSHEY_DUPLEX, 1, red)
- print("error - menu not computational")
- error_bool = True
- if not error_bool: selected_bool = True # If no errors mark a selection has been made
- # else:
- # selected_bool = False
- """
- #
- """
- if selected_bool:
- print("---")
- print(temp_code)
- print(code)
- print("---")
- """
- #Set variables for next stage of while loop
- """
- # If body part(s) detected set "previous state" boolean to true, if none set to false
- # hands_bool = True if hands_count > 0 else False
- # fists_bool = True if fists_count > 0 else False
- selected_bool = False
- error_bool = False
- camera.release()
- cv2.destroyAllWindows()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement