Выбрать главу

Введем команду: sudo apt-get install motion.

Откроем файл настроек, введем команду sudo nano /etc/motion/motion.conf.

Зададим следующие параметры:

daemon off

width 640

height 480

framerate 15

output_pictures off

ffmpeg_output_movies off

stream_port 8081

stream_quality 100

stream_localhost off

webcontrol_localhost off

Кстати, параметры output_pictures и ffmpeg_output_movies отвечают за сохранение изображений и видеороликов - программу motion также можно использовать как детектор движения. Файлы при этом будут складываться в папку /var/lib/motion. Нам эта функция не нужна, так что устанавливаем параметр output_pictures в off.

Наконец, введем команду sudo motion. Сервер работает - можно зайти в браузере на адрес http://192.168.0.104:8081 и увидеть изображение с камеры (из соображений приватности картинка не показана).

4.16 Отправляем данные через Dropbox

Мы уже рассматривали отправку данных из ESP32 в Dropbox в главе 3.13. Разумеется, то же самое можно сделать и на Raspberry Pi. Рассмотрим отправку обычного файла и текстовых данных в виде строки. Предварительно поставим библиотеки для Dropbox командой sudo apt-get install dropbox. Затем необходимо подключить приложение к Dropbox и получить ключ, как описано в главе 3.13.

Сам код весьма прост. В отличие от ESP32, здесь нам не нужно писать самостоятельно запросы к серверу, все уже реализовано в библиотеке.

import dropbox

import os

token = "V3z9NpYlRxEAAAAAAACHVdBdhVRCnXXXXXXXX"

dbx = dropbox.Dropbox(token)

# 1. Upload file "data1.txt" from the current folder

fullname = "data1.txt"

with open(fullname, 'rb') as f:

data = f.read()

try:

dbx.files_upload(data, "/" + fullname, dropbox.files.WriteMode.overwrite, mute=True)

except dropbox.exceptions.ApiError as err:

print 'Dropbox API error', err

# 2. Upload string as a file

try:

dbx.files_upload("1234567".encode(), "/data2.txt", dropbox.files.WriteMode.overwrite)

except dropbox.exceptions.ApiError as err:

print 'Dropbox API error', err

Отметим здесь 2 полезных параметра. WriteMode.overwrite указывает, что файл будет перезаписан, в противном случае мы получим ошибку, если файл был уже создан. Опциональный параметр mute=True указывает, что файл надо добавить “молча”, без уведомления пользователя (в противном случае на синхронизированном с Dropbox компьютере появляется всплывающее окно). Это бывает полезно, если файлы обновляются постоянно, например, картинка с камеры, которая сохраняется каждые 5 минут.

4.17 Распознавание лиц с помощью OpenCV

Вычислительная мощность Raspberry Pi весьма высока, и позволяет использовать довольно сложные алгоритмы, недоступные на Arduino или ESP32. Одна из таких задач - это обработка изображений. Мы уже умеем получать изображения с Web-камеры, добавим теперь возможность распознавания лиц. Это позволит к примеру, отправлять изображение с охранной камеры только тогда, когда на нем есть человеческое лицо, или сделать робота, который будет поворачиваться к стоящему перед ним человеку.

Разумеется, сама по себе задача распознавания лиц на изображении, весьма сложна, ее программирование требует весьма сложной математики. К счастью для нас, такие алгоритмы уже написаны, потребуется лишь использовать готовые библиотеки. Для обработки изображений мы будем использовать библиотеку OpenCV, чтобы поставить ее, предварительно введем команду sudo apt-get install libopencv-dev python-opencv.

Для начала, рассмотрим задачу распознавание лиц на уже готовом изображении. Для распознавания лиц используется так называемый классификатор Хаара, реализация которого уже есть в OpenCV.

import cv2

face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

img = cv2.imread('faces.png')

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

faces = face_cascade.detectMultiScale(gray, 1.3, 5)

for (x,y,w,h) in faces:

cv2.rectangle(img, (x,y), (x+w,y+h), (255,0,0), 2)

print " ", x,y, x+w,y+h

cv2.imwrite('faces_out.png', img)

Как можно видеть, код весьма прост. Мы создаем объект “CascadeClassifier”, в качестве параметра которого указываем файл 'haarcascade_frontalface_default.xml'. Этот файл хранит заранее обученный на большом числе изображений, набор данных, его необходимо взять из дистрибутива OpenCV и положить в папку с программой. Далее, исходное изображение “faces.png” переводится в черно-белое, а вызов метода detectMultiScale собственно и делает всю работу по распознаванию - на выходе мы получаем массив прямоугольников faces, с которым можем делать что угодно, например вывести на экран. Для удобства просмотра результатов мы также рисуем прямоугольник поверх исходной картинки с помощью метода cv2.rectangle. Итоговая картинка сохраняется под именем faces_out.png.

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