【问题标题】:Object tracking program does not show tracked points in the output image对象跟踪程序在输出图像中不显示跟踪点
【发布时间】:2021-05-13 13:38:17
【问题描述】:

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

然后,我使用 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)

【问题讨论】:

  • cv2 将图像作为numpy array 提供,您不必在blue_ch = np.array(blue_ch) 中将numpy array 转换为numpy array
  • 首先你可以检查你在变量中得到了什么——即。 print( prev_pts )print(x,y)。也许您根本看不到这些圆圈,因为它们很小或者它们与背景颜色相同。您是否尝试在原始 frameRGB 上绘制它们?
  • 当我在原始 RGB frame 上绘制圆圈(并显示 frame)时,我会在左上角看到小红点。在blue_ch 上,它们很小并且与背景相似,所以我看不到它们。

标签: python numpy cv2


【解决方案1】:

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

当我在 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()    

【讨论】:

  • 谢谢,我什至没有意识到要点在那里。但是我不知道为什么它们位于左上角,有什么原因吗?因为我不会考虑添加这两行 y+=300 和 y+=460 来正确地将我的点放在公共汽车的前面。
  • 我从来没有用过goodFeaturesToTrack,但是当我看到角落里的点但你说你得到the front side of the bus然后我猜它可以计算区域内的相对位置[300:400, 460:550],当我添加@987654337 @ 和 460 我在公共汽车上看到点然后我确定这是个好主意。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-01
  • 1970-01-01
  • 2017-06-28
  • 2021-09-28
  • 1970-01-01
相关资源
最近更新 更多