Python和Arduino通信不适用于面部识别程序

2024-10-04 05:22:14 发布

您现在位置:Python中文网/ 问答频道 /正文

面部识别的python代码正在工作,正在写入端口COM3(连接到arduino)。arduino代码将从字符串中删除X和Y字符,并将其拆分为两个四舍五入整数,然后写入伺服电机。但是,arduino没有读取任何信息,伺服系统也没有接收到任何信息

用于获取背面位置并将其写入串行端口的python代码:

import cv2
import numpy as np
import serial
import time
from tkinter import *
from tkinter import messagebox
ser = serial.Serial('COM3', 9600)
cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
videoCamera = cv2.VideoCapture(0)
t0 = 0
valueX = 0
valueY = 0
x = 0
y = 0
w = 0
h = 0
time.sleep(2)
while(True):
    ret, img = videoCamera.read()
    faces = cascade.detectMultiScale(img, 1.5, 5)
    for (x , y , w , h) in faces:
        cv2.rectangle(img, (x, y), (x+w, y+h), (0, 0, 255), 3)



        if(t0>20):
            valueX = ((180 - x / (videoCamera.get(cv2.CAP_PROP_FRAME_WIDTH)/180)) + w/2)
            valueY = ((y / (videoCamera.get(cv2.CAP_PROP_FRAME_HEIGHT)/180)) + h/2)

            faceLocation = "X" + str(valueX) +" " + "Y" + str(valueY)
            ser.write(str.encode(faceLocation))
            print(str.encode(faceLocation))
            t0 = 0




    cv2.imshow('frame', img)
    k = cv2.waitKey(30) & 0xFF
    t0 += 1
    if k==27:
        break


videoCamera.release()
cv2.destroyAllWindows()

arduino代码从python将伺服旋转到给定的面位置:

#include<Servo.h>

Servo serX;
Servo serY;

String tempModify;

void setup() {
  serX.attach(10);
  serY.attach(11);
  Serial.begin(9600);
  Serial.setTimeout(10);
  serX.write(0);
  serY.write(0);
}

void loop() {

}

void serialEvent() {
  if(Serial.available() < 0){
    tempModify = Serial.readString();
    serX.write(parseDataX(tempModify));
    serY.write(parseDataY(tempModify));
  }


}

int parseDataX(String data){

  data.remove(0, data.indexOf("X")+ 1);

  return data.toInt();
}

int parseDataY(String data){
  data.remove(0,data.indexOf("Y")+1);

  return data.toInt();

}

Tags: 代码importimgdataserialcv2arduinowrite