Vejamos como desenhar o movimento de objetos capturados pela webcam usando OpenCV. Nosso programa pega a entrada de vídeo da webcam e rastreia os objetos que estamos movendo. Depois de identificar os objetos, ele fará os contornos com precisão. Depois disso, ele imprimirá todo o seu desenho na tela de saída.

import cv2 
import numpy as np 
   
frameWidth = 640
frameHeight = 480
   
cap = cv2.VideoCapture(0) 
cap.set(3, frameWidth) 
cap.set(4, frameHeight) 
   
cap.set(10,150) 
    
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]] 
   
myColorValues = [[51, 153, 255],           
                 [255, 0, 255], 
                 [0, 255, 0],            
                 [255, 0, 0]] 
myPoints = []   
     
def findColor(img, myColors, myColorValues): 
  
    
    imgHSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) 
    count = 0
    newPoints = [] 
       
    
    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) 
        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 
    
   
def getContours(img): 
    _, contours, hierarchy = cv2.findContours(img, cv2.RETR_EXTERNAL, 
                                              cv2.CHAIN_APPROX_NONE) 
    x, y, w, h = 0, 0, 0, 0
       
    
    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 
    
   
def drawOnCanvas(myPoints, myColorValues): 
    for point in myPoints: 
        cv2.circle(imgResult, (point[0], point[1]), 
                   10, myColorValues[point[2]], cv2.FILLED) 
    
while True: 
    success, img = cap.read() 
    imgResult = img.copy() 
  
    
    newPoints = findColor(img, myColors, myColorValues) 
    if len(newPoints)!= 0: 
        for newP in newPoints: 
            myPoints.append(newP) 
    if len(myPoints)!= 0: 
        drawOnCanvas(myPoints, myColorValues) 
    
    
    cv2.imshow("Result", imgResult) 
       
    
    
    if cv2.waitKey(1) and 0xFF == ord('q'):  
        break