Track objects with Camshift using OpenCV - GeeksforGeeks

10 Feb, 2020
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 npimport cv2 as cv    # Read the input videocap = cv.VideoCapture('sample.mp4')  # take first frame of the# videoret, frame = cap.read()  # setup initial region of# trackerx, y, width, height = 400, 440, 150, 150track_window = (x, y,                 width, height)  # set up the Region of# Interest for trackingroi = frame[y:y + height,            x : x + width]  # convert ROI from BGR to# HSV formathsv_roi = cv.cvtColor(roi,                      cv.COLOR_BGR2HSV)  # perform masking operationmask = 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 ptterm_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 objectcap.release()  # close all opened windowscv.destroyAllWindows()
Output:
Python-OpenCV
Python
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Comments
Old Comments
How to Install PIP on Windows ?
How to drop one or multiple columns in Pandas Dataframe
Python OOPs Concepts
Python | Get unique values from a list
Check if element exists in list in Python
Python Classes and Objects
Python | os.path.join() method
How To Convert Python Dictionary To JSON?
Python | Pandas dataframe.groupby()
Create a directory in Python