Advertisement
Guest User

Mediapipe Fist Detection Navigated GUI

a guest
May 9th, 2023
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 15.07 KB | Source Code | 0 0
  1. import cv2
  2. import numpy as np
  3. import math
  4. import mediapipe as mp
  5.  
  6. # Open Camera
  7. camera = cv2.VideoCapture(0)
  8. camera.set(10, 200)
  9.  
  10. camera.set(cv2.CAP_PROP_AUTO_EXPOSURE, 0.25)
  11. camera.set(cv2.CAP_PROP_EXPOSURE, 0.01)
  12.  
  13. mp_hands = mp.solutions.hands
  14. hands = mp_hands.Hands()
  15.  
  16. black = (0, 0, 0)
  17. red = (0, 0, 255)
  18. green = (0, 255, 0)
  19. dark_green = (15, 255, 0)
  20. blue = (255, 0, 0)
  21. cyan = (255, 255, 0)
  22.  
  23. # Create array of shapes and coordinates
  24. pts = np.array([[5, 240], [105, 340], [105, 140]], np.int32)
  25. pts = pts.reshape([-1, 1, 2])
  26. back_arrow = {
  27.     'pts': pts,
  28.     'startEnd': [5, 140, 105, 340]
  29. }
  30.  
  31. pts = np.array([[635, 240], [535, 140], [535, 340]], np.int32)
  32. pts = pts.reshape([-1, 1, 2])
  33. next_arrow = {
  34.     'pts': pts,
  35.     'startEnd': [535, 140, 635, 340]
  36. }
  37.  
  38. menu_comp_zero = {
  39.     'start': (135, 10),
  40.     'end': (310, 90),
  41.     'startEnd': [135, 5, 310, 105],
  42.     'textPos': (145, 55)
  43. }
  44.  
  45. menu_comp_one = {
  46.     'start': (330, 10),
  47.     'end': (520, 90),
  48.     'startEnd': [330, 5, 505, 105],
  49.     'textPos': (340, 55)
  50. }
  51.  
  52. menu_comp_two = {
  53.     'start': (135, 190),
  54.     'end': (325, 290),
  55.     'startEnd': [135, 190, 310, 290],
  56.     'textPos': (145, 250)
  57. }
  58.  
  59. menu_comp_three = {
  60.     'start': (330, 190),
  61.     'end': (520, 290),
  62.     'startEnd': [135, 150, 450, 290],
  63.     'textPos': (330, 250)
  64. }
  65.  
  66. menu_comp_four = {
  67.     'start': (135, 390),
  68.     'end': (290, 475),
  69.     'startEnd': [135, 375, 550, 475],
  70.     'textPos': (150, 435)
  71. }
  72.  
  73. menu_comp_five = {
  74.     'start': (345, 390),
  75.     'end': (500, 475),
  76.     'startEnd': [350, 375, 550, 475],
  77.     'textPos': (365, 435)
  78. }
  79.  
  80. menu_components = [menu_comp_zero, menu_comp_one, menu_comp_two, menu_comp_three, menu_comp_four, menu_comp_five,
  81.                    back_arrow, next_arrow]
  82.  
  83. numbers_menu = [[205, 395, 305, 475, 245, 425], [5, 5, 105, 85, 45, 35], [205, 5, 305, 85, 245, 35]
  84.     , [405, 5, 505, 85, 445, 35], [5, 135, 105, 215, 45, 165], [205, 135, 305, 215, 245, 165]
  85.     , [405, 135, 505, 215, 445, 165], [5, 265, 105, 345, 45, 295], [205, 265, 305, 345, 245, 295]
  86.     , [405, 265, 505, 345, 445, 295]]
  87.  
  88. var_count = 0
  89. var_page = 0
  90.  
  91. menu_item = []
  92. menu_item.append(["end line", "delete line", "remove last", "backspace", "compile", "space"])  # Screen 0
  93. menu_item.append(["if", "while", "not", "number", "variable", "print"])  # Screen 1
  94. menu_item.append(["+", "-", "!", "=", "true", "false"])  # Screen 2
  95. menu_item.append(["(", ")", "[", "]", "{", "}"])  # Screen 3
  96. menu_item.append(["none", ":", "'", "''", "no indent", "indent"])  # Screen 3
  97.  
  98. menu_page = 0
  99. act = ""
  100. change_menu = ""
  101.  
  102. code = []
  103. temp_code = ""
  104. executable_string = ""
  105.  
  106. # Previous state
  107. selected_bool = False
  108. error_bool = False
  109.  
  110.  
  111. # hands_bool = False
  112. # fists_bool = False
  113.  
  114. # Current count
  115. # hands_count = 0
  116. # fists_count = 0
  117.  
  118.  
  119. # Fist hand function
  120. def detect_fist(image):
  121.     # Image convert to RGB
  122.     image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
  123.  
  124.     results = hands.process(image)
  125.  
  126.     # Are hands in the image
  127.     if results.multi_hand_landmarks:
  128.         for hand_landmarks in results.multi_hand_landmarks:
  129.             # Check if the index and middle fingers are extended
  130.             if (hand_landmarks.landmark[mp_hands.HandLandmark.INDEX_FINGER_TIP].y <
  131.                     hand_landmarks.landmark[mp_hands.HandLandmark.MIDDLE_FINGER_TIP].y):
  132.                 return True
  133.     return False
  134.  
  135.  
  136. while camera.isOpened():
  137.     # Main Camera
  138.     ret, frame = camera.read()
  139.  
  140.     if ret:
  141.         gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
  142.  
  143.  
  144.         # Draws circle landmarks onto the videocapture
  145.         def draw_landmarks(image, landmarks):
  146.             for landmark in landmarks.landmark:
  147.                 x, y = int(landmark.x * image.shape[1]), int(landmark.y * image.shape[0])
  148.                 cv2.circle(image, (x, y), 5, (0, 255, 0), -1)
  149.  
  150.  
  151.         # Draw landmarks on the image
  152.         results = hands.process(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
  153.         if results.multi_hand_landmarks:
  154.             for hand_landmarks in results.multi_hand_landmarks:
  155.                 draw_landmarks(frame, hand_landmarks)
  156.  
  157.                 fist_pos = hand_landmarks.landmark[mp_hands.HandLandmark.INDEX_FINGER_TIP]
  158.                 thumb_pos = hand_landmarks.landmark[mp_hands.HandLandmark.MIDDLE_FINGER_TIP]
  159.  
  160.         # Draw menu components on canvas
  161.  
  162.  
  163.         if change_menu == "" or change_menu == "variable":
  164.             cv2.fillPoly(frame, [menu_components[6]['pts']], green)
  165.             cv2.fillPoly(frame, [menu_components[7]['pts']], green)
  166.             for i in range(6):
  167.                 frame = cv2.rectangle(frame, menu_components[i]['start'], menu_components[i]['end'], dark_green, -1)
  168.                 if change_menu == "":
  169.                     frame = cv2.putText(frame, menu_item[menu_page][i], menu_components[i]['textPos'],
  170.                                         cv2.FONT_HERSHEY_DUPLEX
  171.                                         , 1, black)
  172.                 elif change_menu == "variable":
  173.                     if var_page == 0 and i == 0:
  174.                         frame = cv2.putText(frame, "new variable", menu_components[i]['textPos'],
  175.                                             cv2.FONT_HERSHEY_DUPLEX, 1
  176.                                             , black)
  177.                     else:
  178.                         variable_id = var_page * 6 + i
  179.                         if variable_id <= var_count:
  180.                             frame = cv2.putText(frame, "variable " + str(variable_id), menu_components[i]['textPos']
  181.                                                 , cv2.FONT_HERSHEY_DUPLEX, 1, black)
  182.         elif change_menu == "number":
  183.             for i in range(10):
  184.                 frame = cv2.rectangle(frame, (numbers_menu[i][0], numbers_menu[i][1])
  185.                                       , (numbers_menu[i][2], numbers_menu[i][3]), dark_green, -1)
  186.                 frame = cv2.putText(frame, str(i), (numbers_menu[i][4], numbers_menu[i][5]), cv2.FONT_HERSHEY_DUPLEX, 1
  187.                                     , black)
  188.  
  189.         if detect_fist(frame):
  190.             for (fist_pos, thumb_pos) in landmarks:
  191.                 cv2.putText(frame, "Fist detected!", (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2)
  192.                 dx = (fist_pos.x - thumb_pos.x)
  193.                 dy = (fist_pos.y - thumb_pos.y)
  194.                 if change_menu == "" or change_menu == "variable":
  195.  
  196.                     for i in range(len(menu_components)):
  197.                         x_shape_start = menu_components[i]['startEnd'][0]
  198.                         y_shape_start = menu_components[i]['startEnd'][1]
  199.                         x_shape_end = menu_components[i]['startEnd'][2]
  200.                         y_shape_end = menu_components[i]['startEnd'][3]
  201.                         if (x_shape_start < dx < x_shape_end) and \
  202.                                 (y_shape_start < dy < y_shape_end):
  203.                             if i < 6:
  204.                                 # Menu Selection Acknowledgment Not Complete
  205.                                 # menusound.play(1)
  206.                                 # menusound.wait()
  207.                                 act = i
  208.                             else:
  209.                                 # Arrow Selection Acknowledgment
  210.                                 # menusound.play(1)
  211.                                 # menusound.wait()
  212.                                 if i == 6:
  213.                                     act = "back"
  214.                                 elif i == 7:
  215.                                     act = "next"
  216.                         elif change_menu == "number":
  217.                             for i in range(10):
  218.                                 x_shape_start = numbers_menu[i][0]
  219.                                 y_shape_start = numbers_menu[i][1]
  220.                                 x_shape_end = numbers_menu[i][2]
  221.                                 y_shape_end = numbers_menu[i][3]
  222.                                 if (x_shape_start < dx < x_shape_end) and (
  223.                                         y_shape_start < dy < y_shape_end):
  224.                                     # Number Acknowledgement
  225.                                     # menusound.play(1)
  226.                                     # menusound.wait()
  227.                                     temp_code += str(i)
  228.                                     change_menu = ""
  229.                                     selected_bool = True
  230.  
  231.     cv2.imshow('Fist Navigated GUI Programming', frame)
  232.  
  233.     k = cv2.waitKey(10)
  234.     if k == 27:  # press ESC to exit
  235.         break
  236.  
  237.     # Action if statements navigating menu pages with GUi grid divisible by six
  238.  
  239.     if act == "back":
  240.         if change_menu == "" and menu_page > 0:
  241.             menu_page -= 1
  242.         elif change_menu == "variable" and var_page > 0:
  243.             var_page -= 1
  244.         else:
  245.             frame = cv2.putText(frame, "On first page", (10, 30), cv2.FONT_HERSHEY_DUPLEX, 1, red)
  246.             print("On first page")
  247.             error_bool = True
  248.     elif act == "next":
  249.         if change_menu == "" and menu_page < len(menu_item) - 1:
  250.             menu_page += 1
  251.         elif change_menu == "variable" and var_page < math.floor(
  252.                 var_count / 6):
  253.             var_page += 1
  254.         else:
  255.             frame = cv2.putText(frame, "On last page", (10, 30), cv2.FONT_HERSHEY_DUPLEX, 1, red)
  256.             print("On last page")
  257.             error_bool = True
  258.     elif act != "":
  259.         if change_menu == "":
  260.             if menu_item[menu_page][act] == "end line":
  261.                 if temp_code != "":
  262.                     code = code + [temp_code]
  263.                     temp_code = ""
  264.                 else:
  265.                     frame = cv2.putText(frame, "Syntax error", (10, 30), cv2.FONT_HERSHEY_DUPLEX, 1, red)
  266.                     print("Syntax error - Cannot end line")
  267.                     error_bool = True
  268.             elif menu_item[menu_page][act] == "delete current line":
  269.                 temp_code = ""
  270.             elif menu_item[menu_page][act] == "delete last line":
  271.                 if code:
  272.                     code.pop()
  273.                 else:
  274.                     frame = cv2.putText(frame, "Syntax error", (10, 30), cv2.FONT_HERSHEY_DUPLEX, 1, red)
  275.                     print("Syntax error - Cannot delete last line")
  276.                     error_bool = True
  277.             elif menu_item[menu_page][act] == "backspace":
  278.                 if temp_code != "":
  279.                     temp_code = temp_code[:-1]
  280.                 else:
  281.                     frame = cv2.putText(frame, "Syntax error", (10, 30), cv2.FONT_HERSHEY_DUPLEX, 1, red)
  282.                     print("Syntax error - Cannot backspace")
  283.                     error_bool = True
  284.             elif menu_item[menu_page][act] == "space":
  285.                 temp_code += " "
  286.             elif menu_item[menu_page][act] == "execute":
  287.                 if code:
  288.                     try:
  289.                         executable_string = "''\n"
  290.                         for i in range(len(code)):
  291.                             executable_string += code[i] + "\n"
  292.                         executable_string += "''"
  293.                         exec(executable_string)
  294.                     except:
  295.                         print("' " + code[i] + " ' encountered an error")
  296.                         error_bool = True
  297.                 else:
  298.                     frame = cv2.putText(frame, "Syntax error", (10, 30), cv2.FONT_HERSHEY_DUPLEX, 1, red)
  299.                     print("Syntax error - Cannot execute")
  300.             elif menu_item[menu_page][act] == "if":
  301.                 temp_code += "if"
  302.             elif menu_item[menu_page][act] == "while":
  303.                 temp_code += "while"
  304.             elif menu_item[menu_page][act] == "not":
  305.                 temp_code += "not"
  306.             elif menu_item[menu_page][act] == "number":
  307.                 change_menu = "number"
  308.             elif menu_item[menu_page][act] == "variable":  # Changeable to new variable on user input
  309.                 change_menu = "variable"
  310.             elif menu_item[menu_page][act] == "print":
  311.                 temp_code += "print"
  312.             elif menu_item[menu_page][act] == "true":
  313.                 temp_code += "true"
  314.             elif menu_item[menu_page][act] == "false":
  315.                 temp_code += "false"
  316.             elif menu_item[menu_page][act] == "=":
  317.                 temp_code += "="
  318.             elif menu_item[menu_page][act] == "+":
  319.                 temp_code += "+"
  320.             elif menu_item[menu_page][act] == "-":
  321.                 temp_code += "-"
  322.             elif menu_item[menu_page][act] == "!":
  323.                 temp_code += "!"
  324.             elif menu_item[menu_page][act] == "[":
  325.                 temp_code += "["
  326.             elif menu_item[menu_page][act] == "]":
  327.                 temp_code += "]"
  328.             elif menu_item[menu_page][act] == "(":
  329.                 temp_code += "("
  330.             elif menu_item[menu_page][act] == ")":
  331.                 temp_code += ")"
  332.             elif menu_item[menu_page][act] == "{":
  333.                 temp_code += "{"
  334.             elif menu_item[menu_page][act] == "}":
  335.                 temp_code += "}"
  336.             elif menu_item[menu_page][act] == ":":
  337.                 temp_code += ":"
  338.             elif menu_item[menu_page][act] == "'":
  339.                 temp_code += "'"
  340.             elif menu_item[menu_page][act] == "''":
  341.                 temp_code += "''"
  342.             elif menu_item[menu_page][act] == "none":
  343.                 temp_code += "none"
  344.             elif menu_item[menu_page][act] == "indent":
  345.                 temp_code += "    "
  346.             elif menu_item[menu_page][act] == "no indent":
  347.                 if temp_code != "":
  348.                     temp_code = temp_code[:-4]
  349.                 else:
  350.                     frame = cv2.putText(frame, "syntax issue", (15, 45), cv2.FONT_HERSHEY_DUPLEX, 1, red)
  351.                     print("syntax issue - unable to backspace")
  352.                     error_bool = True
  353.             else:
  354.                 frame = cv2.putText(frame, "handling issue", (15, 45), cv2.FONT_HERSHEY_DUPLEX, 1, red)
  355.                 print("error - input not handled")
  356.                 error_bool = True
  357.         elif change_menu == "variable":
  358.             if var_page == 0 and act == 0:
  359.                 var_count += 1
  360.                 temp_code += "variable" + str(var_count)
  361.             else:
  362.                 temp_code += "variable" + str((var_page * 6) + act)
  363.             change_menu = ""
  364.         else:
  365.             frame = cv2.putText(frame, "input error", (15, 45), cv2.FONT_HERSHEY_DUPLEX, 1, red)
  366.             print("error - menu not computational")
  367.             error_bool = True
  368.  
  369.         if not error_bool: selected_bool = True  # If no errors mark a selection has been made
  370.     # else:
  371.     # selected_bool = False
  372.     """
  373.    #
  374.    """
  375.     if selected_bool:
  376.         print("---")
  377.         print(temp_code)
  378.         print(code)
  379.         print("---")
  380.     """
  381.    #Set variables for next stage of while loop
  382.    """
  383.     # If body part(s) detected set "previous state" boolean to true, if none set to false
  384.     # hands_bool = True if hands_count > 0 else False
  385.     # fists_bool = True if fists_count > 0 else False
  386.     selected_bool = False
  387.     error_bool = False
  388.  
  389. camera.release()
  390. cv2.destroyAllWindows()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement