I need to track an object in a video frame but to do so I have to initialize good features to track my object. So, I have a .mp4 file, I retained the blue channel of the first frame and I obtained the first frame. I then went on to create my binary mask by extracting my region of interest from the first frame and it was specified that my ROI lies within [300,400] on the y-axis and [460,550] x-axis (which is the front side of the bus).
I then initialized 10 corner points by using cv2.goodFeaturesToTrack
having a quality level of 0.01 and a minimum allowable distance of 10 pixels between corner points. I then tried to display these points on the RGB image however I am not getting any points. The reason as to why I do not know.
This is shown here:
import numpy as np import cv2 import matplotlib.pyplot as plt vid = cv2.VideoCapture('Bus.mp4') ret, frame = vid.read() frame = cv2.cvtColor(frame,cv2.COLOR_BGR2RGB) blue_ch = frame[:,:,2] mask = blue_ch[300:400,460:550] prev_pts = cv2.goodFeaturesToTrack(image = mask,maxCorners=10,qualityLevel=0.01,minDistance=10,blockSize=10) blue_ch = np.array(blue_ch) for i in prev_pts: x,y = i.ravel() cv2.circle(blue_ch,(x,y),3,255,-1) plt.imshow(blue_ch)
Advertisement
Answer
It creates small yellow dots in top left corner. They are similar to background color so you may not see them.
When I draw on RGB frame
then I get red dots which you can see on image
If I convert blue_ch
to RBG
before drawing
blue_ch = cv2.cvtColor(blue_ch, cv2.COLOR_GRAY2RGB)
then I see
You get mask = blue_ch[300:400, 460:550]
so when I add
y += 300 x += 460
then I get dots in correct place
My code:
import numpy as np import cv2 import matplotlib.pyplot as plt vid = cv2.VideoCapture('Bus.mp4') ret, frame = vid.read() frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) blue_ch = frame[:, :, 2] mask = blue_ch[300:400, 460:550] prev_pts = cv2.goodFeaturesToTrack(image=mask, maxCorners=10, qualityLevel=0.01, minDistance=10, blockSize=10) blue_ch = cv2.cvtColor(blue_ch, cv2.COLOR_GRAY2RGB) #blue_ch = np.array(blue_ch) for i in prev_pts: x, y = i.ravel() y += 300 x += 460 #print(x, y) cv2.circle(frame, (int(x), int(y)), 3, 255, -1) cv2.circle(blue_ch, (int(x), int(y)), 3, 255, -1) # --- display with matplot --- plt.imshow(frame) plt.show() plt.imshow(blue_ch) plt.show() # -- OR display with `cv2` --- frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) blue_ch = cv2.cvtColor(blue_ch, cv2.COLOR_BGR2RGB) cv2.imshow('frame', frame) cv2.imshow('blue_ch', blue_ch) print("Press ESC to exit") try: while cv2.waitKey(1) != 27: # ESC pass except: cv2.destroyAllWindows()