-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathvirtual_painter.py
124 lines (98 loc) · 3.62 KB
/
virtual_painter.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
import cv2
import numpy as np
import time
import os
import HandTrackingModule as htm
#######################
brushThickness = 25
eraserThickness = 150
#######################
folderPath = "Header"
myList = os.listdir(folderPath)
# print(myList)
overlayList = []
for imPath in myList:
image = cv2.imread(f'{folderPath}/{imPath}')
overlayList.append(image)
# print(len(overlayList))
header = overlayList[0]
drawColor = (255, 0, 255)
camwidth = 1280 #1280
camheight = 720 #720
cap = cv2.VideoCapture(0)
cap.set(3, camwidth)
cap.set(4, camheight)
detector = htm.handDetector(detectionCon=0.65,maxHands=1)
xp, yp = 0, 0
imgCanvas = np.zeros((camheight, camwidth, 3), np.uint8)
while True:
# 1. Import image
success, img = cap.read()
img = cv2.flip(img, 1)
# 2. Find Hand Landmarks
img = detector.findHands(img)
lmList = detector.findPosition(img, draw=False)
# print(lmList)
if len(lmList) != 0 and len(lmList[0]) != 0:
# print(lmList[0][8])
# tip of index and middle fingers
x1, y1 = lmList[0][8][1:]
x2, y2 = lmList[0][12][1:]
# 3. Check which fingers are up
fingers = detector.fingersUp()
# print(fingers)
# 4. If Selection Mode - Two finger are up
if fingers[1] and fingers[2]:
xp, yp = 0, 0
print("Selection Mode")
# # Checking for the click
if y1 < 125:
if 250 < x1 < 450:
header = overlayList[0]
drawColor = (255, 0, 255)
elif 550 < x1 < 750:
header = overlayList[1]
drawColor = (255, 0, 0)
elif 800 < x1 < 950:
header = overlayList[2]
drawColor = (0, 255, 0)
elif 1050 < x1 < 1200:
header = overlayList[3]
drawColor = (0, 0, 0)
cv2.rectangle(img, (x1, y1 - 25), (x2, y2 + 25), drawColor, cv2.FILLED)
# 5. If Drawing Mode - Index finger is up
if fingers[1] and fingers[2] == False:
cv2.circle(img, (x1, y1), 15, drawColor, cv2.FILLED)
print("Drawing Mode")
if xp == 0 and yp == 0:
xp, yp = x1, y1
cv2.line(imgCanvas, (xp, yp), (x1, y1), drawColor, brushThickness)
if drawColor == (0,0,0):
cv2.line(imgCanvas, (xp, yp), (x1, y1), drawColor, eraserThickness)
# if drawColor == (0, 0, 0):
# cv2.line(img, (xp, yp), (x1, y1), drawColor, eraserThickness)
# cv2.line(imgCanvas, (xp, yp), (x1, y1), drawColor, eraserThickness)
#
# else:
# cv2.line(img, (xp, yp), (x1, y1), drawColor, brushThickness)
# cv2.line(imgCanvas, (xp, yp), (x1, y1), drawColor, brushThickness)
xp, yp = x1, y1
# Clear Canvas when all fingers are up
if all (x >= 1 for x in fingers):
imgCanvas = np.zeros((720, 1280, 3), np.uint8)
# imgGray = cv2.cvtColor(imgCanvas, cv2.COLOR_BGR2GRAY)
# _, imgInv = cv2.threshold(imgGray, 50, 255, cv2.THRESH_BINARY_INV)
# imgInv = cv2.cvtColor(imgInv,cv2.COLOR_GRAY2BGR)
# img = cv2.bitwise_and(img,imgInv)
# img = cv2.bitwise_or(img,imgCanvas)
# Setting the header image
img[0:125, 0:camwidth] = header
img = cv2.addWeighted(img,0.5,imgCanvas,0.5,0)
cv2.imshow("Image", img)
cv2.imshow("IMage_canvas",imgCanvas)
# cv2.imshow("Canvas", imgCanvas)
# cv2.imshow("Inv", imgInv)
if cv2.waitKey(1) & 0xFF==ord('q') :
break
cv2.destroyAllWindows()
cap.release()