В opencv есть ли способ открыть .avi, который записывается и создается в реальном времени? - PullRequest
1 голос
/ 15 января 2020

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

редактировании: в настоящее время, когда я пытаюсь сделать общий c захват видео с выходным .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

, это дает me ошибка

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

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

1 Ответ

1 голос
/ 16 января 2020

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

  • Убедитесь, что значение ret равно True.
  • Увеличьте время в waitKey до значения, превышающего 1 мсек c.
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" c, и получаю предупреждающее сообщение, например: [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.

...