Невозможно прочитать файлы MP4 и avi в OpenCV Python

#python #opencv

#python #opencv

Вопрос:

Я хочу просто прочитать и отобразить видео MP4 с помощью OpenCV, я написал для этого следующий базовый код:

 import cv2

input_video_path = './Input Video/Input_video1.mp4'

cap = cv2.VideoCapture(input_video_path)

while(cap.isOpened()):
    ret, frame = cap.read()
    print(frame, ret)
    cv2.imshow("frame", frame)

cap.release()
cv2.destroyAllWindows()
 

Когда я запускаю его, он считывает первые несколько кадров, а затем все остальные кадры None :

 [[[  7  14  27]
  [  7  14  27]
  [  7  14  27]
  ...
  ...
  [ 60  57  64]
  [ 70  62  64]
  [ 72  64  66]]] True
None False
Traceback (most recent call last):
  File "D:/Project/ML IP and Coding/Cynapto_Task/exploring_face_detection_methods.py", line 10, in <module>
    cv2.imshow("frame", frame)
cv2.error: OpenCV(3.4.2) C:Miniconda3conda-bldopencv-suite_1534379934306workmoduleshighguisrcwindow.cpp:356: error: (-215:Assertion failed) size.width>0 amp;amp; size.height>0 in function 'cv::imshow'
 

Я также напечатал ret переменную, которая подтверждает то же поведение. Я пробовал с 2-3 разными видео и даже с .avi форматом, но получил тот же результат.

Я искал решение в Интернете, но смог найти только информацию о кодеках и установке кодеков в моей виртуальной среде. Я не очень разбираюсь в форматах и кодеках видеофайлов.

Может кто-нибудь помочь мне с этим?

Я использую:

Python 3.7, ОС: Windows, среда: conda, OpenCV v4.5.0

Комментарии:

1. Вы знаете, сколько кадров имеет ваше входное видео? Вы можете получить это с помощью следующего: int(cap.get(cv2.CAP_PROP_FRAME_COUNT))

2. Хорошо, я попробую, также позже я хочу записать то же видео на диск с заданной частотой кадров в секунду, знаете ли вы какую-либо функцию, которая может это сделать. Заранее спасибо!

Ответ №1:

Если вы получили ret as False , это означает, что видео достигает конечного кадра. Если видео не завершено, но вы получили False , оно, вероятно, сломано.

Попробуйте этот код:

 import cv2

input_video_path = './Input Video/Input_video1.mp4'

cap = cv2.VideoCapture(input_video_path)

while(cap.isOpened()):
    ret, frame = cap.read()
    print(frame, ret)
    if ret:
        cv2.imshow("frame", frame)
        cv2.waitKey(1)
    else:
        break

cap.release()
cv2.destroyAllWindows()