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: