Updated Application File
Browse files
app.py
CHANGED
@@ -4,11 +4,11 @@ from PIL import Image
|
|
4 |
import mediapipe as mp
|
5 |
import time
|
6 |
import gradio as gr
|
|
|
7 |
|
8 |
DOMINANT_HAND = "Right"
|
9 |
|
10 |
-
|
11 |
-
width_, height_, = 256, 144
|
12 |
|
13 |
drawing_flag = False
|
14 |
sleepy_time = time.time()
|
@@ -17,25 +17,31 @@ output_frames = []
|
|
17 |
|
18 |
|
19 |
def find_hands(brain, img):
|
20 |
-
|
21 |
-
|
22 |
-
img_rgb) #
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
39 |
|
40 |
|
41 |
def is_drawing(index, thumb): # proximity function with arbitrary threshold
|
@@ -75,7 +81,7 @@ def show(video): # main
|
|
75 |
paper.fill(255)
|
76 |
|
77 |
past_holder = () # hold previous index coordinates
|
78 |
-
palette = cv2.imread('
|
79 |
|
80 |
page_num = 0 # iterating for saving (not a viable function for gradio)
|
81 |
|
@@ -83,11 +89,10 @@ def show(video): # main
|
|
83 |
|
84 |
global sleepy_time # get sleep time for multiple gestures
|
85 |
|
86 |
-
# runny = 1
|
87 |
while cam.isOpened():
|
88 |
# runny -= 1
|
89 |
x, rgb_image = cam.read()
|
90 |
-
rgb_image_f = cv2.flip(
|
91 |
|
92 |
hands = find_hands(detector, rgb_image_f)
|
93 |
|
@@ -130,16 +135,15 @@ def show(video): # main
|
|
130 |
# paper[idx_coords[0]][idx_coords[1]][3] = 255
|
131 |
cv2.circle(rgb_image_f, idx_coords, 5, color, cv2.FILLED)
|
132 |
|
133 |
-
if save(lm_list1) and time.time() - sleepy_time > 3: # save / output
|
134 |
-
|
135 |
-
|
136 |
-
|
137 |
-
|
138 |
-
|
139 |
-
|
140 |
-
|
141 |
-
|
142 |
-
return paper
|
143 |
|
144 |
if clear(lm_list1) and time.time() - sleepy_time > 3: # reset paper
|
145 |
paper = np.zeros((height, width, 3), dtype=np.uint8)
|
@@ -158,23 +162,35 @@ def show(video): # main
|
|
158 |
pass
|
159 |
|
160 |
finally:
|
161 |
-
|
162 |
-
|
163 |
-
|
164 |
-
|
165 |
-
|
166 |
-
# output_frames.append(paper)
|
167 |
-
|
168 |
-
# cv2.imshow("Image", rgb_image_f)
|
169 |
-
# cv2.imshow("paper", paper)
|
170 |
-
# key = cv2.waitKey(1)
|
171 |
-
# if key & 0xFF == ord('q') or key == 27: # Press esc or 'q' to close the image window
|
172 |
-
# break
|
173 |
|
174 |
else:
|
175 |
break
|
176 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
177 |
|
178 |
-
iface = gr.Interface(fn=show, inputs=gr.inputs.Video(source="webcam"
|
179 |
|
180 |
-
iface.launch(share=True)
|
|
|
4 |
import mediapipe as mp
|
5 |
import time
|
6 |
import gradio as gr
|
7 |
+
import glob
|
8 |
|
9 |
DOMINANT_HAND = "Right"
|
10 |
|
11 |
+
width_, height_, = 144, 96
|
|
|
12 |
|
13 |
drawing_flag = False
|
14 |
sleepy_time = time.time()
|
|
|
17 |
|
18 |
|
19 |
def find_hands(brain, img):
|
20 |
+
if img is not None:
|
21 |
+
# print(type(img))
|
22 |
+
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # opencv image is in BGR form but mp is trained with RGB
|
23 |
+
results = brain.process(
|
24 |
+
img_rgb) # process finds the hands and outputs classification and 21 landmarks for each hand
|
25 |
+
all_hands = [] # initializing array to hold the dictionary for the hands
|
26 |
+
h, w, _ = img.shape # get height and width of image for scaling
|
27 |
+
if results.multi_hand_landmarks:
|
28 |
+
for hand_type, hand_lms in zip(results.multi_handedness,
|
29 |
+
results.multi_hand_landmarks): # elegant solution for mp list object traversal
|
30 |
+
hand = {} # initializing dict for each hand
|
31 |
+
lm_list = [] # landmarks array for all 21 point of the hand
|
32 |
+
for lm in hand_lms.landmark:
|
33 |
+
px, py, pz = int(lm.x * w), int(lm.y * h), int(
|
34 |
+
lm.z * w) # scaling landmark points to image size for frame coordinates
|
35 |
+
lm_list.append([px, py, pz])
|
36 |
+
|
37 |
+
hand["lm_list"] = lm_list # add "lm_list" key for all landmark points of the hand
|
38 |
+
hand["type"] = hand_type.classification[0].label # adds the label (left/right) for the hand
|
39 |
+
all_hands.append(hand) # appends the dict
|
40 |
+
return all_hands
|
41 |
+
|
42 |
+
else:
|
43 |
+
return 0
|
44 |
+
|
45 |
|
46 |
|
47 |
def is_drawing(index, thumb): # proximity function with arbitrary threshold
|
|
|
81 |
paper.fill(255)
|
82 |
|
83 |
past_holder = () # hold previous index coordinates
|
84 |
+
palette = cv2.imread('palette_small.jpg')
|
85 |
|
86 |
page_num = 0 # iterating for saving (not a viable function for gradio)
|
87 |
|
|
|
89 |
|
90 |
global sleepy_time # get sleep time for multiple gestures
|
91 |
|
|
|
92 |
while cam.isOpened():
|
93 |
# runny -= 1
|
94 |
x, rgb_image = cam.read()
|
95 |
+
rgb_image_f = cv2.flip(rgb_image, 1) # mirrored video
|
96 |
|
97 |
hands = find_hands(detector, rgb_image_f)
|
98 |
|
|
|
135 |
# paper[idx_coords[0]][idx_coords[1]][3] = 255
|
136 |
cv2.circle(rgb_image_f, idx_coords, 5, color, cv2.FILLED)
|
137 |
|
138 |
+
# if save(lm_list1) and time.time() - sleepy_time > 3: # save / output
|
139 |
+
# paper[0:height_, w - width_: w] = 255 # presenter eraser
|
140 |
+
# paper = cv2.cvtColor(paper, cv2.COLOR_BGR2RGB)
|
141 |
+
# im = Image.fromarray(paper)
|
142 |
+
# im.save("paper%s.png" % page_num)
|
143 |
+
# print("saved")
|
144 |
+
# sleepy_time = time.time()
|
145 |
+
# paper = cv2.cvtColor(paper, cv2.COLOR_RGB2BGR)
|
146 |
+
# page_num += 1
|
|
|
147 |
|
148 |
if clear(lm_list1) and time.time() - sleepy_time > 3: # reset paper
|
149 |
paper = np.zeros((height, width, 3), dtype=np.uint8)
|
|
|
162 |
pass
|
163 |
|
164 |
finally:
|
165 |
+
if True:
|
166 |
+
rgb_image_f[0:48, ] = palette # 48 small
|
167 |
+
presenter = cv2.resize(rgb_image_f, (width_, height_))
|
168 |
+
h, w, _ = rgb_image_f.shape
|
169 |
+
paper[0:height_, w - width_: w] = presenter
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
170 |
|
171 |
else:
|
172 |
break
|
173 |
|
174 |
+
paper = cv2.cvtColor(paper, cv2.COLOR_RGB2BGR)
|
175 |
+
im = Image.fromarray(paper)
|
176 |
+
output_frames.append(paper)
|
177 |
+
im.save("paper%s.png" % page_num)
|
178 |
+
page_num += 1
|
179 |
+
|
180 |
+
img_array = []
|
181 |
+
for filename in glob.glob('*.png'):
|
182 |
+
imggg = cv2.imread(filename)
|
183 |
+
img_array.append(imggg)
|
184 |
+
|
185 |
+
video_output = cv2.VideoWriter('any.webm', cv2.VideoWriter_fourcc(*'VP80'), 30, (640, 480))
|
186 |
+
|
187 |
+
for i in range(len(img_array)):
|
188 |
+
video_output.write(img_array[i])
|
189 |
+
video_output.release()
|
190 |
+
|
191 |
+
return 'any.webm'
|
192 |
+
|
193 |
|
194 |
+
iface = gr.Interface(fn=show, inputs=gr.inputs.Video(source="webcam"), outputs='video')
|
195 |
|
196 |
+
iface.launch(share=True, enable_queue=True)
|