«Произошло исключение: ошибка» в cv2.imshow - PullRequest
0 голосов
/ 25 апреля 2019

Я только что попытался создать простой код компьютерного зрения, который был скопирован с какого-либо веб-сайта с использованием python 3.6.6 и openCV4.1.0, но есть ошибка, в чем моя вина?

в каждом "cv2.imshow" всегда есть какая-то ошибка

import cv2

cam = cv2.VideoCapture(1)

cv2.namedWindow("test")

img_counter = 0

while True:
    ret, frame = cam.read()
    cv2.imshow("test", frame)
    if not ret:
        break
    k = cv2.waitKey(1)

    if k%256 == 27:
        # ESC pressed
        print("Escape hit, closing...")
        break
    elif k%256 == 32:
        # SPACE pressed
        img_name = "opencv_frame_{}.png".format(img_counter)
        cv2.imwrite(img_name, frame)
        print("{} written!".format(img_name))
        img_counter += 1

cam.release()

cv2.destroyAllWindows()

должно скомпилироваться на моем ноутбуке как веб-камера. но вот что я получил:

Exception has occurred: error
OpenCV(4.1.0) ../modules/highgui/src/window.cpp:352: error: (-215:Assertion failed) size.width>0 && size.height>0 in function 'imshow'

Ответы [ 2 ]

2 голосов
/ 25 апреля 2019

Здесь необходимо помнить, что всякий раз, когда вы выполняете операцию cv2.imshow() в цикле while True, должна использоваться следующая структура:

while True: 
    r, f = cam.read()
    if r: 
        cv2.imshow("f", f)
        if cv2.waitkey(1) & 0xff == ord('q'):
            break 

Затем вы можете построить всю логику своего приложениявокруг этой базовой структуры.

0 голосов
/ 25 апреля 2019

Эта часть вашей ошибки

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' для выхода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...