对象跟踪程序不在输出图像中显示跟踪点

Object tracking program does not show tracked points in the output image

我需要跟踪视频帧中的对象,但为此我必须初始化良好的功能来跟踪我的对象。 所以,我有一个 .mp4 文件,我保留了第一帧的蓝色通道并获得了第一帧。然后我继续通过从第一帧中提取我感兴趣的区域来创建我的二进制掩码,并且指定我的 ROI 位于 y 轴的 [300,400] 和 x 轴的 [460,550] 范围内(这是正面公共汽车)。

然后我使用 cv2.goodFeaturesToTrack 初始化了 10 个角点,质量级别为 0.01,角点之间的最小允许距离为 10 像素。然后我尝试在 RGB 图像上显示这些点,但是我没有得到任何点。至于为什么我不知道。 此处显示:

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)

它在左上角创建小黄点。它们与背景颜色相似,因此您可能看不到它们。

当我在 RGB 上绘制时 frame 然后我得到红点,您可以在图像上看到这些点

如果我在绘图前将 blue_ch 转换为 RBG

blue_ch = cv2.cvtColor(blue_ch, cv2.COLOR_GRAY2RGB)

那我明白了

你得到 mask = blue_ch[300:400, 460:550] 所以当我添加

y += 300
x += 460 

然后我在正确的地方得到了点


我的代码:

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()