OpenCV-Python: как получить последний кадр из видеопотока в реальном времени или пропустить старые.

Я интегрировал IP-камеру с OpenCV в Python, чтобы выполнять покадровую обработку видео из живого потока. Я настроил FPS камеры как 1 секунду, чтобы я мог получать 1 кадр в секунду в буфере для обработки, но моему алгоритму требуется 4 секунды для обработки каждого кадра, что вызывает застой необработанного кадра в буфере, который продолжает расти со временем и вызывая экспоненциальную задержку. Чтобы разобраться в этом, я создал еще один поток, в котором я вызываю API cv2.grab () для очистки буфера, он перемещает указатель на последний кадр при каждом вызове. В основном потоке я вызываю метод retrieve (), который дает мне последний кадр, захваченный первым потоком. Благодаря этой конструкции проблема застоя кадра устранена и экспоненциальная задержка удалена, но все же постоянная задержка в 12-13 секунд не может быть устранена. Я подозреваю, что когда вызывается cv2.retrieve (), он получает не последний кадр, а 4-й или 5-й кадр из последнего кадра. Есть ли какой-либо API в OpenCV или какой-либо другой шаблон проектирования, чтобы исправить эту проблему, чтобы я мог получить последний кадр для обработки.

Заранее спасибо за помощь. Я очень признателен за быстрый ответ.


person Hemant Mahsky    schedule 25.07.2017    source источник
comment
Зачем вам нужен большой буфер, если ваш алгоритм потребляет медленнее, чем производится информация. Я предлагаю использовать буфер только с двумя слотами для изображений. Один из записи с камеры (буфер записи, только одно изображение) и другой чтение для обработки (буфер чтения, только одно изображение). Перезаписать буфер записи на новое изображение с камеры.   -  person harshkn    schedule 09.08.2017
comment
@harshkn, подскажите, пожалуйста, как уменьшить размер буфера? Я попробовал video.set (cv2.CAP_PROP_BUFFERSIZE, 1) на моем Raspberry Pi с Ubuntu 16.04. В результате появилось сообщение VIDEOIO ERROR: V4L2: setting property # 38 is not supported True   -  person Muhammad Abdullah    schedule 31.10.2017


Ответы (1)


Если вы не против пойти на компромисс по скорости. вы можете создать генератор Python, который открывает камеру и возвращает кадр.

def ReadCamera(Camera):
    while True:
        cap = cv2.VideoCapture(Camera)
        (grabbed, frame) = cap.read()
        if grabbed == True:
            yield frame

Теперь, когда вы хотите обработать кадр.

for frame in ReadCamera(Camera):
      .....

Это прекрасно работает. кроме открытия и закрытия камеры добавляется время.

person amitnair92    schedule 21.05.2019