Как сделать снимок с камеры python
Код работает фото отсылает НО, видимо настройки с которыми делается фото не оптимальные, вечером картинка приходит нормальная, видно дорогу. а днем когда света больше картинка полностью засвеченная. Вопросов два 1. Как сделать авторизацию бота (добавить список пользователей которым можно пользоваться ботом) желательно отдельным файлом в котором прописать id пользователей. 2. Основная задача это как получать нормальную не засвеченную картинку. как то передавать параметры может яркость контрастность. Еще раз повторюсь в питон 0, если не затруднит поподробнее и попроще. В дальнейшем конечно хотелось бы функционал расширить, например передавать температуру в помещении, или например не фото а видео присылать, ну это уже мечты.
Может у кого то есть готовые наработки и он поделится, могу заплатить немного если нужно? В общем приму любую помощь.
Разбираемся, как с помощью Python и OpenCV захватывать видео с нескольких веб-камер, передавать материалы на сервер и распознавать объекты.
В OpenCV существует множество вариантов для трансляции видеопотока. Можно использовать один из них – IP-камеры, но с ними бывает довольно трудно работать. Так, некоторые IP-камеры не позволяют получить доступ к RTSP-потоку (англ. Real Time Streaming Protocol). Другие IP-камеры не работают с функцией OpenCV cv2.VideoCapture . В конце концов, такой вариант может быть слишком дорогостоящим для ваших задач, особенно, если вы хотите построить сеть из нескольких камер.
- Клиент, который будет захватывать кадры с простой веб-камеры.
- Сервер, принимающий кадры и ищущий на них выбранные типы объектов (например, людей, собак и автомобили).
Для демонстрации работы узлов применяются четыре платы 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
Начнем с реализации клиента. Что он будет делать:
- Захватывать видеопоток с камеры (USB или RPi-модуль).
- Отправлять кадры по сети через 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-протокола:
Проверьте, что на всех машинах установлены импортируемые клиентом или сервером библиотеки. Первым нужно запускать сервер. Сделать это можно следующей командой:
Далее запускаем клиенты, следуя инструкции (будьте внимательны, в вашей системе имена и адреса могут отличаться):
- Откройте SSH-соединение с клиентом: ssh [email protected]
- Запустите экран клиента: screen
- Перейдите к профилю: source ~/.profile
- Активируйте окружение: workon py3cv4
- Установите ImageZMQ, следуя инструкциям библиотеки по установке
- Запустите клиент: 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, найдите на плате порт для подключения камеры и аккуратно потяните его вверх за боковые выступы. Верхняя часть разъема поднимется примерно на 2 миллиметра и немного отойдет в сторону.
Опустите край кабеля от камеры в открывшийся разъем так, чтобы синяя метка была со стороны аудио разъёма, а контакты смотрели на HDMI разъём.
Аккуратно надавите на крышку разъёма для камеры и она закроется обратно. После подключения всё должно выглядеть как на фото:
Подключите питание, монитор, клавиатуру и мышка к Raspberry Pi и дождитесь пока система полностью загрузится. Из верхнего меню откройте основные настройки системы:
В появившемся окне перейдите во вкладку "Interfaces", выберите "Enabled" в строчке Camera и нажмите кнопку OK. После включения камеры система попросит ее перезагрузить. Перезагрузите систему. Теперь камера подключена, попробуем с ней поработать.
Просмотр изображения с камеры
Для начала работы с камерой вам необходимо запустить приложение 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 секунд будет показано изображение с камеры. Если вы будете вращать камерой, то изображение будет двигаться. Получится примерно так:
Обратите внимание на то, что изображение с камеры будет показываться на экране только если вы подключили монитор. Если вы работает удаленно через 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 с вайшей фотографией. Дважды кликните по картинке и она откроется!
Теперь добавьте в программу цикл и запустите ее. Она откроет превью, сделает 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()
В результате вы получите примерно вот такой набор изображений с фильтрами:
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 вы можете найти на официальном сайте.
Попробуйте сделать фотографии в разных режимах с применение различных фильтров. Это очень просто! В следующих статьях мы расскажем вам как сделать фотобудку для друзей или аппарат для съёмки мультиков!
Читайте также: