Получение ошибки: videoio (MSMF): сбой вызова async ReadSample () со статусом ошибки: -2147023169 «спамит меня вместе с ошибкой« не удается прочитать кадр »» - PullRequest
0 голосов
/ 25 сентября 2018

Это мой код:

import cv2 .  
from threading import Timer

name = 1
time = 1

def pic():
    time = +1
    cam = cv2.VideoCapture(0)
    retval, frame = cam.read()
    if retval != True:
    raise ValueError("Can't read frame")

    cv2.imwrite('img' + name + '.png', frame)
    name = name + 1

while time != 4:
t = Timer(time, pic)
t.start()

Этот код должен снимать 4 картинки с интервалом в одну секунду, но все, что я получаю, это ошибка, упомянутая выше, и "возникла неизвестная исключительная ситуация C ++!"когда я пытаюсь запустить его, он замедляет весь мой компьютер и продолжает выдавать все больше и больше ошибок.Заранее спасибо!

1 Ответ

0 голосов
/ 18 ноября 2018

Хорошо, я смог исправить проблемы с вашим кодом (их было несколько):

import cv2
from threading import Timer

def pic():
    global name
    cam = cv2.VideoCapture(0+cv2.CAP_DSHOW)
    retval, frame = cam.read()
    if retval != True:
        print("Can't read frame")
    cv2.imwrite('img' + str(name) + '.png', frame)
    name = name + 1

if __name__ == '__main__':
    name = 1
    time = 0

    while time != 4:
        t = Timer(1, pic)
        t.start()
        t.join()
        time=time+1

Проблемы:

  1. ошибка: videoio (MSMF): асинхронный вызов ReadSample () завершился неудачно с состоянием ошибки: -2147023169 «спам на меня вместе с« невозможно прочитать кадр »

    Это происходит потому, что ваш компьютер по умолчаниюиспользует API-интерфейс MSMF (Microsoft Media Media Foundation) для захвата вашей камеры по умолчанию. В API-интерфейсе может быть какая-то ошибка, поэтому вы всегда можете сделать снимок, используя другой API, явно указав его, как я сделал. Для получения дополнительной информации GOTO: https://docs.opencv.org/3.4/d0/da7/videoio_overview.html

  2. Рекомендуется использовать if __name__ == '__main__': всякий раз, когда вы используете многопроцессорные или многопоточные классы

  3. Если вы не передаетепеременная, определенная в разделе main(), тогда вам нужно определить ее как global в вызываемой функции.

  4. Нельзя снова и снова вызывать один и тот же поток, не закрывая его t.join()делает именно это

  5. cv2.imwrite() не принимает числовое значение, поэтому вам нужно преобразовать целое число (name) в строку

...