cv2.VideoCapture не работает в ноутбуке Jupyter - PullRequest
0 голосов
/ 01 декабря 2019

В настоящее время я пытаюсь провести некоторую классификацию видео и использую anaconda вместе с ноутбуком jupyter для обучения данных. Тем не менее, я сталкиваюсь с ошибкой в ​​блокноте jupyter, когда я не могу прочитать в своих видеокадрах с помощью cv2.VideoCapture, но каким-то образом он работает в терминале моей среды conda.

Это моя файловая структура, This is my file structure

Это ошибка, с которой я сейчас сталкиваюсь, This is the error I'm currently encountering

Терминал в той же среде анаконды работает нормально, Terminal in the same anaconda environment works fine

Я где-то читал, что это может быть связано с проблемой с conda и ffmepg, но я пробовал много решений, предложенных другими для решения этой проблемы, включая загрузку opencv из самого opencv.org и настройкупеременные пути к среде вместо использования conda install, но она все еще не работает.

Кто-нибудь знает, как решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 21 декабря 2019

Простите, если я ошибаюсь, но я заметил, что вы не используете одно и то же имя файла в двух ваших тестах. Я застрял в одной и той же точке, пока не понял, что путь и имя файла не совпадают между моим «терминальным тестом» и тестом ноутбука Юпитера. Я подтвердил, что jupyter может получить доступ к файлу.

!file data/TownCentreXVID.avi

Затем попытался снова, и у него не было проблем с получением тех же результатов от jupyter. подтвердить доступ к файлу

прочитать первое изображение

0 голосов
/ 01 декабря 2019

OpenCV в Python позволяет вам захватывать кадры с веб-камеры / или из видеофайла (как в вашем случае) в виде массива Numpy, изменять его, а затем отображать его с помощью cv2.imshow () OpenCV. Для этого OpenCV создаст окно и вставит туда кадры. Тем не менее, это не будет работать в ноутбуке IPython.

Чтобы отобразить в блокноте jupyter или любом другом блокноте IPython, вам придется использовать функцию

IPython.display.Image(data)

, а не imshow OpenCV ().

Воткусок кода, который вы можете использовать:

cam = cv2.VideoCapture(0)

d = IPython.display.display("", display_id=1)
d2 = IPython.display.display("", display_id=2)
while True:
    try:
        t1 = time.time()
        frame = get_frame(cam)
        frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

        im = array_to_image(frame)

        d.update(im)

        t2 = time.time()

        s = f"""{int(1/(t2-t1))} FPS"""
        d2.update( IPython.display.HTML(s) )
    except KeyboardInterrupt:
        print()
        cam.release()
        IPython.display.clear_output()
        print ("Stream stopped")
        break


def get_frame(cam):
    # Capture frame-by-frame
    ret, frame = cam.read()

    #flip image for natural viewing
    frame = cv2.flip(frame, 1)

    return frame
#Use 'jpeg' instead of 'png' (~5 times faster)
def array_to_image(a, fmt='jpeg'):
    #Create binary stream object
    f = BytesIO()

    #Convert array to binary stream object
    PIL.Image.fromarray(a).save(f, fmt)

    return IPython.display.Image(data=f.getvalue())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...