Open In App

Track objects with Camshift using OpenCV

OpenCV is the huge open-source library for computer vision, machine learning, and image processing and now it plays a major role in real-time operation which is very important in today’s systems. By using it, one can process images and videos to identify objects, faces, or even the handwriting of a human. Camshift or we can say Continuously Adaptive Meanshift is an enhanced version of the meanshift algorithm which provides more accuracy and robustness to the model. With the help of Camshift algorithm, the size of the window keeps updating when the tracking window tries to converge. The tracking is done by using the color information of the object. Also, it provides the best fitting tracking window for object tracking. It applies meanshift first and then updates the size of the window as:

   

It then calculates the best fitting ellipse to it and again applies the meanshift with the newly scaled search window and the previous window. This process is continued until the required accuracy is met. Note: For more information about meanshift refer to Python OpenCV: Meanshift Below is the implementation.
import numpy as np
import cv2 as cv
  
  
# Read the input video
cap = cv.VideoCapture('sample.mp4')
  
# take first frame of the
# video
ret, frame = cap.read()
  
# setup initial region of
# tracker
x, y, width, height = 400, 440, 150, 150
track_window = (x, y, 
                width, height)
  
# set up the Region of
# Interest for tracking
roi = frame[y:y + height,
            x : x + width]
  
# convert ROI from BGR to
# HSV format
hsv_roi = cv.cvtColor(roi,
                      cv.COLOR_BGR2HSV)
  
# perform masking operation
mask = cv.inRange(hsv_roi, 
                  np.array((0., 60., 32.)),
                  np.array((180., 255., 255)))
  
roi_hist = cv.calcHist([hsv_roi], 
                       [0], mask,
                       [180], 
                       [0, 180])
  
cv.normalize(roi_hist, roi_hist,
             0, 255, cv.NORM_MINMAX)
  
  
# Setup the termination criteria, 
# either 15 iteration or move by
# atleast 2 pt
term_crit = ( cv.TERM_CRITERIA_EPS | 
             cv.TERM_CRITERIA_COUNT, 15, 2)
  
  
while(1):
      
    ret, frame = cap.read()
      
    # Resize the video frames.
    frame = cv.resize(frame, 
                      (720, 720), 
                      fx = 0, fy = 0,
                      interpolation = cv.INTER_CUBIC)
      
    cv.imshow('Original', frame)
  
    # perform thresholding on 
    # the video frames
    ret1, frame1 = cv.threshold(frame,
                                180, 155,
                                cv.THRESH_TOZERO_INV)
  
    # convert from BGR to HSV
    # format.
    hsv = cv.cvtColor(frame1, 
                      cv.COLOR_BGR2HSV)
  
    dst = cv.calcBackProject([hsv], 
                             [0], 
                             roi_hist, 
                             [0, 180], 1)
      
    # apply Camshift to get the 
    # new location
    ret2, track_window = cv.CamShift(dst,
                                     track_window,
                                     term_crit)
  
    # Draw it on image
    pts = cv.boxPoints(ret2)
      
    # convert from floating
    # to integer
    pts = np.int0(pts)
  
    # Draw Tracking window on the
    # video frame.
    Result = cv.polylines(frame, 
                          [pts], 
                          True
                          (0, 255, 255), 
                          2)
  
    cv.imshow('Camshift', Result)
  
    # set ESC key as the
    # exit button.
    k = cv.waitKey(30) & 0xff
      
    if k == 27:
        break
          
  
# Release the cap object
cap.release()
  
# close all opened windows
cv.destroyAllWindows()

                    
Output:
Article Tags :