OpenCV - размер буфера при чтении с веб-камеры - PullRequest
1 голос
/ 08 апреля 2020

Я реализую алгоритм обнаружения объектов, использую 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

Я спрашиваю, потому что мне придется запустить детектор объектов на виртуальной машине, считывающей видеофайл с удаленной веб-камеры, и я боюсь, что если я просто отправлю видеопоток на виртуальную машину, он будет обработан как видеофайл и проанализирован последовательно, в то время как я хочу уменьшить разрыв между обнаружением объекта и живым потоком.

1 Ответ

0 голосов
/ 08 апреля 2020

Большой вопрос, насколько я считаю, когда вы запускаете cap.read() OpenCV захватывает кадр из буфера в тот момент и продолжает выполнять программу.

Так что, как только вы выполняете свой конвейер, кадр с камеры захватывается только при выполнении cap.read ().

Если вы хотите, чтобы кадры изображения обрабатывались последовательно относительно временного интервала, попробуйте:

  • Запустить захват и чтение в другом потоке.
  • Добавить захваченный кадр в стек.
  • Используйте кадры в стеке для выполнения вывода.
...