Система отслеживания лица в реальном времени: Arduino + OpenCV (Python)
Компоненты и материалы
| Компонент | Количество |
|---|---|
| Arduino UNO | 1 |
| Веб-камера (мини) | 1 |
| Микросервоприводы | 2 |
| Pan-Tilt крепление (готовый комплект или самодельное) | 1 |
| Макетная плата | 1 |
Программное обеспечение
- Python 2.7 (в Linux часто уже есть)
- OpenCV (
pip install opencv-python) - pyserial (
pip install serial) - numpy (
pip install numpy) - Haarcascade frontalface (
haarcascade_frontalface_default.xml)
О проекте
Продолжение уроков: ранее было управление LED и цветовым трекингом. Теперь — лицевой трекинг: камера на pan-tilt следует за лицом.
Требуются базовые знания Arduino и Python.
Шаг 1: Установка Python и библиотек
- Установите Python 2.7.14. Проверка: Win+R →
IDLEилиcmd→python. - Если ошибка — добавьте Python в PATH.
- В командной строке:
> pip install serial > pip install opencv-python > pip install numpy
Шаг 2: Python-скрипт (face.py)
Создайте папку, положите туда haarcascade_frontalface_default.xml и файл face.py:
import numpy as np
import serial, time, sys, cv2
# Порт Arduino (замените COM5 на свой)
arduino = serial.Serial('COM5', 9600)
time.sleep(2)
print("Connected to Arduino...")
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
cap = cv2.VideoCapture(0)
while True:
ret, img = cap.read()
cv2.resizeWindow('img', 500, 500)
# Перекрёстные линии для визуализации центра
cv2.line(img, (500,250), (0,250), (0,255,0), 1)
cv2.line(img, (250,0), (250,500), (0,255,0), 1)
cv2.circle(img, (250,250), 5, (255,255,255), -1)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3)
for (x,y,w,h) in faces:
cv2.rectangle(img, (x,y), (x+w,y+h), (0,255,0), 5)
roi_gray = gray[y:y+h, x:x+w]
roi_color = img[y:y+h, x:x+w]
# Центр прямоугольника
xx = int(x + (x + w)) / 2
yy = int(y + (y + h)) / 2
center = (xx, yy)
print("Center:", center)
# Посылка в Arduino: "XYZ"
data = "X{0:d}Y{1:d}Z".format(int(xx), int(yy))
print("Output:", data)
arduino.write(data.encode())
cv2.imshow('img', img)
if cv2.waitKey(30) & 0xFF == 27: break # Esc
cap.release()
cv2.destroyAllWindows()
Шаг 3: Скетч Arduino (servo.ino)
#include <Servo.h>
Servo servoVer; // Вертикаль (пин 5)
Servo servoHor; // Горизонталь (пин 6)
int x, y, prevX, prevY;
void setup() {
Serial.begin(9600);
servoVer.attach(5);
servoHor.attach(6);
servoVer.write(90);
servoHor.write(90);
}
void updatePosition() {
if (prevX != x || prevY != y) {
// Маппинг координат камеры (600×450) на углы серв
int servoX = map(x, 600, 0, 70, 179);
int servoY = map(y, 450, 0, 179, 95);
servoX = constrain(servoX, 70, 179);
servoY = constrain(servoY, 95, 179);
servoHor.write(servoX);
servoVer.write(servoY);
prevX = x; prevY = y;
}
}
void loop() {
if (Serial.available() > 0) {
if (Serial.read() == 'X') {
x = Serial.parseInt();
if (Serial.read() == 'Y') {
y = Serial.parseInt();
updatePosition();
}
}
while (Serial.available() > 0) Serial.read(); // очистка буфера
}
}
Шаг 4: Механика Pan-Tilt
Готовый дешёвый комплект или самодельный из дерева/пластика/3D-печати.
Шаг 5: Подключение
- Вертикальный серво → пин 5
- Горизонтальный серво → пин 6
- Питание серв → +5V, GND
Шаг 6: Тестирование
- Загрузите скетч, закройте Arduino IDE (порт освободится).
- Запустите
face.pyв IDLE (F5). - Через пару секунд откроется окно камеры, лицо будет в прямоугольнике, сервы начнут следить.
- Закрепите камеру на pan-tilt — она будет двигаться за лицом.
Производственный процесс
- Создание удалённого датчика температуры на Raspberry Pi и Python — пошаговое руководство
- Распознавание лиц в реальном времени на Raspberry Pi — полное руководство
- Автоматизированное визуальное отслеживание объектов на Raspberry Pi и OpenCV
- Создание DTMF-декодера на Arduino без внешних микросхем
- Создание потрясающей системы Ambilight для монитора на Arduino
- Надежная система учета рабочего времени на Arduino с RFID и Python
- Создание ультразвукового левитатора на Arduino: пошаговое руководство
- Умный вольтметр на Arduino и смартфоне — простое DIY-проект
- IoT-монитор пульса в реальном времени на Arduino и MAX30100
- Веб-сервер на Arduino Uno WiFi: управление LED через браузер