Как на самом деле работает захват изображений с помощью Pygame? - PullRequest
0 голосов
/ 27 мая 2018

Моя цель - настроить веб-камеру с Raspberry Pi, которая будет активна в течение определенного времени (скажем, 2 минуты).В течение этого времени я смогу в любое время сделать снимок и сохранить его в папке.Я решил работать с Pygame.Мой проект о захвате изображения, как только датчик сработал, поэтому он должен быть очень отзывчивым.

В соответствии с документацией для камеры Pygame здесь написано:

open()

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

get_image()

Извлекает изображение из буфера в качестве поверхности RGB.При желании он может повторно использовать существующую поверхность, чтобы сэкономить время.Глубина в битах поверхности равна либо 24 битам, либо такой же, как у опционально поставляемой поверхности.

Так что для моего случая get_image(), кажется, просто вытаскивает первое изображение, снятое после start() был вызван.У меня вопрос, как я могу достичь буфера со всеми захваченными изображениями или как на самом деле работает захват?Я не могу найти решение для захвата и сохранения неподвижного изображения (в любое время) после того, как я позвоню start() и stop() на камеру Pygame.Поскольку функция start() запускается в течение нескольких секунд, она просто слишком медленная, чтобы просто вызывать start(), get_image() и stop() друг за другом.Любая помощь или предложения будут оценены.

Смотрите мой код Python ниже:

def activateCapturing:
    pygame.init()
    pygame.camera.init()
    cam = pygame.camera.Camera("/dev/video0",(320,180))
    cam.start()

    pngdata = None
    imageAsbytes = []
    activated = True

    while activated:
        if readSensor():
            img = cam.get_image()
            pygame.image.save(img, "/tmp/image.png")
            activated = False

     with open("/tmp/image.png", 'rb') as f:
            pngdata = f.read()
            imageAsbytes = bytearray(pngdata)

    cam.stop()
    return imageAsbytes

Заранее спасибо!

1 Ответ

0 голосов
/ 27 мая 2018

Вы просто не останавливаете камеру после захвата одного изображения.

См. https://www.pygame.org/docs/tut/CameraIntro.html.

get_image() получает изображение, которое камера в данный момент видит из буфера - буфер НЕ является "всеми изображениями с момента запуска ()", а просто просматриваемыми в данный моментобраз.

Вы используете stop() после 3 секунд «окна захвата», чтобы прекратить копирование большего количества изображений.

Если вы после исполнения, вы можете прокрутить эту страницу вниз и просмотреть раздел о Захват живого потока - если вы сделали то же самое (без отображения потока) и просто сохранили 1 изображение на диск при необходимости, вы должны получить приличную частоту кадров.

Api: get_image ()

...