#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
inblue_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
и увидел точки на шине, я был уверен, что это хорошая идея.