Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Отслеживание лица с использованием Arduino

Компоненты и расходные материалы

Arduino UNO
× 1
веб-камера
× 1
Микросервоприводы
× 2
Панорамирование и наклон
× 1
Макет (общий)
× 1

Приложения и онлайн-сервисы

Python 2.7
OpenCV

Об этом проекте

В предыдущем уроке я рассказал, как вы можете общаться между Arduino и Python с помощью модуля pyserial и управлять светодиодом. Если вы этого не видели, посмотрите здесь:СВЯЗЬ МЕЖДУ ARDUINO И PYTHON!

И как вы можете определить цвет объекта и отслеживать его на экране, посмотрите здесь:ОПРЕДЕЛЕНИЕ ЦВЕТА С ПОМОЩЬЮ OPENCV И PYTHON.

В этом уроке я покажу вам, как отслеживать лица с помощью Arduino и Python и заставлять камеру следовать за лицом. Это может показаться трудным, но поверьте мне, это не так. Все, что вам нужно, - это базовые знания Arduino и Python.

Итак, приступим ...

Шаг 1. Вещи, которые вам понадобятся

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

Требования к оборудованию:

  • Arduino UNO (можно использовать другие платы)
  • Веб-камера (мини-веб-камера)
  • Сервоприводы x 2 (я буду использовать микросервоприводы, но вы можете использовать стандартные сервоприводы)
  • Макетная плата (для прототипирования)
  • Комплект сервопривода панорамирования и наклона (вы можете построить его, если хотите).

Требования к программному обеспечению:

  • Python 2.7 (должен быть установлен; в ОС Linux он обычно предустановлен)
  • OpenCV (вы можете загрузить его отдельно или установить с помощью 'pip install'. Объясняется далее)
  • pyserial (можно установить с помощью pip)
  • тупой.
  • Харкаскад.

После того, как все будет собрано, мы можем перейти к этапу установки ...

Шаг 2. Настройка среды Python

Установка Python:

Итак, сначала нам нужно запустить Python 2.7. Для этого сначала загрузите и установите python 2.7.14. Чтобы проверить, правильно ли он установлен, перейдите к: Windows Search>> Введите "IDLE">> Нажмите Enter. Должна появиться оболочка Python.

ИЛИ

В строке поиска введите «CMD» и нажмите Enter, чтобы открыть командную строку. В CMD введите >> python и нажмите Enter, Должен отобразиться интерфейс Python.

Если вы видите ошибку в CMD, не паникуйте, вам, вероятно, нужно установить переменную среды. Вы можете следовать этому руководству Здесь для настройки переменной среды.

Установка pyserial, OpenCV и numpy в Python:

Для установки этих модулей мы будем использовать pip install,

Сначала откройте CMD и введите следующие коды:-

 > pip install serial 
> pip install opencv-python
> pip install numpy

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

Шаг 3. Сценарий Python

Прежде чем начать писать код, первое, что нужно сделать, это создать новую папку, так как весь код должен храниться в той же папке. Так что создайте новую папку, назовите ее как хотите. и загрузите "Haarcascade" снизу и вставьте его в папку.

Теперь откройте блокнот и напишите приведенный ниже скрипт. Сохраните его как «face.py» в той же папке, что и haarcascade. (Вы можете загрузить код, который я предоставил в файле ниже):

  #import все необходимые модули 
import numpy as np
import serial
время импорта
import sys
import cv2
#Setup Путь связи для Arduino (вместо COM5 укажите порт, к которому подключен ваш Arduino)
arduino =serial.Serial ('COM5', 9600)
time.sleep (2)
print ("Connected to arduino ...")
# импорт Haarcascade для распознавания лиц
face_cascade =cv2.CascadeClassifier ('haarcascade_frontalface_default.xml')
# Для захвата видеопотока из webcam.
cap =cv2.VideoCapture (0)
# Прочтите захваченное изображение, преобразуйте его в серое и найдите лица
while 1:
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) в гранях:
cv2.rectangle (img, (x, y), (x + w, y + h), ( 0,255,0), 5)
roi_gray =серый [y:y + h, x:x + w]
roi_color =img [y:y + h, x:x + w]
arr ={y:y + h, x:x + w}
print (arr)

print ('X:' + str (x))
print ( 'Y:' + str (y))
print ('x + w:' + str (x + w))
print ('y + h:' + str (y + h))
# Центр доходности (прямоугольник)
xx =int (x + (x + h)) / 2
yy =int (y + (y + w)) / 2
print (xx)
print (yy)
center =(xx, yy)
# отправка данных в arduino
print ("Center of Rectangle is:", center)
data ="X {0:d} Y {1:d} Z" .format (xx, yy)
print ("output ='" + data + "'")
arduino.write ( data)
# Отображение потока.
cv2.imshow ('img', img)
# Нажмите 'Esc', чтобы завершить выполнение
k =cv2.waitKey (30) &0xff
если k ==27:
break

Как только это будет сделано, переходите к написанию кода для Arduino ...

haarcascade_frontalface_default.xml face.py

Шаг 4. Код Arduino

После того, как скрипт python будет готов, нам понадобится скетч Arduino для управления сервоприводом. Обратитесь к приведенному ниже коду, вставьте его в Arduino IDE и сохраните как servo.ino в той же папке, что и face.py и haarcascade. загрузите код и переходите к следующему шагу, чтобы установить соединения.

(Загружаемый файл приведен ниже.)

  #include  
Servo servoVer; // Вертикальный сервопривод
Servo servoHor; // Горизонтальный сервопривод
int x;
int y;
int prevX;
int prevY;
void setup ()
{
Последовательный .begin (9600);
servoVer.attach (5); // Присоединяем вертикальный сервопривод к выводу 5
servoHor.attach (6); // Присоединяем горизонтальный сервопривод к выводу 6
servoVer.write (90);
servoHor.write (90);
}
void Pos ()
{
if (prevX! =x || prevY! =y)
{
int servoX =map (x, 600, 0, 70, 179);
int servoY =map (y , 450, 0, 179, 95);
servoX =min (servoX, 179);
servoX =max (servoX, 70);
servoY =min (servoY, 179);
servoY =max (servoY, 95);

servoHor.write (servoX);
servoVer.write (servoY);
}
}
void loop ()
{
if (Serial.available ()> 0)
{
if (Serial.read () =='X')
{
x =Serial.parseInt ();
if (Serial.read () =='Y')
{
y =Serial.parseInt ();
Pos ();
}
}
while (Serial.available ()> 0)
{
Serial.read ();
}
}
}
servo.ino

Шаг 5:Механизм панорамирования-наклона:-

Я использовал готовый комплект для Pan-Tilt. При желании вы можете сделать его самостоятельно из дерева / пластика или даже напечатать его на 3D-принтере.

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

Шаг 6. Установление соединений

Схема довольно проста. Просто подключите два сервопривода к Arduino.

  • Вертикально к выводу 5
  • По горизонтали к выводу 6
  • Питание до +5 В
  • Земля на GND

Обратитесь к принципиальной схеме для справки.

Шаг 7. Тестирование

  • После того, как все будет сделано, последнее, что нужно сделать, это проверить, работает ли оно. Для тестирования сначала убедитесь, что сервоприводы правильно подключены к Arduino и скетч загружен.
  • После загрузки скетча обязательно закройте IDE, чтобы порт был свободен для подключения к python.
  • Теперь откройте face.py с помощью Python IDLE и нажмите F5, чтобы запустить код. Подключение к Arduino займет несколько секунд, после чего вы должны увидеть окно, транслирующее веб-камеру. Теперь код обнаружит ваше лицо, и сервоприводы будут отслеживать его.
  • Сервопривод должен двигаться при перемещении объекта. Теперь просто прикрепите камеру к сервоприводам, чтобы она двигалась вместе с сервоприводами.

Надеюсь, тебе понравится. и узнайте что-то новое.

Спасибо!

Код

  • servo.ino
  • Фрагмент кода №2
  • Фрагмент кода №3
servo.ino Arduino
Ошибка открытия файла.
Фрагмент кода 2 Обычный текст
 #import все необходимые модулиimport numpy as npimport serialimport timeimport sysimport cv2 # Настройка Путь связи для arduino (вместо COM5 укажите порт, к которому подключен ваш arduino) arduino =serial.Serial ('COM5', 9600 ) time.sleep (2) print ("Connected to arduino ...") # импорт Haarcascade для распознавания лицface_cascade =cv2.CascadeClassifier ('haarcascade_frontalface_default.xml') # Для захвата видеопотока с webcam.cap =cv2.VideoCapture (0) # Прочтите захваченное изображение, преобразуйте его в серое и найдите лица, пока 1: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) в гранях: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] arr ={y:y + h, x:x + w} print (arr) print ('X:' + str (x)) print ('Y:' + str (y)) print ('x + w:' + str (x + w)) print ('y + h:' + str (y + h))) # Центр рентабельности (прямоугольник) xx =int (x + (x + h)) / 2 yy =int (y + (y + w)) / 2 print (xx) print (yy) center =(xx, yy) # отправка данные в arduino print ("Центр прямоугольника:", center) data ="X {0:d} Y {1:d} Z" .format (xx, yy) print ("output ='" + data + "' ") arduino.write (data) # Показать поток. cv2.imshow ('img', img) # Нажмите 'Esc', чтобы завершить выполнение k =cv2.waitKey (30) &0xff if k ==27:break 
Фрагмент кода № 3 Обычный текст
 #include  Servo servoVer; // Вертикальный ServoServo servoHor; // Горизонтальный сервоинт x; int y; int prevX; int prevY; void setup () {Serial.begin (9600); servoVer.attach (5); // Присоединяем вертикальный сервопривод к выводу 5 servoHor.attach (6); // Присоединяем горизонтальный сервопривод к выводу 6 servoVer.write (90); servoHor.write (90);} void Pos () {if (prevX! =x || prevY! =y) {int servoX =map (x, 600, 0, 70, 179); int servoY =карта (y, 450, 0, 179, 95); servoX =мин (servoX, 179); servoX =max (servoX, 70); servoY =min (servoY, 179); servoY =max (servoY, 95); servoHor.write (servoX); servoVer.write (сервоY); }} void loop () {если (Serial.available ()> 0) {если (Serial.read () =='X') {x =Serial.parseInt (); если (Serial.read () =='Y') {y =Serial.parseInt (); Pos (); }} пока (Serial.available ()> 0) {Serial.read (); }}} 

Производственный процесс

  1. Датчик температуры Python и Raspberry Pi
  2. Распознавание лиц в реальном времени:сквозной проект
  3. Автоматическое отслеживание объекта обзора
  4. Декодер DTMF с использованием только Arduino
  5. Создание монитора Ambilight с помощью Arduino
  6. Система посещаемости с использованием Arduino и RFID с Python
  7. Ультразвуковой левитационный аппарат с использованием ARDUINO
  8. Вольтметр своими руками с использованием Arduino и смартфона
  9. Монитор сердечного ритма с использованием Интернета вещей
  10. WebServerBlink с использованием Arduino Uno WiFi