在OpenCV Python中检测到对象时运行舵机
我想把OpenCV(Python)和Arduino Uno连接起来,当它检测到网球时,理论上说,Arduino应该让一个舵机转动180度。网球是通过实时视频流来检测的。
OpenCV的代码:
import numpy as np
import cv2
import serial
face_cascade = cv2.CascadeClassifier('tennisballdetect.xml')
cap = cv2.VideoCapture(0)
while 1:
ret, img = cap.read()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
print(faces)
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)
detect=(x+y)/2
print(detect)
cv2.imshow('img', img)
k = cv2.waitKey(30) & 0xff
if k == 27:
break
cap.release()
cv2.destroyAllWindows()
# Module -2: Trigger Pyserial
if detect > 0:
ser = serial.Serial('COM1', 9600)
print(ser)
ser.write('Y')
else:
ser = serial.Serial('COM1', 9600)
print(ser)
ser.write('N')
我的Arduino代码:
#include <Servo.h>
int servoPin = 3;
Servo Servo1;
char incomingBit; // for incoming serial data
void setup() {
Servo1.attach(servoPin);
pinMode(servoPin, OUTPUT);
Serial.begin(9600);
}
void loop() {
if (Serial.available() > 0) {
incomingBit = Serial.read();
Serial.print("I received: ");
Serial.print(incomingBit);
if(incomingBit == 'Y' || incomingBit == 'y') {
Servo1.write(0);
delay(1000);
Servo1.write(90);
delay(1000);
Servo1.write(180);
delay(1000);
//exit(0);
}
else {
digitalWrite(servoPin, LOW);
}
}
}
舵机已经正确连接到Arduino,并且在没有串口通信的情况下也能正常移动。OpenCV也在正常工作,能够检测到网球。
但是,当我尝试把OpenCV和Arduino连接起来时,舵机却没有动。而且serial.print(incomingBit)这个命令也没有返回任何值。我觉得问题出在detect>0这个条件一直为真,这可能干扰了串口连接。因此,当检测到网球时,我只需要发送一个信号,直到网球不在画面中。我该怎么做呢?
任何帮助都非常感谢。
相关问题:
- 暂无相关问题
1 个回答
0
COM1几乎从来不是Arduino的端口。请仔细检查一下。
另外,试着用串口监视器测试你的Arduino程序,模拟输入一个'y'。
(确保在串口监视器上关闭字符结束功能)