Я реализую алгоритм обнаружения объектов, использую OpenCV для чтения живого потока с моей веб-камеры, и у меня есть общий вопрос c о том, как кадры считываются / сохраняются в памяти в процессе.
Общая структура кода выглядит примерно так:
cap = cv2.VideoCapture(0)
while(True):
# Load frame from the camera
ret, frame = cap.read()
class_IDs, scores, bounding_boxes = neural_network(frame)
cv2.imshow('window', frame)
[...]
Итак, в основном код постоянно выполняет это l oop:
- , читая один кадр с веб-камеры;
- , пропускающий этот кадр через нейронную сеть;
- , показывающий проанализированный кадр с результатами обнаружения объекта.
- после его завершения, go к следующему кадру
Анализируемый «следующий кадр», однако, не является кадром, последовательно следующим за только что обработанным, а является кадром, который в данный момент считывается из прямой трансляции с камеры.
С другой стороны, при чтении из видеофайла ВСЕ кадры считываются последовательно, поэтому увеличивается разрыв между выводом моей программы и «нормальным» потоком видео.
Как я могу воспроизвести поведение камеры при чтении файла? Другими словами, при чтении файла я хочу:
- прочитать кадр 0 в t0;
- проанализировать кадр 0, процесс занимает время delta_t;
- после обрабатывая frame0, НЕ анализировать frame1, но видеокадр, соответствующий времени t0 + delta_t
Я спрашиваю, потому что мне придется запустить детектор объектов на виртуальной машине, считывающей видеофайл с удаленной веб-камеры, и я боюсь, что если я просто отправлю видеопоток на виртуальную машину, он будет обработан как видеофайл и проанализирован последовательно, в то время как я хочу уменьшить разрыв между обнаружением объекта и живым потоком.