Как сделать снимок с камеры python

Добавил пользователь Евгений Кузнецов
Обновлено: 04.10.2024

Код работает фото отсылает НО, видимо настройки с которыми делается фото не оптимальные, вечером картинка приходит нормальная, видно дорогу. а днем когда света больше картинка полностью засвеченная. Вопросов два 1. Как сделать авторизацию бота (добавить список пользователей которым можно пользоваться ботом) желательно отдельным файлом в котором прописать id пользователей. 2. Основная задача это как получать нормальную не засвеченную картинку. как то передавать параметры может яркость контрастность. Еще раз повторюсь в питон 0, если не затруднит поподробнее и попроще. В дальнейшем конечно хотелось бы функционал расширить, например передавать температуру в помещении, или например не фото а видео присылать, ну это уже мечты.

Может у кого то есть готовые наработки и он поделится, могу заплатить немного если нужно? В общем приму любую помощь.

Разбираемся, как с помощью Python и OpenCV захватывать видео с нескольких веб-камер, передавать материалы на сервер и распознавать объекты.

Пишем программу для автоматического распознавания объектов с веб-камер

В OpenCV существует множество вариантов для трансляции видеопотока. Можно использовать один из них – IP-камеры, но с ними бывает довольно трудно работать. Так, некоторые IP-камеры не позволяют получить доступ к RTSP-потоку (англ. Real Time Streaming Protocol). Другие IP-камеры не работают с функцией OpenCV cv2.VideoCapture . В конце концов, такой вариант может быть слишком дорогостоящим для ваших задач, особенно, если вы хотите построить сеть из нескольких камер.

  1. Клиент, который будет захватывать кадры с простой веб-камеры.
  2. Сервер, принимающий кадры и ищущий на них выбранные типы объектов (например, людей, собак и автомобили).

Для демонстрации работы узлов применяются четыре платы Raspberry Pi с подключенными модулями камер. На их примере мы покажем, как использовать дешевое оборудование в создании распределенной сети из камер, способных отправлять кадры на более мощную машину для дополнительной обработки.

Пишем программу для автоматического распознавания объектов с веб-камер

Начнем с того, что настроим клиенты и сервер.

Конфигурирование системы и установка необходимых пакетов

Пишем программу для автоматического распознавания объектов с веб-камер

Сначала установим opencv и ZMQ. Чтобы избежать конфликтов, развертывание проведем в виртуальной среде:

Теперь нам нужно клонировать репозиторий с ImageZMQ:

Далее, можно скопировать директорию с исходником или связать ее с вашим виртуальным окружением. Рассмотрим второй вариант:

Библиотеку ImageZMQ нужно установить и на сервер, и на каждый клиент.

Примечание: чтобы быть увереннее в правильности введенного пути, используйте дополнение через табуляцию.

Подготовка клиентов для ImageZMQ

В этом разделе мы осветим важное отличие в настройке клиентов.

Наш код будет использовать имя хоста клиента для его идентификации. Для этого достаточно и IP-адреса, но настройка имени хоста позволяет проще считать назначение клиента.

В нашем примере для определенности мы предполагаем, что вы используете Raspberry Pi с операционной системой Raspbian. Естественно, что клиент может быть построен и на другой ОС.

Чтобы сменить имя хоста, запустите терминал (это можно сделать через SSH-соединение) и введите команду raspi-config :

Вы увидите следующее окно терминала. Перейдите к пункту 2 Network Options.

Пишем программу для автоматического распознавания объектов с веб-камер

На следующем шаге выберите опцию N1 Hostname.

Пишем программу для автоматического распознавания объектов с веб-камер

На этом этапе задайте осмысленное имя хоста (например, pi-livingroom, pi-bedroom, pi-garage). Так вам будет легче ориентироваться в клиентах сети и сопоставлять имена и IP-адреса.

Пишем программу для автоматического распознавания объектов с веб-камер

Далее, необходимо согласиться с изменениями и перезагрузить систему.

В некоторых сетях вы можете подключиться через SSH, не предоставляя IP-адрес явным образом:

Определение отношений сервер-клиент

Прежде чем реализовать стриминг потокового видео по сети, определим отношения клиентов и сервера. Для начала уточним терминологию:

  • Клиент – устройство, отвечающее за захват кадров с веб-камеры с использованием OpenCV, а затем за отправку кадров на сервер.
  • Сервер — компьютер, принимающий кадры от всех клиентов.

Конечно, и сервер, и клиент могут и принимать, и отдавать какие-то данные (не только видеопоток), но для нас важно следующее:

  • Существует как минимум одна (а скорее всего, несколько) система, отвечающая за захват кадров (клиент).
  • Существует только одна система, используемая для получения и обработки этих кадров (сервер).

Структура проекта

Структура проекта будет состоять из следующих файлов:

Два первых файла из списка соответствуют файлам предобученной нейросети Caffe MobileNet SSD для распознавания объектов. В репозитории по ссылке можно найти соответствующие файлы, чьи названия, правда, могут отличаться от приведенных ( *.caffemodel и deploy.prototxt ). Сервер ( server.py ) использует эти файлы Caffe в DNN-модуле OpenCV.

Скрипт client.py будет находиться на каждом устройстве, которое отправляет поток на сервер.

Реализация клиентского стримера на OpenCV

Начнем с реализации клиента. Что он будет делать:

  1. Захватывать видеопоток с камеры (USB или RPi-модуль).
  2. Отправлять кадры по сети через ImageZMQ.

Откроем файл client.py и вставим следующий код:

Назначение импортируемых модулей описано в комментариях. В последних строчках создается объект-отправитель, которому передаются IP-адрес и порт сервера. Указанный порт 5555 обычно не вызывает конфликтов.

Инициализируем видеопоток и начнем отправлять кадры на сервер.

Теперь у нас есть объект VideoStream , созданный для захвата фреймов с RPi-камеры. Если вы используете USB-камеру, раскомментируйте следующую строку и закомментируйте ту, что активна сейчас.

В этом месте вы также можете установить разрешение камеры. Мы будем использовать максимальное, так что аргумент не передастся. Если вы обнаружите задержку, надо уменьшить разрешение, выбрав одно из доступных значений, представленных в таблице. Например:

Для USB-камеры такой аргумент не предусмотрен. В следующей строке после считывания кадра можно изменить его размер:

В последних строках скрипта происходит захват и отправка кадров на сервер.

Реализация сервера

На стороне сервера необходимо обеспечить:

  • Прием кадров от клиентов.
  • Детектирование объектов на каждом из входящих кадров.
  • Подсчет количества объектов для каждого из кадров.
  • Отображение смонтированного кадра (панели), содержащего изображения от всех активных устройств.

Последовательно заполним файл с описанием сервера server.py :

Библиотека imutils упрощает работу с изображениями (есть на GitHub и PyPi).

Пять аргументов, обрабатываемых с помощью парсера argparse :

  • --prototxt : путь к файлу прототипа глубокого изучения Caffe.
  • --model : путь к предообученной модели нейросети Caffe.
  • --confidence : порог достоверности для фильтрации случаев нечеткого обнаружения.
  • --montageW : количество столбцов для монтажа общего кадра, состоящего в нашем примере из 2х2 картинок (то есть montageW = 2) . Часть ячеек может быть пустой.
  • --montageH : аналогично предыдущему пункту — количество строк в общем кадре.

Вначале инициализируем объект ImageHub для работы с детектором объектов. Последний построен на базе MobileNet Single Shot Detector.

Объект ImageHub используется сервером для приема подключений от каждой платы Raspberry Pi. По существу, для получения кадров по сети и отправки назад подтверждений здесь используются сокеты и ZMQ .

Предположим, что в системе безопасности мы отслеживаем только три класса подвижных объектов: собаки, люди и автомобили. Эти метки мы запишем в множество CONSIDER , чтобы отфильтровать прочие неинтересные нам классы (стулья, растения и т. д.).

Кроме того, необходимо следить за активностью клиентов, проверяя время отправки тем или иным клиентом последнего кадра.

Далее необходимо зациклить потоки, поступающие от клиентов и обработку данных на сервере.

Затем мы работаем с кадром, формируя блоб (о функции blobFromImage читайте подробнее в посте pyimagesearch). Блоб передается нейросети для детектирования объектов.

Замечание: мы продолжаем рассматривать цикл, поэтому здесь и далее будьте внимательны с отступами в коде.

Теперь мы хотим пройтись по детектированным объектам, чтобы посчитать и выделить их цветными рамками:

Далее, аннотируем каждый кадр именем хоста и количеством объектов. Наконец, монтируем из нескольких кадров общую панель:

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

Запускаем стриминг видео с камер

Теперь, когда мы реализовали и клиент, и сервер, проверим их. Загрузим клиент на каждую плату Raspberry Pi с помощью SCP-протокола:

Проверьте, что на всех машинах установлены импортируемые клиентом или сервером библиотеки. Первым нужно запускать сервер. Сделать это можно следующей командой:

Далее запускаем клиенты, следуя инструкции (будьте внимательны, в вашей системе имена и адреса могут отличаться):

  1. Откройте SSH-соединение с клиентом: ssh pi@192.168.1.10
  2. Запустите экран клиента: screen
  3. Перейдите к профилю: source ~/.profile
  4. Активируйте окружение: workon py3cv4
  5. Установите ImageZMQ, следуя инструкциям библиотеки по установке
  6. Запустите клиент: python client.py --server-ip 192.168.1.5

Ниже представлено демо-видео панели с процессом стриминга и распознавания объектов с четырех камер на Raspberry Pi.

Аналогичные решения из кластера камер и сервера можно использовать и для других задач, например:

Для получения и обработки изображений Raspberry с камеры PI предназначен модуль picamera . На новой Raspberry PI первым делом необходимо включить камеру с помощью команды:


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

В этой статье мы расскажем вам как подключить внешнюю камеру к Raspberry Pi. А также как, написав небольшую программу на Python, делать фотографии, снимать видео и применять графические фильтры к изображениям.

- Как правильно подключить камеру к Raspberry Pi;
- Как управлять камерой с помощью Python;
- Как использовать start_preview() и stop_preview() для вывода изображения с камеры;
- Как делать фотографии с помощью команды capture();
- Как записывать видео с помощью start_recording() и stop_recording();
- Как просматривать видео в программе omxplayer;
- Как изменять яркость и контраст на фотографиях, а также примернять визуальные эффекты.

Для повторения примеров из статьи вам понадобится камера "Camera Module" и одна из моделей Raspberry Pi.

Камера для Raspberry Pi

Вот так выглядит модуль камеры для Raspberry Pi, приступим к подключению.

Подключение

Первым делом отсоедините питание от Raspberry Pi, найдите на плате порт для подключения камеры и аккуратно потяните его вверх за боковые выступы. Верхняя часть разъема поднимется примерно на 2 миллиметра и немного отойдет в сторону.

Опустите край кабеля от камеры в открывшийся разъем так, чтобы синяя метка была со стороны аудио разъёма, а контакты смотрели на HDMI разъём.

Аккуратно надавите на крышку разъёма для камеры и она закроется обратно. После подключения всё должно выглядеть как на фото:

Подключение камеры к разъёму на Raspberry Pi

Подключите питание, монитор, клавиатуру и мышка к Raspberry Pi и дождитесь пока система полностью загрузится. Из верхнего меню откройте основные настройки системы:

Меню Настройкаи системы

В появившемся окне перейдите во вкладку "Interfaces", выберите "Enabled" в строчке Camera и нажмите кнопку OK. После включения камеры система попросит ее перезагрузить. Перезагрузите систему. Теперь камера подключена, попробуем с ней поработать.

Просмотр изображения с камеры

Для начала работы с камерой вам необходимо запустить приложение Python 3.

Запускаем Python 3 для управления камерой

В открывшемся окне в меню выберите "New File" и скопируйте в него следующий код:

from picamera import PiCamera
from time import sleep

camera.start_preview()
sleep(10)
camera.stop_preview()

В начале этого примера мы подключаем библиотеки, необходимые для работы с камерой и временем, потом запускаем превью и через 10 секнд выключаем его.

В меню выберите "Save" (или нажмите Ctrl+S) и сохраните файл с именем camera.py в домашнюю директорию вашего пользователя (т.е. просто в ту папку, которую вам прелагает система).

Сохраняем первую программу

Для запуска программы нажимаем F5. Появится новое окно, в котором в течении следующих 10 секунд будет показано изображение с камеры. Если вы будете вращать камерой, то изображение будет двигаться. Получится примерно так:

Первое изображение с камеры Raspberry Pi

Обратите внимание на то, что изображение с камеры будет показываться на экране только если вы подключили монитор. Если вы работает удаленно через SSH или VNC, тогда вы его не увидите.

Вы можете поворачивать изображение с камеры на 90, 180 и 270 градусов. Если вам необходимо повернуть изображени, например, на 180 градусов, то перед запуском превью укажите camera.rotation = 180.

camera.rotation = 180
camera.start_preview()
sleep(10)
camera.stop_preview()

Также вы можете установить прозрачность картинки командой camera.start_preview(alpha=200). Переменная alpha обозначает степень прозрачности и может быть от 0 дл 255.

Делаем первую фотографию

Для того, чтобы сделать фотографию вам необходимо воспользоваться командой camera.capture(). Немного измените код программы:

camera.start_preview()
sleep(5)
camera.capture('/home/pi/Desktop/image.jpg')
camera.stop_preview()

Теперь ваша программа запускает превью, ждет 5 секунд, делает фото, сохраняет его на рабочий стол и закрывает превью. Между включением превью и захватом изображения нам необходимо подождать хотя бы 2 секунды, чтобы камера успела настроить уровень освещенности.

Сохраняете изменения и запускаете программу, нажав F5. На экране появится превью, а через 5 секунд на рабочам столе появится файл image.jpg с вайшей фотографией. Дважды кликните по картинке и она откроется!

Take first photo

Теперь добавьте в программу цикл и запустите ее. Она откроет превью, сделает 5 фотографий с интервалом в 5 секунд и закроет превью.

camera.start_preview()
for i in range(5):
sleep(5)
camera.capture('/home/pi/Desktop/image%s.jpg' % i)
camera.stop_preview()

На рабочем столе появится 5 фотографий. В этом цикле переменная i менялась от 0 до 4, поэтому название первой фотографии будет image0.jpg.

Записываем видео

Для съёмки видео мы будем использовать команды начала и конца записи start_recording() and stop_recording(). Немного измените нашу программу:

camera.start_preview()
camera.start_recording('/home/pi/video.h264')
sleep(10)
camera.stop_recording()
camera.stop_preview()

Запустите код кнопкой F5. Программа запустит превью и начнет записывать видео. Через 10 секунд видео закончится и будет сохранено в файл video.h264 в корневую папку вашего пользователя /home/pi/. Для просмотра видео воспользуйтесь программой omxplayer.

Откройте программу Терминал, нажав на иконку в верхнем меню:

По-умолчанию терминал открывается с локацией в домашней директории пользователя, поэтому для запуска видео вы можете просто ввести следующую команду и нажать Enter:

Откроется окно проигрывателя. Скорее всего видео будет проигрываться с более высокой скоростью, чем оно было записано, т.к. omxplayer использует большую частоту кадров.

Эффекты

Библиотека picamera для Python позволяет использовать большое количество настроект и фильтров, которые могут быть применены как к превью, так и к самой фотографии. Рассмотрим основные из них:

1. Изменение разрешения

По-умолчанию фотография делается такого разрешения, которое настроено на вашем мониторе, но вы можете его изменить с помощью команды camera.resolution(). Минимальное допустимое разрешение фотографий 64x64, а максимальное 2592x1944. Для видео оно составляет 1920x1080. Для использования максимального разрешения также необходимо будет уменьшить частоту кадров до 15 с помощью команды camera.framerate(). Для того чтобы сделать фотографию с максимальным разрешением добавьте следующие строчки перед запуском превью:

camera.resolution = (2592, 1944)
camera.framerate = 15

2. Добавление текста

Вы можете легко добавить поясняющий текст на фотографию, для этого используйте следующую команду после старта превью:

camera.annotate_text = "Hello world!"

Текст появится в верхней части фотографии. Для изменеия размера текста используйте команду camera.annotate_text_size. Размер текста можно изменять от 6 до 160, по-умолчанию используется 32.

Вы можете изменить цвет текста и фона за текстом. Для этого необходимо будет кроме PiCamera также импортировать Color

from picamera import PiCamera, Color

Для того, чтобы вывести желтый текст на синем фоне перед camera.annotate_text укажите следующий код:

camera.annotate_background = Color('blue')
camera.annotate_foreground = Color('yellow')

3. Настройка яркости и контраста

Вы можете настроить яркость на фотографии, установив ее от 0 до 100. По-умолчанию используется 50. Если вы хотите установить яркость, например, равной 70, то укажите следующий код после старта превью:

Для установки контраста используйте команду camera.contrast.

4. Визуальные эффекты

Вы можете использовать camera.image_effect для наложения большого числа различных визуальных эффетов: negative, solarize, sketch, denoise, emboss, oilpaint, hatch, gpen, pastel, watercolor, film, blur, saturation, colorswap, washedout, posterise, colorpoint, colorbalance, cartoon, deinterlace1, deinterlace2, none.

Чтобы применть эффект colorswap добавьте camera.image_effect = 'colorswap' после старта превью. С помощью следующей программы вы можете посмотреть все доступные фильтры. Код будет менять визуальные эффекты каждые 5 секунд:

camera.start_preview()
for effect in camera.IMAGE_EFFECTS:
camera.image_effect = effect
camera.annotate_text = "Effect: %s" % effect
sleep(5)
camera.stop_preview()

В результате вы получите примерно вот такой набор изображений с фильтрами:

Применение различных фильтров библиотеки picamera

5. Баланс белого

Для регулировки баланса белого вы можете использовать команду camera.awb_mode и выбрать один из нескольких режимов: off, auto, sunlight, cloudy, shade, tungsten, fluorescent, incandescent, flash и horizon. По-умолчанию используется режим auto. Например, для режима sunlight вам необходимо добавить следующий код после начала превью:

6. Экспозиция

Для выбора режима экспозиции воспользуйтесь командой camera.exposure_mode и выберите один из возможных режимов: off, auto, night, nightpreview, backlight, spotlight, sports, snow, beach, verylong, fixedfps, antishake и fireworks.

Полный список список функций и возможностей библиотеки picamera вы можете найти на официальном сайте.

Попробуйте сделать фотографии в разных режимах с применение различных фильтров. Это очень просто! В следующих статьях мы расскажем вам как сделать фотобудку для друзей или аппарат для съёмки мультиков!

Читайте также: