#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()