Let us see how to draw the movement of objects captured by the webcam using OpenCV. Our program takes the video input from the webcam and tracks the objects we are moving. After identifying the objects, it will make contours precisely. After that, it will print all your drawing on the output screen.
python3
# importing the modules import cv2 import numpy as np # set Width and Height of output Screen frameWidth = 640 frameHeight = 480 # capturing Video from Webcam cap = cv2.VideoCapture( 0 ) cap. set ( 3 , frameWidth) cap. set ( 4 , frameHeight) # set brightness, id is 10 and # value can be changed accordingly cap. set ( 10 , 150 ) # object color values myColors = [[ 5 , 107 , 0 , 19 , 255 , 255 ], [ 133 , 56 , 0 , 159 , 156 , 255 ], [ 57 , 76 , 0 , 100 , 255 , 255 ], [ 90 , 48 , 0 , 118 , 255 , 255 ]] # color values which will be used to paint # values needs to be in BGR myColorValues = [[ 51 , 153 , 255 ], [ 255 , 0 , 255 ], [ 0 , 255 , 0 ], [ 255 , 0 , 0 ]] # [x , y , colorId ] myPoints = [] # function to pick color of object def findColor(img, myColors, myColorValues): # converting the image to HSV format imgHSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) count = 0 newPoints = [] # running for loop to work with all colors for color in myColors: lower = np.array(color[ 0 : 3 ]) upper = np.array(color[ 3 : 6 ]) mask = cv2.inRange(imgHSV,lower,upper) x, y = getContours(mask) # making the circles cv2.circle(imgResult, (x,y), 15 , myColorValues[count], cv2.FILLED) if x ! = 0 and y ! = 0 : newPoints.append([x,y,count]) count + = 1 return newPoints # contours function used to improve accuracy of paint def getContours(img): _, contours, hierarchy = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) x, y, w, h = 0 , 0 , 0 , 0 # working with contours for cnt in contours: area = cv2.contourArea(cnt) if area > 500 : peri = cv2.arcLength(cnt, True ) approx = cv2.approxPolyDP(cnt, 0.02 * peri, True ) x, y, w, h = cv2.boundingRect(approx) return x + w / / 2 , y # draws your action on virtual canvas def drawOnCanvas(myPoints, myColorValues): for point in myPoints: cv2.circle(imgResult, (point[ 0 ], point[ 1 ]), 10 , myColorValues[point[ 2 ]], cv2.FILLED) # running infinite while loop so that # program keep running until we close it while True : success, img = cap.read() imgResult = img.copy() # finding the colors for the points newPoints = findColor(img, myColors, myColorValues) if len (newPoints)! = 0 : for newP in newPoints: myPoints.append(newP) if len (myPoints)! = 0 : # drawing the points drawOnCanvas(myPoints, myColorValues) # displaying output on Screen cv2.imshow( "Result" , imgResult) # condition to break programs execution # press q to stop the execution of program if cv2.waitKey( 1 ) and 0xFF = = ord ( 'q' ): break |
Output :