Камера слежения за лицом
Компоненты и расходные материалы
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 2 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 15 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 3 | ||||
| × | 1 |
Необходимые инструменты и машины
| ||||
| ||||
| ||||
| ||||
| ||||
|
Приложения и онлайн-сервисы
|
Об этом проекте
Несколько месяцев назад я для развлечения смоделировал и распечатал голову одного из коллег. Я подумал, что было бы забавно пошутить и построить для этой головы механизм, который мог бы обнаруживать людей и продолжать смотреть на них, когда они перемещаются по комнате.
Я изо всех сил пытался сделать механизм достаточно маленьким, чтобы он соответствовал моему 3D-принту, поэтому вместо того, чтобы навсегда запереть проект в шкафу и забыть о нем, я решил сделать легкую для сборки модель с простым в использовании программным обеспечением, чтобы каждый мог наслаждаться и развивать. .
............... https://www.littlefrenchkev.com/face-tracking-camera-mini .................
Как это работает?
Камера перемещается с помощью двух сервоприводов, управляемых Arduino Uno. Камера подключена к компьютеру, и программа пытается найти лица на изображениях, полученных с камеры.
Если лицо обнаружено, программное обеспечение отправит сообщение на Arduino, чтобы заставить камеру двигаться, чтобы обнаруженное лицо оказалось в центре изображения.
Если лицо не найдено, программа отправит сообщение на Arduino, чтобы заставить его переместиться в случайное положение.
Я попытался сделать программу достаточно гибкой с помощью таких опций, как:
- изменяемые диапазоны сервоприводов
- возможность инвертировать вращение сервоприводов
- ручное управление
Надеюсь, это упростит его повторное использование для других целей.
Я также добавил 3 светодиода, которые показывают состояние обнаружения:красный - отсутствие обнаружения, желтый - когда лицо обнаружено, но не в центре изображения, и зеленый - когда лицо обнаружено и в центре изображения. P>
Светодиоды сами по себе не очень интересны, но должно быть легко модифицировать устройство для выполнения полезного действия вместо того, чтобы просто включать и выключать несколько лампочек.
Связь между Arduino и программным обеспечением осуществляется через последовательный порт (через USB).
Программное обеспечение для распознавания лиц было написано на Python. Я оставил все файлы Python на GitHub на случай, если вы захотите взглянуть на код (предупреждение:это, вероятно, не очень хорошо, я учусь самостоятельно) или повторно использовать их для своего собственного проекта.
Если Python вам не нравится, вы также можете скачать исполняемую версию на моем веб-сайте.
Если вы хотите построить свой собственный, посмотрите следующие видео. Я постарался максимально упростить их отслеживание, надеюсь, у меня получилось хорошо с этим.
Все, что вам нужно
Сборка
Электропроводка
Программное обеспечение и настройка
Код
- Код Arduino
Код Arduino C / C ++
Это код, который будет загружен в arduino// Sketch на основе работы, проделанной Robin2 на форуме arduino // подробнее здесь // https://forum.arduino.cc/index.php? Topic =225329.msg1810764 # msg1810764 # includeСерво panServo; Серво tiltServo; byte redledPin =2; byte yellowledPin =3; byte greenledPin =4; const byte buffSize =40; char inputBuffer [buffSize]; const char startMarker ='<'; const char endMarker ='>'; byte bytesRecvd =0; boolean readInProgress =false; логическое newDataFromPC =false; float panServoAngle =90.0; float tiltServoAngle =90.0; int LED_state =0; // 8 =============Dvoid setup () {Serial.begin (115200); panServo.attach (8); tiltServo.attach (9); pinMode (redledPin, ВЫХОД); pinMode (yellowledPin, ВЫХОД); pinMode (greenledPin, ВЫХОД); // moveServo (); start_sequence (); задержка (200); Serial.println (" "); // отправляем сообщение на компьютер} // 8 =============Dvoid loop () {getDataFromPC (); replyToPC (); moveServo (); setLED ();} // 8 =============Dvoid getDataFromPC () {// получаем данные с ПК и сохраняем их в inputBuffer if (Serial.available ()> 0) {char x =Serial.read (); // считываем символ из серийного номера if (x ==endMarker) {// ищем конечный маркер readInProgress =false; // если найден, установим текущее чтение true (добавление нового байта в буфер прекратится) newDataFromPC =true; // сообщаем arduino, что доступны новые данные inputBuffer [bytesRecvd] =0; // очищаем буфер ввода processData (); // обрабатываем данные в буфере} if (readInProgress) {inputBuffer [bytesRecvd] =x; // заполняем входной буфер байтами bytesRecvd ++; // увеличиваем индекс if (bytesRecvd ==buffSize) {// когда буфер заполнен bytesRecvd =buffSize - 1; // оставляем место для конечного маркера}} if (x ==startMarker) {// ищем начальный производитель bytesRecvd =0; // если найден, устанавливаем полученный байт равным 0 readInProgress =true; // устанавливает текущее чтение в значение true}}} // 8 =============Dvoid processData () // для типа данных " " {char * strtokIndx; // это используется strtok () как индекс strtokIndx =strtok (inputBuffer, ","); // получаем первую часть panServoAngle =atof (strtokIndx); // преобразовываем эту часть в число с плавающей запятой strtokIndx =strtok (NULL, ","); // получаем вторую часть (это продолжается с того места, где остановился предыдущий вызов) tiltServoAngle =atof (strtokIndx); // преобразовываем эту часть в число с плавающей запятой strtokIndx =strtok (NULL, ","); // получаем последнюю часть LED_state =atoi (strtokIndx); // преобразовываем эту часть в целое число (строка в int)} // 8 =============Dvoid replyToPC () {if (newDataFromPC) {newDataFromPC =false; Serial.print ("<"); Serial.print (panServo.read ()); Serial.print (","); Serial.print (tiltServo.read ()); Serial.println (">"); }} // 8 =============Избегайте moveServo () {panServo.write (panServoAngle); tiltServo.write (tiltServoAngle);} void setLED () {если (LED_state ==2) {digitalWrite (redledPin, LOW); digitalWrite (yellowledPin, HIGH); digitalWrite (greenledPin, НИЗКИЙ); } иначе, если (LED_state ==1) {digitalWrite (redledPin, LOW); digitalWrite (yellowledPin, LOW); digitalWrite (greenledPin, HIGH); } иначе, если (LED_state ==0) {digitalWrite (redledPin, HIGH); digitalWrite (yellowledPin, LOW); digitalWrite (greenledPin, НИЗКИЙ); } иначе, если (LED_state ==3) {digitalWrite (redledPin, HIGH); digitalWrite (yellowledPin, HIGH); digitalWrite (greenledPin, HIGH); } else {digitalWrite (redledPin, LOW); digitalWrite (yellowledPin, LOW); digitalWrite (greenledPin, НИЗКИЙ); }} // 8 =============D void start_sequence () {panServo.write (90); tiltServo.write (90); задержка (300); digitalWrite (redledPin, HIGH); задержка (100); digitalWrite (redledPin, LOW); digitalWrite (yellowledPin, HIGH); задержка (100); digitalWrite (yellowledPin, LOW); digitalWrite (greenledPin, HIGH); задержка (100); digitalWrite (redledPin, LOW); digitalWrite (yellowledPin, LOW); digitalWrite (greenledPin, LOW); задержка (100); digitalWrite (redledPin, HIGH); digitalWrite (yellowledPin, HIGH); digitalWrite (greenledPin, HIGH); задержка (100); digitalWrite (redledPin, LOW); digitalWrite (yellowledPin, LOW); digitalWrite (greenledPin, НИЗКИЙ); }
Программа для распознавания лиц
Вот репозиторий, в котором вы можете найти файлы для программного обеспечения для распознавания лиц. Вы также можете найти исполняемую версию на моем веб-сайте. Https://github.com/LittleFrenchKev/face_tracking_cameraИзготовленные на заказ детали и корпуса
детали камеры слежения за лицом
все детали, необходимые для создания мини камеры слежения за лицом. Вы также можете найти их здесь:https://www.littlefrenchkev.com/downloadCAD файл на сайте thingiverse.comСхема
Производственный процесс
- Отслеживание лица при панорамировании / наклоне с помощью raspberry pi
- Визитная карточка игры «Крестики-нолики»
- Многотемпературный датчик
- Управление паяльником DIY для 862D +
- MotionSense
- Пожарная безопасность 3D-принтера
- Датчик Интернета вещей с Arduino, Yaler и IFTTT
- Отталкивающая электромагнитная левитация Arduino
- Бот для захвата удаленного управления
- CoroFence - Тепловой детектор🖖