Эта часть вашей ошибки
size.width> 0 && size.height> 0
говорит вам, что ширина или высота вашего изображениянуль.Это означает, что frame
недопустимо и не может быть показано.Прежде чем показывать, убедитесь, что ваш frame
действителен.
Хорошо, что cam.read()
уже сообщает вам, если чтение прошло успешно, что можно прочитать в документации (cap
равно вашему cam
):
cap.read () возвращает bool (True / False).Если фрейм прочитан правильно, это будет True.Таким образом, вы можете проверить конец видео, проверив это возвращаемое значение.
Фактическое чтение и показ должны выглядеть следующим образом:
while(cap.isOpened()):
ret, frame = cap.read()
if ret==True: # frame is valid
# show the frame
cv2.imshow('frame',frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break
Полный пример с использованием вашего кода:
import cv2
cam = cv2.VideoCapture(0) # adjusted to the first device '0'
img_counter = 0
while(True):
ret, frame = cam.read()
if ret: # frame is valid
# show the frame
cv2.imshow('frame',frame)
key = cv2.waitKey(1)
if key & 0xFF == ord('s'): # s for saving
print("S hit, saving...")
img_name = "opencv_frame_{}.png".format(img_counter)
cv2.imwrite(img_name, frame)
print("{} written!".format(img_name))
img_counter += 1
if key & 0xFF == ord('q'): # q for quitting
print("Q hit, closing...")
break
else:
print("Frame not valid")
cam.release()
cv2.destroyAllWindows()
Если все ваши кадры недействительны (видеоустройство не работает), будет напечатано
«Кадр недействителен»
все время, чтобы показатьты что то не так.Я настроил параметр VideoCapture
, чтобы использовать первое видеоустройство вашей системы (отсчет начинается с 0, а не с 1).В примере используется 's' для сохранения и 'q' для выхода.