Пытаюсь сделать трекер лица Python+OpenCV –> Arduino+Servo
Для Ардуино написал скетч который по СОМ порту принимает команду в формате X:Y (0:0 , 180:180 , 23:56 и т.д.)
#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); } }
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 в формате как в тестовом коде…..
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 , Но это не то что я хотел (отслеживать движение лица и поворачивать камеру)
Подскажите , где у меня ошибка и куда копать ???
Заранее благодарю за помощь…