Программа отслеживания объектов не показывает отслеживаемые точки в выходном изображении

#python #numpy #cv2

#python #numpy #cv2

Вопрос:

Мне нужно отслеживать объект в видеокадре, но для этого мне нужно инициализировать хорошие функции для отслеживания моего объекта. Итак, у меня есть файл .mp4, я сохранил синий канал первого кадра и получил первый кадр. Затем я продолжил создавать свою двоичную маску, извлекая интересующую меня область из первого кадра, и было указано, что мой ROI находится в пределах [300,400] по оси y и [460,550] по оси x (которая является передней стороной шины).

Затем я инициализировал 10 угловых точек, используя cv2.goodFeaturesToTrack уровень качества 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)
 

Комментарии:

1. cv2 выдает изображение как numpy array , и вам не нужно преобразовывать numpy array в numpy array in blue_ch = np.array(blue_ch) .

2. сначала вы можете проверить, что вы получаете в переменных — т.е.. print( prev_pts ) и print(x,y) . Возможно, вы просто не видите эти круги, потому что они маленькие или имеют тот же цвет, что и фон. Вы пытались нарисовать их на оригинале frame с RGB помощью?

3. когда я рисую круги на исходном RGB frame (и отображаю frame ), я вижу маленькие красные точки в левом верхнем углу. На blue_ch них они маленькие и похожи на фон, поэтому я их не вижу.

Ответ №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()    
 

Комментарии:

1. Спасибо, я даже не осознавал, что точки были там. Однако я не знаю, почему они были расположены в верхнем левом углу, есть ли для этого причина? Потому что я бы не подумал о добавлении этих двух строк y = 300 и y = 460, чтобы правильно разместить мои точки на передней части шины.

2. Я никогда не использовал goodFeaturesToTrack , но когда я увидел точки в углу, но вы сказали, что получаете the front side of the bus , я догадался, что он может вычислять положение относительно внутренней области [300:400, 460:550] , и когда я добавил 300 460 и увидел точки на шине, я был уверен, что это хорошая идея.