Я использую плотный код оптического потока для отслеживания объекта в видео. Это в основном дает маску объекта пиксель за пикселем. То, что я хочу найти, это ограничивающий прямоугольник или координаты объекта с использованием величины и угла. Я знаю, что есть формула для вычисления координат по амплитуде, т.е. Величина * Косинус (Угол), но не совсем уверен, как использовать это в коде, поскольку выходные данные величины и угла находятся в матричной форме.
import cv2 as cv
import numpy as np
%matplotlib inline
from matplotlib import pyplot as plt
cap = cv.VideoCapture("C:/Users/Akash Jain/Downloads/yolo-object-detection/videos/overpass.mp4")
ret, first_frame = cap.read()
prev_gray = cv.cvtColor(first_frame, cv.COLOR_BGR2GRAY)
mask = np.zeros_like(first_frame)
mask[..., 1] = 255
while(cap.isOpened()):
ret, frame = cap.read()
gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
flow = cv.calcOpticalFlowFarneback(prev_gray, gray, None, 0.5, 3, 15, 3, 5, 1.2, 0)
magnitude, angle = cv.cartToPolar(flow[..., 0], flow[..., 1])
mask[..., 0] = angle * 180 / np.pi / 2
mask[..., 2] = cv.normalize(magnitude, None, 0, 255, cv.NORM_MINMAX)
rgb = cv.cvtColor(mask, cv.COLOR_HSV2BGR)
figure = plt.figure(figsize=(15,15))
plt.imshow(frame)
plt.show()
figure = plt.figure(figsize=(15,15))
plt.imshow(rgb)
plt.show()
prev_gray = gray
if cv.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv.destroyAllWindows()
Нужна ваша помощь, чтобы вычислить ограничивающую рамку объекта или найти координаты.
Ниже приведен вывод, который я получаю для каждого кадра.
Ввод:
Выход: