Creating Air Canvas Using Python-OpenCV: A Comprehensive Overview
As a B.Tech student embarking on an exciting project to create an Air Canvas using Python and OpenCV, it’s essential to understand the underlying principles, potential applications, development costs, and current industry trends related to this innovative technology. This blog post aims to provide a comprehensive overview of the AI Air Canvas concept and its implications.
What is AI Air Canvas?
AI Air Canvas is an innovative technological concept that allows users to create and manipulate digital content in a three-dimensional space, essentially transforming the air around them into an interactive canvas. This technology leverages several key components, including computer vision, gesture recognition, and augmented reality (AR).
At its core, AI Air Canvas utilizes OpenCV (Open Source Computer Vision Library), a powerful library in Python that enables real-time image processing and computer vision tasks. By employing techniques such as image segmentation, motion detection, and machine learning, the system can recognize and interpret user gestures, allowing for seamless interaction with digital content.
The underlying principles of AI Air Canvas include:
Future Applications of AI Air Canvas
The potential applications of AI Air Canvas are vast and span multiple industries and domains. Here are some promising use cases:
Development Costs and Challenges
Developing an AI Air Canvas system involves various costs and technical challenges that need to be considered. Here are some of the typical expenses and hurdles:
Recommended by LinkedIn
Development Costs
Technical Challenges
Phython3
import numpy as np
import cv2
from collections import deque
# default called trackbar function
def setValues(x):
print("")
# 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)
cv2.createTrackbar("Upper Value", "Color detectors",
255, 255, setValues)
cv2.createTrackbar("Lower Hue", "Color detectors",
64, 180, 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.uint8)
# 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)]
colorIndex = 0
# Here is code for Canvas setup
paintWindow = np.zeros((471, 636, 3)) + 255
cv2.namedWindow('Paint', cv2.WINDOW_AUTOSIZE)
# Loading the default webcam of PC.
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")
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)
cv2.putText(frame, "RED", (420, 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)
center = None
# Ifthe 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
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
paintWindow[67:, :, :] = 255
elif 160 <= center[0] <= 255:
colorIndex = 0 # Blue
elif 275 <= center[0] <= 370:
colorIndex = 1 # Green
elif 390 <= center[0] <= 485:
colorIndex = 2 # Red
elif 505 <= center[0] <= 600:
colorIndex = 3 # Yellow
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
else:
bpoints.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])):
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)
cv2.imshow("mask", Mask)
# If the 'q' key is pressed then stop the application
if cv2.waitKey(1) & 0xFF == ord("q"):
break
# Release the camera and all resources
cap.release()
cv2.destroyAllWindows()
Output
Current Industry Usage and Trends
As of now, AI Air Canvas technology is still in its nascent stages, but several industries are beginning to explore its potential. Here are some current applications and emerging trends:
Conclusion
AI Air Canvas represents a fascinating convergence of technology and creativity, offering a glimpse into the future of human-computer interaction. With its potential applications across education, healthcare, art, gaming, and more, the technology holds significant promise for transforming how we engage with digital content.
Kabir, your insights on using OpenCV for real-time image processing are fascinating! Since you're diving deep into AI, you might find this event interesting too: Join AI CERTs for a free webinar on "Mastering AI Development: Building Smarter Applications with Machine Learning" on March 20, 2025. Anyone interested can register here: https://bit.ly/y-development-machine-learning, and participation certificates will be provided!