在OpenCV Python中检测到对象时运行舵机

-1 投票
1 回答
815 浏览
提问于 2025-05-16 18:50

我想把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'。

(确保在串口监视器上关闭字符结束功能)

撰写回答