Spaces:
Configuration error
Configuration error
| import mediapipe as mp | |
| import cv2 | |
| import numpy as np | |
| import time | |
| #contants | |
| ml = 150 | |
| max_x, max_y = 250+ml, 50 | |
| curr_tool = "select tool" | |
| time_init = True | |
| rad = 40 | |
| var_inits = False | |
| thick = 4 | |
| prevx, prevy = 0,0 | |
| #get tools function | |
| def getTool(x): | |
| if x < 50 + ml: | |
| return "line" | |
| elif x<100 + ml: | |
| return "rectangle" | |
| elif x < 150 + ml: | |
| return"draw" | |
| elif x<200 + ml: | |
| return "circle" | |
| else: | |
| return "erase" | |
| def index_raised(yi, y9): | |
| if (y9 - yi) > 40: | |
| return True | |
| return False | |
| hands = mp.solutions.hands | |
| hand_landmark = hands.Hands(min_detection_confidence=0.6, min_tracking_confidence=0.6, max_num_hands=1) | |
| draw = mp.solutions.drawing_utils | |
| # drawing tools | |
| tools = cv2.imread("tools.png") | |
| tools = tools.astype('uint8') | |
| mask = np.ones((480, 640))*255 | |
| mask = mask.astype('uint8') | |
| ''' | |
| tools = np.zeros((max_y+5, max_x+5, 3), dtype="uint8") | |
| cv2.rectangle(tools, (0,0), (max_x, max_y), (0,0,255), 2) | |
| cv2.line(tools, (50,0), (50,50), (0,0,255), 2) | |
| cv2.line(tools, (100,0), (100,50), (0,0,255), 2) | |
| cv2.line(tools, (150,0), (150,50), (0,0,255), 2) | |
| cv2.line(tools, (200,0), (200,50), (0,0,255), 2) | |
| ''' | |
| cap = cv2.VideoCapture(0) | |
| while True: | |
| _, frm = cap.read() | |
| frm = cv2.flip(frm, 1) | |
| rgb = cv2.cvtColor(frm, cv2.COLOR_BGR2RGB) | |
| op = hand_landmark.process(rgb) | |
| if op.multi_hand_landmarks: | |
| for i in op.multi_hand_landmarks: | |
| draw.draw_landmarks(frm, i, hands.HAND_CONNECTIONS) | |
| x, y = int(i.landmark[8].x*640), int(i.landmark[8].y*480) | |
| if x < max_x and y < max_y and x > ml: | |
| if time_init: | |
| ctime = time.time() | |
| time_init = False | |
| ptime = time.time() | |
| cv2.circle(frm, (x, y), rad, (0,255,255), 2) | |
| rad -= 1 | |
| if (ptime - ctime) > 0.8: | |
| curr_tool = getTool(x) | |
| print("your current tool set to : ", curr_tool) | |
| time_init = True | |
| rad = 40 | |
| else: | |
| time_init = True | |
| rad = 40 | |
| if curr_tool == "draw": | |
| xi, yi = int(i.landmark[12].x*640), int(i.landmark[12].y*480) | |
| y9 = int(i.landmark[9].y*480) | |
| if index_raised(yi, y9): | |
| cv2.line(mask, (prevx, prevy), (x, y), 0, thick) | |
| prevx, prevy = x, y | |
| else: | |
| prevx = x | |
| prevy = y | |
| elif curr_tool == "line": | |
| xi, yi = int(i.landmark[12].x*640), int(i.landmark[12].y*480) | |
| y9 = int(i.landmark[9].y*480) | |
| if index_raised(yi, y9): | |
| if not(var_inits): | |
| xii, yii = x, y | |
| var_inits = True | |
| cv2.line(frm, (xii, yii), (x, y), (50,152,255), thick) | |
| else: | |
| if var_inits: | |
| cv2.line(mask, (xii, yii), (x, y), 0, thick) | |
| var_inits = False | |
| elif curr_tool == "rectangle": | |
| xi, yi = int(i.landmark[12].x*640), int(i.landmark[12].y*480) | |
| y9 = int(i.landmark[9].y*480) | |
| if index_raised(yi, y9): | |
| if not(var_inits): | |
| xii, yii = x, y | |
| var_inits = True | |
| cv2.rectangle(frm, (xii, yii), (x, y), (0,255,255), thick) | |
| else: | |
| if var_inits: | |
| cv2.rectangle(mask, (xii, yii), (x, y), 0, thick) | |
| var_inits = False | |
| elif curr_tool == "circle": | |
| xi, yi = int(i.landmark[12].x*640), int(i.landmark[12].y*480) | |
| y9 = int(i.landmark[9].y*480) | |
| if index_raised(yi, y9): | |
| if not(var_inits): | |
| xii, yii = x, y | |
| var_inits = True | |
| cv2.circle(frm, (xii, yii), int(((xii-x)**2 + (yii-y)**2)**0.5), (255,255,0), thick) | |
| else: | |
| if var_inits: | |
| cv2.circle(mask, (xii, yii), int(((xii-x)**2 + (yii-y)**2)**0.5), (0,255,0), thick) | |
| var_inits = False | |
| elif curr_tool == "erase": | |
| xi, yi = int(i.landmark[12].x*640), int(i.landmark[12].y*480) | |
| y9 = int(i.landmark[9].y*480) | |
| if index_raised(yi, y9): | |
| cv2.circle(frm, (x, y), 30, (0,0,0), -1) | |
| cv2.circle(mask, (x, y), 30, 255, -1) | |
| op = cv2.bitwise_and(frm, frm, mask=mask) | |
| frm[:, :, 1] = op[:, :, 1] | |
| frm[:, :, 2] = op[:, :, 2] | |
| frm[:max_y, ml:max_x] = cv2.addWeighted(tools, 0.7, frm[:max_y, ml:max_x], 0.3, 0) | |
| cv2.putText(frm, curr_tool, (270+ml,30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,255), 2) | |
| cv2.imshow("paint app", frm) | |
| if cv2.waitKey(1) == 27: | |
| cv2.destroyAllWindows() | |
| cap.release() | |
| break | |