Форум программистов, компьютерный форум, киберфорум
Python: ИИ, нейросети, ML, агенты
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
1 / 1 / 0
Регистрация: 01.06.2019
Сообщений: 26

Распознавание лиц: Python + Arduino (Управление Servo+Arduino из Python+OpenCV)

13.01.2025, 07:19. Показов 1899. Ответов 10

Студворк — интернет-сервис помощи студентам
Приветствую всех ГУРУ и тех кому не безразлична данная тема.

Пытаюсь сделать трекер лица Python+OpenCV --> Arduino+Servo

Для Ардуино написал скетч который по СОМ порту принимает команду в формате X:Y (0:0 , 180:180 , 23:56 и т.д.)


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <Servo.h>
Servo servo[2];  // объект серво для 2х моторов
 
void setup() {
  Serial.begin(9600);  // открыть порт для связи
  servo[0].attach(7, 400, 2400);
  servo[1].attach(8, 400, 2400);
 
  servo[0].write(90); //выводим серво в центр
  servo[1].write(90); //выводим серво в центр
}
 
void loop() {  // Основной цикл
 
  if (Serial.available() > 0) {  // если что то прислали
 
    String bufString = Serial.readString();                // читаем как строку
    byte dividerIndex = bufString.indexOf(':');            // ищем индекс разделителя
    String buf_1 = bufString.substring(0, dividerIndex);   // создаём строку с первым числом
    String buf_2 = bufString.substring(dividerIndex + 1);  // создаём строку со вторым числом
    int val_1 = buf_1.toInt();                             // преобразуем угол горизонталм
    int val_2 = buf_2.toInt();                             // преобразуем угол вертикали
 
    servo[0].write(val_1); // поворот по X
    servo[1].write(val_2); // поворот по Y
    delay(100);
  }
}
Написал на Python проверочный код и все повороты 100% отрабатывают но с какой то задержкой...

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import time
import serial
 
# Configure the COM port
port = "COM8"  # Replace with the appropriate COM port name
baudrate = 9600
# Open the COM port
ser = serial.Serial(port, baudrate=baudrate)
print("Serial connection established.")
 
try:
 
    # Send commands to the Arduino
    while True:
        
        command = input("Enter a command ('0:0', '180:180'): ")
        ser.write(command.encode())
        
except KeyboardInterrupt:
    pass
 
finally:
    # Close the serial connection
    if ser.is_open:
        command = '0:0' # zero position
        ser.write(command.encode())
        ser.close()
        print("Serial connection closed.")

А вот код на Python который через OpenCV определяет центр лица и смещения по X Y отправляет через СОМ порт на Arduino в формате как в тестовом коде.....

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import numpy as np
import cv2
 
import serial
port = "COM8"  # Replace with the appropriate COM port name
baudrate = 9600
# Open the COM port
arduino = serial.Serial(port, baudrate=baudrate)
 
 
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_eye.xml')
    
capture = cv2.VideoCapture(0,cv2.CAP_DSHOW)
#capture.set(cv2.CAP_PROP_FRAME_WIDTH, 1024)
#capture.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)
 
Tim=0
 
xi = int(capture.get(3))
cxi = int(xi/2)
yi = int(capture.get(4))
cyi = int(yi/2)
 
while True:
    ret, frame = capture.read()
    
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    
    faces = face_cascade.detectMultiScale(gray, 1.3, 5)
    eyes = eye_cascade.detectMultiScale(gray, 1.3, 5)
 
    cv2.line(frame, (cxi,0),(cxi,yi),(120,120,120),1)
    cv2.line(frame, (0,cyi),(xi,cyi),(120,120,120),1)
    ct = ''
 
    for (x, y, w, h) in faces:
        frame = cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 255), 2)
        cx=int(x+w/2)
        cy=int(y+h/2)
        dx=int(90+cxi-cx)
        dy=int(90+cyi-cy)
        ct=str(dx)+':'+str(dy) # Send to COM port
        cv2.circle(frame, (cx,cy), 5, (0, 0, 255) , -1) #-1 
        cv2.line(frame, (cxi,cyi), (cx,cy),(0, 0, 255), 3)
 
        cv2.putText(frame, ct, (0, 20), cv2.FONT_HERSHEY_DUPLEX, 0.9, (0, 0, 250), 1) 
        # Send commands to the Arduino
 
        # ser.write(f"{angle}n".encode())
        command = ct #input('Enter a command (e.g., 'ON', 'OFF'): ')
        arduino.write(command.encode())
        #print(command)
 
    cv2.imshow('From Camera', frame)
 
    k = cv2.waitKey(30) & 0xFF
    if k == 27:
        if arduino.is_open:
          command = '0:0'
          arduino.write(command.encode())
          arduino.close()
          print("Serial connection closed.")
        break
 
capture.release()
cv2.destroyAllWindows()
Видео отображает, смещения вычисляются...
Но Servo на Arduino не отрабатывает практически НИ КАК...
Бывают иногда какието дергания Servo , Но это не то что я хотел (отслеживать движение лица и поворачивать камеру)

Подскажите , где у меня ошибка и куда копать ???
Заранее благодарю за помощь...
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.01.2025, 07:19
Ответы с готовыми решениями:

Android studio управление servo через bluetooth (arduino)
Работает некорректно, вылетает приложение, если отключить InputStream то работает но сервопривод колбасится. Скачал с инета, сам чайник(...

OpenCV python распознавание текста
Доброго времени суток. Есть задача: распознавание символов в строке браузера. Необходимо реализовать с использованием OpenCV на python под...

Arduino +Python
Здравствуйте , учусь на 4 курсе и хочу создать дипломную работу напрактике , а не только в теории ,так как свободный выбор темы , решил...

10
1 / 1 / 0
Регистрация: 01.06.2019
Сообщений: 26
14.01.2025, 09:42  [ТС]
Продолжаю тестировать Python+OpenCV --> Arduino+Servo

Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import time
import serial
 
# Configure the COM port
port = "COM8"  # Replace with the appropriate COM port name
baudrate = 115200
# Open the COM port
ser = serial.Serial(port, baudrate=baudrate)
sle=1.1
print("Serial connection established.")
time.sleep(3)
 
#command = '0:0'#input("Enter a command ('0:0', '180:180'): ")
#ser.write(command.encode())
#time.sleep(sle)
#print(0)
 
command = '30:30'
ser.write(command.encode())
time.sleep(sle)
print(30)
 
command = '60:60'
ser.write(command.encode())
time.sleep(sle)
print(60)
 
command = '90:90'
ser.write(command.encode())
time.sleep(sle)
print(90)
 
command = '120:120'
ser.write(command.encode())
time.sleep(sle)
print(120)
 
command = '150:150'
ser.write(command.encode())
time.sleep(sle)
print(150)
 
command = '180:180'
ser.write(command.encode())
time.sleep(sle)
print(180)
 
command = '0:0'
ser.write(command.encode())
time.sleep(sle)
print(0)
 
ser.close()
print("Serial connection closed.")


На Питоне написал тестовый кусок и решил через задержки вычислить , при какой задержке серво на Ардуино будет отрабатывать углы...
В проге видно предельное значение .
Так и не пойму почему такое большое значение ???

На скорости 115200 бод в порт максимум улетает 11520 байт в секунду.
Я отправляю 180:180 , это максимум 7 байт
Из скорости 11520/7=1645 посылок в секунду, а у меня 7 байт летит раз в 1,1 секунды...

Где копать ?
0
1 / 1 / 0
Регистрация: 01.06.2019
Сообщений: 26
14.01.2025, 09:59  [ТС]
Скорость полного поворота SG-90 = 0.36 сек исходя из этого 0,36/180 = 0,002 град/сек

Или почти 3-три полных поворота в 1 секунду....
0
 Аватар для TimutGin
515 / 339 / 146
Регистрация: 16.02.2021
Сообщений: 626
15.01.2025, 08:25
Цитата Сообщение от gps38region Посмотреть сообщение
Из скорости 11520/7=1645 посылок в секунду, а у меня 7 байт летит раз в 1,1 секунды...
Где копать ?
Особо не вникал,но возможно тут
Цитата Сообщение от gps38region Посмотреть сообщение
sle=1.1
Цитата Сообщение от gps38region Посмотреть сообщение
time.sleep(sle)
0
1 / 1 / 0
Регистрация: 01.06.2019
Сообщений: 26
15.01.2025, 13:28  [ТС]
Цитата Сообщение от TimutGin Посмотреть сообщение
Особо не вникал,но возможно тут
Задержка sle=1.1 (1.1 сек) , это минимальная при которой серво отрабатывает по тестовому коду :
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import time
import serial
 
# Configure the COM port
port = "COM8"  # Replace with the appropriate COM port name
baudrate = 115200
# Open the COM port
ser = serial.Serial(port, baudrate=baudrate)
sle=1.1
print("Serial connection established.")
time.sleep(3)
 
#command = '0:0'#input("Enter a command ('0:0', '180:180'): ")
#ser.write(command.encode())
#time.sleep(sle)
#print(0)
 
command = '30:30'
ser.write(command.encode())
time.sleep(sle)
print(30)
 
command = '60:60'
ser.write(command.encode())
time.sleep(sle)
print(60)
 
command = '90:90'
ser.write(command.encode())
time.sleep(sle)
print(90)
 
command = '120:120'
ser.write(command.encode())
time.sleep(sle)
print(120)
 
command = '150:150'
ser.write(command.encode())
time.sleep(sle)
print(150)
 
command = '180:180'
ser.write(command.encode())
time.sleep(sle)
print(180)
 
command = '0:0'
ser.write(command.encode())
time.sleep(sle)
print(0)
 
ser.close()
print("Serial connection closed.")
Добавлено через 4 часа 5 минут
1. Значения некоторые действительно больше 180, но это не принципиально так как при значениях от 0 до 180 , та же песня вернее молчание сервы.
2. В тестовой посылке выяснил что серва начинает отрабатывать при отправке команд не чаще 1.1 секунды. Ставлю 1.05 и срабатывает через раз (не 0-30-60-90-120-150-180 а 0-60-120-180 и то не всегда). Минимальное время отправки 1.1 секунда, что очень много для реального отслеживания через OpenCV
3. Буду для начала организовывать таймер на 1.1-1.2 сек, посмотрю как получится….
Отпишусь позже…..

P.S. Не думал что скорость работы Питона с СОМ портом такое тормознутое…
Пока вывод такой…
0
 Аватар для TimutGin
515 / 339 / 146
Регистрация: 16.02.2021
Сообщений: 626
15.01.2025, 15:58
Цитата Сообщение от gps38region Посмотреть сообщение
P.S. Не думал что скорость работы Питона с СОМ портом такое тормознутое…
Пока вывод такой…
Может дело не в Com порте а в данном коде на Arduino
Цитата Сообщение от gps38region Посмотреть сообщение
if (Serial.available() > 0) {  // если что то прислали
String bufString = Serial.readString();                // читаем как строку
    byte dividerIndex = bufString.indexOf(':');            // ищем индекс разделителя
    String buf_1 = bufString.substring(0, dividerIndex);   // создаём строку с первым числом
    String buf_2 = bufString.substring(dividerIndex + 1);  // создаём строку со вторым числом
    int val_1 = buf_1.toInt();                             // преобразуем угол горизонталм
    int val_2 = buf_2.toInt();                             // преобразуем угол вертикали
servo[0].write(val_1); // поворот по X
    servo[1].write(val_2); // поворот по Y
    delay(100);
  }
Для начала я б просто проверил как быстро приходят данные с com-порта просто печатая их в консоль
C++
1
2
3
4
5
if (Serial.available() > 0) {  // если что то прислали
String bufString = Serial.read();                // читаем
    Serial.println(bufString, DEC);   //неуверен что это так делается
    delay(100);
  }
+увеличивал либо уменьшал delay(100),может в нем дело

У меня нет в наличии Arduino,так бы сам попробывал
1
1 / 1 / 0
Регистрация: 01.06.2019
Сообщений: 26
15.01.2025, 16:52  [ТС]
Цитата Сообщение от TimutGin Посмотреть сообщение
+увеличивал либо уменьшал delay(100),может в нем дело
Delay(100) Это я уже экспериментирую задержки.
Раньше их не было...
Без них работает так же с задержкой Питона в 1.1 секунду
Я понимаю что должно быть быстрее и намного, но причину пока не выяснил.

В итоге камера должна стоять на платформе с поворотом Серво по горизонтали и вертикали.
Питон с OpenCV определяет корректно отклонение от центра кадра видео и эти смещения улетают по СОМ порту в Ардуино, Ардуино поворачивает Серво до тех пор пока центр лица не будет в центре захваченного видео...

Тестировал довороты через 30 градусов с Питона на Ардуино...
Минимальное время отправки с Питона на Ардуино = 1.1 секунда
Само серво за 0.12 секунды поворачивается и крайнего (0 градусов) в другое крайнее (180 градусв) положение
Грубо говоря за 1.1 сек Серво 3-три раза успеет крутануться туда и сюда от 0 до 180...
А по сути там смешения в несколько углов, ну 10-30 градусов если бошкой сильно не болтать.

Могу скинуть все исходники, мне нужен результат принципиально.
Я просто поставил задачу и пока не могу ее решить.
Иногда бывает при видео конференциях, двигаешься и хотел отработать позицию камеры...

Тут еще вопрос, а камера Питоном монопольно захватывается ? Вацап или Вайбер могут совместно картинку видео использовать ?????

Пока под тормоза пишу таймер для Питона с дельтой времени 1.1-1.5 секунд...

Добавлено через 28 минут
Есть идея отправлять градусы не строкой а байтами, займет всего 2 байта . Первый байт значения Х от 0 до 254 и второй по Y.
В настройках СОМ указать посылку данных в 2 байта.
Может так прокатит ?
Но для начала посмотреть на внутрянку PySerial
0
 Аватар для TimutGin
515 / 339 / 146
Регистрация: 16.02.2021
Сообщений: 626
16.01.2025, 10:37
Минимальное время отправки с Питона на Ардуино = 1.1 секунда
Проверил, у меня намного быстрее это происходит. Если завтра серво прийдет то проверю остальное
0
 Аватар для TimutGin
515 / 339 / 146
Регистрация: 16.02.2021
Сообщений: 626
18.01.2025, 23:35
Проблема с кодом на c++, переписал немного,отрабатыет быстрей чем за 1.1 сек, правда с 1м сервоприводом,второго нет в наличии
0
1 / 1 / 0
Регистрация: 01.06.2019
Сообщений: 26
19.01.2025, 05:34  [ТС]
Использую стандартные библиотеки без своих правок.
В итоге пока отработал посылку X , Y координат с мышки по окну 360х360 пикселей.
Все работает как нужно.
Следующим этапом внедрение видео захвата с WEB камеры, и передача координат по тому же принципу....

Ардуино
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <Servo.h>
Servo servo[2];  
 
void setup() {
    Serial.begin(115200);
    servo[0].attach(7, 400, 2400);
    servo[1].attach(8, 400, 2400);
}
void loop() {
    if (Serial.available() >= 2) {  // Ждем 2 байта
        int x = Serial.read();
        int y = Serial.read();
        Serial.print("Принято: ");
        Serial.print(x);
        Serial.print(", ");
        Serial.println(y);
        servo[0].write(x);
        servo[1].write(y);
    }
}
Питон
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import numpy as np
import cv2 as cv
import serial
import time
port = "COM8"
baudrate = 115200
arduino = serial.Serial(port, baudrate=baudrate, timeout=2)
 
ix,iy = 0,0
 
# mouse callback function
def draw_servo(event,x,y,flags,param):
    global ix,iy,drawing,mode
    if event == cv.EVENT_MOUSEMOVE:
        ix,iy = int(x/2),int(y/2)
        cv.rectangle(img,(0,0),(180,21),(0,0,0),-1)
        cv.putText(img, str(ix)+' '+str(iy), (0, 20), cv.FONT_HERSHEY_DUPLEX, 0.9, (0, 0, 250), 1) 
        data = bytes([ix,iy])
        arduino.write(data)
        arduino.flush()  # Очищаем буфер после отправки
 
 
img = np.zeros((360,360,3), np.uint8)
cv.namedWindow('image')
cv.setMouseCallback('image',draw_servo)
while(1):
    cv.imshow('image',img)
    k = cv.waitKey(1) & 0xFF
    if k == 27:
        break
cv.destroyAllWindows()
Как то так....



Основная ветка обсуждения проекта тут - https://python.su/forum/topic/43537/
0
 Аватар для TimutGin
515 / 339 / 146
Регистрация: 16.02.2021
Сообщений: 626
19.01.2025, 18:38
Все работает как нужно.
Хорошо

Следующим этапом внедрение видео захвата с WEB камеры, и передача координат по тому же принципу....
Можно использовать MediaPipe
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.01.2025, 18:38
Помогаю со студенческими работами здесь

Python и arduino
собственно ардуина тут не то чтоб сильно &quot;при чем&quot;, проблема с питоном, но думаю спрашивать все же лучше в этом разделе предистория:...

Python + arduino
Будет ли Ардуино нормально распознавать python код и будет ли хоть что-то работать без подключения к компу? Я хочу сделать что-то типа...

Arduino и python
Как можно запрограммировать ардуино на пайтоне и каков будет функционал? И как можно общаться с ардуинкой через COM порт на пайтоне без...

Python & Arduino ?
привет форумчане можно ли как нибуть объединить python и arduino ? можно ли как нибуть c Arduino читать файлы ?, я видел модуль для python...

Arduino Uno + Python
Всем привет! Решил попробовать сделать маленькую программу для управления arduino. Отправка данных в com port получается, т.е. могу...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru