В opencv есть ли способ открыть .avi, который записывается и создается в реальном времени?

У меня есть приложение для записи с камеры, которое берет изображение с камеры и записывает и сохраняет вывод изображения с камеры в виде файла .avi, который я могу воспроизводить и делать все, что когда-либо делало запись. Я хочу создать код opencv в реальном времени, который может принимать эти файлы .avi, которые создаются в реальном времени, открывать их, манипулировать ими и выполнять некоторую классификацию в реальном времени. Есть ли способ для opencv открыть эти .avi, когда они пишутся? предпочтительно Python, но также и реализация C ++? Это будет сделано на windows10.

редактировать: в настоящее время, когда я пытаюсь сделать общий захват видео с выходом .avi с CV2 как

cap = cv2.VideoCapture('out.avi')
ret, frame = cap.read()

while(True):
    ret, frame = cap.read()
    cv2.imshow('frame', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

это дает мне ошибку

Traceback (most recent call last):
  File "video_grab.py", line 15, in <module>
    cv2.imshow('frame', frame)
cv2.error: OpenCV(4.1.2) C:projectsopencv- 
pythonopencvmoduleshighguisrcwindow.cpp:376: error: (-215:Assertion 
failed) size.width>0 && size.height>0 in function 'cv::imshow'

где утверждение ошибочно, скорее всего, так как видео имеет размер 0 на 0, а захват останавливается и сохраняется.

Всего 1 ответ


Следующее решение может работать или нет, в зависимости от кодека файла AVI:

  • Убедитесь, что значение ret равно True .
  • Увеличьте время в waitKey до значения, превышающего 1 мсек.
import cv2

cap = cv2.VideoCapture('out.avi')

frame_period = 100  # 100msec - assume frame rate is about 10Hz

while(True):
    ret, frame = cap.read()

    if ret:
        cv2.imshow('frame', frame)

    if cv2.waitKey(frame_period) & 0xFF == ord('q'):
        break

Я тестирую его, используя кодек «Motion JPEG», и получаю предупреждающее сообщение, например: [mjpeg @ 000002a22394b0e0] overread 8 , при чтении с большей скоростью, чем фактическая частота кадров.

Вы также можете попробовать начать читать быстро и уменьшить скорость, когда ret = False :

frame_period = 1  # Start reading fast (wait only 1msec)

while(True):
    ret, frame = cap.read()

    if ret:
        cv2.imshow('frame', frame)
    else:
        frame_period = 100 # Reduce the rate to 10Hz when reaching end of file.  

    if cv2.waitKey(frame_period) & 0xFF == ord('q'):
        break

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


Есть идеи?

10000