Air-Art

Guessing what it can do? It draws what you draw in front of the webcam, real-time by means of a 2D arm.

AdvancedFull instructions provided20 hours5,081
Air-Art

Things used in this project

Hardware components

Arduino UNO
Arduino UNO
×1
Hitec HS485HB Servo
×1
Camera (generic)
×1
Jumper wires (generic)
Jumper wires (generic)
×1
9V battery (generic)
9V battery (generic)
×1

Software apps and online services

OpenCV
OpenCV
Arduino IDE
Arduino IDE
Idle-Python

Hand tools and fabrication machines

Driller
Hacksaw

Story

Read more

Schematics

Air-Art Connection

Code

Tracking Colour in HSV Scale

Python
The minimum and the maximum values for any colour can be found using this code.
import numpy as np
import cv2
 
cap = cv2.VideoCapture(0)
def nothing(x):    #used in trackbars
    pass
cv2.namedWindow('Trackbar')
cv2.createTrackbar('Hl','Trackbar',0,255,nothing)
cv2.createTrackbar('Sl','Trackbar',0,255,nothing)
cv2.createTrackbar('Vl','Trackbar',0,255,nothing)
cv2.createTrackbar('HU','Trackbar',0,255,nothing)
cv2.createTrackbar('SU','Trackbar',0,255,nothing)
cv2.createTrackbar('VU','Trackbar',0,255,nothing)
##hl=0
##sl=0
##vl=0
##hu=255
##su=255
##vu=255
##
##cv2.setTrackbarPos('Hl','Trackbar',hl)
##cv2.setTrackbarPos('Sl','Trackbar',sl)
##cv2.setTrackbarPos('Vl','Trackbar',vl)
##cv2.setTrackbarPos('HU','Trackbar',hu)
##cv2.setTrackbarPos('SU','Trackbar',su)
##cv2.setTrackbarPos('VU','Trackbar',vu)
 
while(True):
    # Capture frame-by-frame
    ret, frame = cap.read()
    if(ret==0):
        continue
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    hl=cv2.getTrackbarPos('Hl','Trackbar')
    sl=cv2.getTrackbarPos('Sl','Trackbar')
    vl=cv2.getTrackbarPos('Vl','Trackbar')
    hu=cv2.getTrackbarPos('HU','Trackbar')
    su=cv2.getTrackbarPos('SU','Trackbar')
    vu=cv2.getTrackbarPos('VU','Trackbar')
    upper=(hu,su,vu)
    lower=(hl,sl,vl)
    print np.shape(hl)
    # Our operations on the frame come here
     
    cnv = cv2.inRange(hsv, lower,upper)
     
    # Display the resulting frame
    cv2.imshow('output',cnv)
    cv2.imshow('frame',frame)
    if cv2.waitKey(1)==27:
        break
 
# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()

Tracing a Coloured Object

Python
It traces the movement of the ball and gives the user experience what they draw.
# import the necessary packages
from collections import deque
import numpy as np
import argparse
import imutils
import cv2
  
# construct the argument parse and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-v", "--video",
    help="path to the (optional) video file")
ap.add_argument("-b", "--buffer", type=int, default=64,
    help="max buffer size")
args = vars(ap.parse_args())
# define the lower and upper boundaries of the "green"
# ball in the HSV color space, then initialize the
# list of tracked points
greenLower = (29, 86, 6)
greenUpper = (64, 255, 255)
pts = deque(maxlen=args["buffer"])
  
# if a video path was not supplied, grab the reference
# to the webcam
if not args.get("video", False):
    camera = cv2.VideoCapture(0)
  
# otherwise, grab a reference to the video file
else:
    camera = cv2.VideoCapture(args["video"])
 
# keep looping
while True:
    # grab the current frame
    (grabbed, frame) = camera.read()
  
    # if we are viewing a video and we did not grab a frame,
    # then we have reached the end of the video
    if args.get("video") and not grabbed:
        break
  
    # resize the frame, blur it, and convert it to the HSV
    # color space
    frame = imutils.resize(frame, width=600)
    # blurred = cv2.GaussianBlur(frame, (11, 11), 0)
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
  
    # construct a mask for the color "green", then perform
    # a series of dilations and erosions to remove any small
    # blobs left in the mask
    mask = cv2.inRange(hsv, greenLower, greenUpper)
    mask = cv2.erode(mask, None, iterations=2)
    mask = cv2.dilate(mask, None, iterations=2)
     
    # find contours in the mask and initialize the current
    # (x, y) center of the ball
    cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL,
        cv2.CHAIN_APPROX_SIMPLE)[-2]
    center = None
  
    # only proceed if at least one contour was found
    if len(cnts) > 0:
        # find the largest contour in the mask, then use
        # it to compute the minimum enclosing circle and
        # centroid
        c = max(cnts, key=cv2.contourArea)
        ((x, y), radius) = cv2.minEnclosingCircle(c)
        M = cv2.moments(c)
        center = (int(M["m10"] / M["m00"]), int(M["m01"] / M["m00"]))
  
        # only proceed if the radius meets a minimum size
        if radius > 10:
            # draw the circle and centroid on the frame,
            # then update the list of tracked points
            cv2.circle(frame, (int(x), int(y)), int(radius),
                (0, 255, 255), 2)
            cv2.circle(frame, center, 5, (0, 0, 255), -1)
  
    # update the points queue
    pts.appendleft(center)
        # loop over the set of tracked points
    for i in xrange(1, len(pts)):
        # if either of the tracked points are None, ignore
        # them
        if pts[i - 1] is None or pts[i] is None:
            continue
  
        # otherwise, compute the thickness of the line and
        # draw the connecting lines
        thickness = int(np.sqrt(args["buffer"] / float(i + 1)) * 2.5)
        cv2.line(frame, pts[i - 1], pts[i], (0, 0, 255), thickness)
  
    # show the frame to our screen
     
    cv2.imshow("Frame", frame)
    key = cv2.waitKey(1) & 0xFF
  
    # if the 'q' key is pressed, stop the loop
    if key == ord("q"):
        break
  
# cleanup the camera and close any open windows
camera.release()
cv2.destroyAllWindows()

Credits

Akash Ravichandran

Akash Ravichandran

15 projects • 98 followers
Developer and a Learner
Keerthana Sankar

Keerthana Sankar

1 project • 2 followers

Comments