Ошибка OpenCV при попытке захвата кадра каждые секунды

#python #opencv #runtime-error

#python #opencv #время выполнения -ошибка

Вопрос:

Я пытаюсь захватывать изображение каждые 5 секунд в Opencv с помощью моей веб-камеры, однако при каждой попытке я получаю сообщение об ошибке.

Код Python:

 def imgcap():
    cap = cv2.VideoCapture(0)
    framerate = cap.get(5)
    x=1

    while(True):
        # Capture frame-by-frame
        ret, frame = cap.read()
        if ret:
            # Our operations on the frame come here

            filename = 'Captures/capture'    str(int(x))   ".png"
            x=x 1
            cv2.imwrite(filename, frame)
            time.sleep(5)
            if cv2.waitKey(1) amp; 0xFF == ord('q'):
                break
        else:
            print("Ret False")

    # When everything done, release the capture
    cap.release()
    cv2.destroyAllWindows()

imgcap()

imgcap()
 

Ошибка, которую я получаю:

   File "vision.py", line 30, in <module>
    imgcap()
  File "vision.py", line 21, in imgcap
    cv2.imwrite(filename, frame)
cv2.error: OpenCV(4.5.1) C:UsersappveyorAppDataLocalTemp1pip-req-build-oduouqigopencvmodulesimgcodecssrcloadsave.cpp:753: error: (-215:Assertion failed) !_img.empty() in function 'cv::imwrite'
 

Ответ №1:

Проблема в том, что вы выпускаете cap экземпляр внутри цикла. Вы не сможете читать cap со 2-й итерации:

 while(True):
    # Capture frame-by-frame
    ret, frame = cap.read()
    
    # comment this
    # cap.release()
    # Our operations on the frame come here

    filename = 'Captures/capture'    str(int(x))   ".png"
    #... other code
 

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

1. Поэтому удалите первый cap.release() . Тот, который сразу после ret, frame = cap.read() ?

2. @Reacher42 да, выпускайте экземпляр только тогда, когда закончите с ним, т. Е. Сохраните предыдущий cv2.destroyAllWindows() . Также проверьте ret == True , успешно ли cap.read() это.

3. Всякий раз, когда я запускаю этот код (я обновил его в сообщении), он просто загружается в мою командную строку бесконечно. что я сделал не так?

4. Вы можете (только) прервать цикл, нажав q клавишу, указанную в вашем коде.

5. Но окно, в котором оно должно отображаться, больше даже не появляется, что наводит меня на мысль, что есть проблема