OpenCV / Python вылетает после воспроизведения видео

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

import cv2
cap = cv2.VideoCapture('C:\Users\wg\174037210.avi')
while(cap.isOpened()):
    ret, frame = cap.read()
    cv2.imshow('Video', frame)
    if cv2.waitKey(75) & 0xFF == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()

который представляет собой простой ванильный код отображения видео, я получаю эту ошибку после завершения видео:

Traceback (последний вызов последним): файл «C: /Users/wg/python/video-test.py», строка 15, в cv2.imshow ('Video', frame) cv2.error: OpenCV (3.4.3) C: \ projects \ opencv-python \ opencv \ modules \ highgui \ src \ window.cpp: 356: error: (-215: Assertion failed) size.width> 0 && size.height> 0 в функции 'cv :: imshow '

Окружение выглядит следующим образом:
Windows 7 Professional
Python 3.6.5
OpenCV 3.4.3

Любая помощь приветствуется. Спасибо!


person W Busse    schedule 09.01.2019    source источник
comment
Вы пробовали использовать другой файл? Ошибка в основном означает, что вы показываете пустое изображение или, в данном случае, пустой фрейм.   -  person DirtyBit    schedule 09.01.2019
comment
Я попробовал 3 или 4 видео, и все они дали один и тот же результат - вылет.   -  person W Busse    schedule 09.01.2019
comment
Хорошо, я изменил кое-что и опубликовал ответ. посмотрим, поможет ли это?   -  person DirtyBit    schedule 09.01.2019
comment
Попробуйте использовать видео, которое заканчивается на .mp4   -  person Rishabh Jhalani    schedule 09.01.2019


Ответы (1)


Дайте ему шанс:

import cv2

video = cv2.VideoCapture(filePath)   
frames_counter = 1

while True:
    frames_counter = frames_counter + 1
    check, frame = video.read()
    # print(frame)
    # print(check)
    if check:
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        cv2.imshow("Capturing", gray)
        key = cv2.waitKey(1)
    else:
        break

print("Number of frames in the video: ", frames_counter)
video.release()
cv2.destroyAllWindows()
person DirtyBit    schedule 09.01.2019
comment
Большой! Ваш код работал. Почему пример кода не работал, а ваш код работал? Похоже, вы проверяете, содержит ли фрейм данные, иначе он остановится. Если это необходимо, почему в примере кода учебного руководства эта проверка и обработка ошибок отсутствуют? - person W Busse; 09.01.2019
comment
@WBusse Perfect! хорошо. Я не знаю, за какой серией вы следовали, но для меня было более разумным сначала проверить фрейм и отобразить только в том случае, если это произойдет. Вы можете отметить ответ, чтобы принять ответ, ура! - person DirtyBit; 09.01.2019
comment
if check == True: может быть просто if check:. В образце кода произошел сбой, потому что к концу видео frame is None не может быть отображено imshow, как указано в ошибке утверждения - person Quang Hoang; 09.01.2019
comment
@QuangHoang отмечен и исправлен! :) - person DirtyBit; 09.01.2019