In this chapter, we are going to learn about tracking an object in a live video. We will discuss the different characteristics that can be used to track an object. We will also learn about the different methods and techniques for object tracking.
By the end of this chapter, you will know:
This is, possibly, the simplest technique we can use to see what parts of the video are moving. When we consider a live video stream, the difference between successive frames gives us a lot of information. The concept is fairly straightforward! We just take the difference between successive frames and display the differences.
If I move my laptop rapidly from left to right, we will see something like this:
If I rapidly move the TV remote in my hand, it will look something like this:
As you can see from the previous images, only the moving parts in the video get highlighted. This gives us a good starting point to see what areas are moving in the video. Here is the code to do this:
import cv2 # Compute the frame difference def frame_diff(prev_frame, cur_frame, next_frame): # Absolute difference between current frame and next frame diff_frames1 = cv2.absdiff(next_frame, cur_frame) # Absolute difference between current frame and # previous frame diff_frames2 = cv2.absdiff(cur_frame, prev_frame) # Return the result of bitwise 'AND' between the # above two resultant images return cv2.bitwise_and(diff_frames1, diff_frames2) # Capture the frame from webcam def get_frame(cap): # Capture the frame ret, frame = cap.read() # Resize the image frame = cv2.resize(frame, None, fx=scaling_factor, fy=scaling_factor, interpolation=cv2.INTER_AREA) # Return the grayscale image return cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY) if __name__=='__main__': cap = cv2.VideoCapture(0) scaling_factor = 0.5 prev_frame = get_frame(cap) cur_frame = get_frame(cap) next_frame = get_frame(cap) # Iterate until the user presses the ESC key while True: # Display the result of frame differencing cv2.imshow("Object Movement", frame_diff(prev_frame, cur_frame, next_frame)) # Update the variables prev_frame = cur_frame cur_frame = next_frame next_frame = get_frame(cap) # Check if the user pressed ESC key = cv2.waitKey(10) if key == 27: break cv2.destroyAllWindows()