Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update main.py #290

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
168 changes: 38 additions & 130 deletions AirCanvas/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,9 @@
import cv2
from collections import deque



# default called trackbar function
def setValues():
print(" ")

pass

# Creating the trackbars needed for
# adjusting the marker colour These
# trackbars will be used for setting
# the upper and lower ranges of the
# HSV required for particular colour
cv2.namedWindow("Color detectors")
cv2.createTrackbar("Upper Hue", "Color detectors", 153, 180, setValues)
cv2.createTrackbar("Upper Saturation", "Color detectors", 255, 255, setValues)
Expand All @@ -22,186 +13,103 @@ def setValues():
cv2.createTrackbar("Lower Saturation", "Color detectors", 72, 255, setValues)
cv2.createTrackbar("Lower Value", "Color detectors", 49, 255, setValues)

# Giving different arrays to handle colour
# points of different colour These arrays
# will hold the points of a particular colour
# in the array which will further be used
# to draw on canvas
bpoints = [deque(maxlen=1024)]
gpoints = [deque(maxlen=1024)]
rpoints = [deque(maxlen=1024)]
ypoints = [deque(maxlen=1024)]

# These indexes will be used to mark position
# of pointers in colour array
blue_index = 0
green_index = 0
red_index = 0
yellow_index = 0

# The kernel to be used for dilation purpose
kernel = np.ones((5, 5), np.uint16)

# The colours which will be used as ink for
# the drawing purpose
colors = [(255, 0, 0), (0, 255, 0),(0, 0, 255), (0, 255, 255)]
blue_index = green_index = red_index = yellow_index = 0
kernel = np.ones((5, 5), np.uint8)
colors = [(255, 0, 0), (0, 255, 0), (0, 0, 255), (0, 255, 255)]
colorIndex = 0

# Here is code for Canvas setup
paintWindow = np.zeros((471, 636, 3)) + 255
paintWindow = cv2.rectangle(paintWindow, (40,1), (140,65), (0,0,0), 2)
paintWindow = cv2.rectangle(paintWindow, (160,1), (255,65), colors[0], -1)
paintWindow = cv2.rectangle(paintWindow, (275,1), (370,65), colors[1], -1)
paintWindow = cv2.rectangle(paintWindow, (390,1), (485,65), colors[2], -1)
paintWindow = cv2.rectangle(paintWindow, (505,1), (600,65), colors[3], -1)
paintWindow = cv2.rectangle(paintWindow, (40, 1), (140, 65), (0, 0, 0), 2)
for i, color in enumerate(colors):
paintWindow = cv2.rectangle(paintWindow, (160 + 115 * i, 1), (255 + 115 * i, 65), color, -1)

cv2.putText(paintWindow, "CLEAR", (49, 33), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 0), 2, cv2.LINE_AA)
cv2.putText(paintWindow, "BLUE", (185, 33), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2, cv2.LINE_AA)
cv2.putText(paintWindow, "GREEN", (298, 33), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2, cv2.LINE_AA)
cv2.putText(paintWindow, "RED", (420, 33), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2, cv2.LINE_AA)
cv2.putText(paintWindow, "YELLOW", (520, 33), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (150,150,150), 2, cv2.LINE_AA)
cv2.namedWindow('Paint', cv2.WINDOW_AUTOSIZE)
for i, text in enumerate(["BLUE", "GREEN", "RED", "YELLOW"]):
cv2.putText(paintWindow, text, (185 + 115 * i, 33), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2, cv2.LINE_AA)

# Loading the default webcam of PC.
cv2.namedWindow('Paint', cv2.WINDOW_AUTOSIZE)
cap = cv2.VideoCapture(0)

# Keep looping
while True:

# Reading the frame from the camera
ret, frame = cap.read()

# Flipping the frame to see same side of yours
frame = cv2.flip(frame, 1)
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

# Getting the updated positions of the trackbar
# and setting the HSV values
u_hue = cv2.getTrackbarPos("Upper Hue","Color detectors")
u_saturation = cv2.getTrackbarPos("Upper Saturation","Color detectors")
u_value = cv2.getTrackbarPos("Upper Value","Color detectors")
l_hue = cv2.getTrackbarPos("Lower Hue","Color detectors")
l_saturation = cv2.getTrackbarPos("Lower Saturation","Color detectors")
l_value = cv2.getTrackbarPos("Lower Value","Color detectors")
u_hue = cv2.getTrackbarPos("Upper Hue", "Color detectors")
u_saturation = cv2.getTrackbarPos("Upper Saturation", "Color detectors")
u_value = cv2.getTrackbarPos("Upper Value", "Color detectors")
l_hue = cv2.getTrackbarPos("Lower Hue", "Color detectors")
l_saturation = cv2.getTrackbarPos("Lower Saturation", "Color detectors")
l_value = cv2.getTrackbarPos("Lower Value", "Color detectors")
Upper_hsv = np.array([u_hue, u_saturation, u_value])
Lower_hsv = np.array([l_hue, l_saturation, l_value])

# Adding the colour buttons to the live frame
# for colour access
frame = cv2.rectangle(frame, (40, 1), (140, 65),(122, 122, 122), -1)
frame = cv2.rectangle(frame, (160, 1), (255, 65),colors[0], -1)
frame = cv2.rectangle(frame, (275, 1), (370, 65),colors[1], -1)
frame = cv2.rectangle(frame, (390, 1), (485, 65),colors[2], -1)
frame = cv2.rectangle(frame, (505, 1), (600, 65),colors[3], -1)

cv2.putText(frame, "CLEAR ALL", (49, 33),cv2.FONT_HERSHEY_SIMPLEX, 0.5,(255, 255, 255), 2, cv2.LINE_AA)

cv2.putText(frame, "BLUE", (185, 33),cv2.FONT_HERSHEY_SIMPLEX, 0.5,(255, 255, 255), 2, cv2.LINE_AA)

cv2.putText(frame, "GREEN", (298, 33),cv2.FONT_HERSHEY_SIMPLEX, 0.5,(255, 255, 255), 2, cv2.LINE_AA)
frame = cv2.rectangle(frame, (40, 1), (140, 65), (122, 122, 122), -1)
for i, color in enumerate(colors):
frame = cv2.rectangle(frame, (160 + 115 * i, 1), (255 + 115 * i, 65), color, -1)

cv2.putText(frame, "RED", (420, 33),cv2.FONT_HERSHEY_SIMPLEX, 0.5,(255, 255, 255), 2, cv2.LINE_AA)
cv2.putText(frame, "CLEAR ALL", (49, 33), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2, cv2.LINE_AA)
for i, text in enumerate(["BLUE", "GREEN", "RED", "YELLOW"]):
cv2.putText(frame, text, (185 + 115 * i, 33), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2, cv2.LINE_AA)

cv2.putText(frame, "YELLOW", (520, 33),cv2.FONT_HERSHEY_SIMPLEX, 0.5,(150, 150, 150), 2, cv2.LINE_AA)

# Identifying the pointer by making its
# mask
Mask = cv2.inRange(hsv, Lower_hsv, Upper_hsv)
Mask = cv2.erode(Mask, kernel, iterations=1)
Mask = cv2.morphologyEx(Mask, cv2.MORPH_OPEN, kernel)
Mask = cv2.dilate(Mask, kernel, iterations=1)

# Find contours for the pointer after
# identifying it
_,cnts,_ = cv2.findContours(Mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts, _ = cv2.findContours(Mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
center = None

# If the contours are formed
if len(cnts) > 0:
# sorting the contours to find biggest
cnt = sorted(cnts, key=cv2.contourArea, reverse=True)[0]

# Get the radius of the enclosing circle
# around the found contour
((x, y), radius) = cv2.minEnclosingCircle(cnt)

# Draw the circle around the contour
(x, y), radius = cv2.minEnclosingCircle(cnt)
cv2.circle(frame, (int(x), int(y)), int(radius), (0, 255, 255), 2)

# Calculating the center of the detected contour
M = cv2.moments(cnt)
center = (int(M['m10'] / M['m00']), int(M['m01'] / M['m00']))

# Now checking if the user wants to click on
# any button above the screen
if center[1] <= 65:

# Clear Button
if 40 <= center[0] <= 140:
bpoints = [deque(maxlen=512)]
gpoints = [deque(maxlen=512)]
rpoints = [deque(maxlen=512)]
ypoints = [deque(maxlen=512)]

blue_index = 0
green_index = 0
red_index = 0
yellow_index = 0

blue_index = green_index = red_index = yellow_index = 0
paintWindow[67:, :, :] = 255
elif 160 <= center[0] <= 255:
colorIndex = 0 # Blue
colorIndex = 0
elif 275 <= center[0] <= 370:
colorIndex = 1 # Green
colorIndex = 1
elif 390 <= center[0] <= 485:
colorIndex = 2 # Red
colorIndex = 2
elif 505 <= center[0] <= 600:
colorIndex = 3 # Yellow
colorIndex = 3
else:
if colorIndex == 0:
bpoints[blue_index].appendleft(center)
elif colorIndex == 1:
gpoints[green_index].appendleft(center)
elif colorIndex == 2:
rpoints[red_index].appendleft(center)
elif colorIndex == 3:
ypoints[yellow_index].appendleft(center)

# Append the next deques when nothing is
# detected to avoid messing up
[bpoints, gpoints, rpoints, ypoints][colorIndex][[blue_index, green_index, red_index, yellow_index][colorIndex]].appendleft(center)
else:
bpoints.append(deque(maxlen=512))
for points in [bpoints, gpoints, rpoints, ypoints]:
points.append(deque(maxlen=512))
blue_index += 1
gpoints.append(deque(maxlen=512))
green_index += 1
rpoints.append(deque(maxlen=512))
red_index += 1
ypoints.append(deque(maxlen=512))
yellow_index += 1

# Draw lines of all the colors on the
# canvas and frame
points = [bpoints, gpoints, rpoints, ypoints]
for i in range(len(points)):

for j in range(len(points[i])):

for k in range(1, len(points[i][j])):
for i, color in enumerate(colors):
for j in range(len([bpoints, gpoints, rpoints, ypoints][i])):
for k in range(1, len([bpoints, gpoints, rpoints, ypoints][i][j])):
if [bpoints, gpoints, rpoints, ypoints][i][j][k - 1] and [bpoints, gpoints, rpoints, ypoints][i][j][k]:
cv2.line(frame, [bpoints, gpoints, rpoints, ypoints][i][j][k - 1], [bpoints, gpoints, rpoints, ypoints][i][j][k], color, 2)
cv2.line(paintWindow, [bpoints, gpoints, rpoints, ypoints][i][j][k - 1], [bpoints, gpoints, rpoints, ypoints][i][j][k], color, 2)

if points[i][j][k - 1] is None or points[i][j][k] is None:
continue

cv2.line(frame, points[i][j][k - 1], points[i][j][k], colors[i], 2)
cv2.line(paintWindow, points[i][j][k - 1], points[i][j][k], colors[i], 2)

# Show all the windows
cv2.imshow("Tracking", frame)
cv2.imshow("Paint", paintWindow)

if cv2.waitKey(4) & 0xFF == ord("q"):
break

# Release the camera and all resources
cap.release()
cv2.destroyAllWindows()