2017-05-08 362 views
0

我试图检查我的OpenCV代码是否与Arduino通信。Python(OpenCV)和Arduino之间的串行通信

OpenCV的代码:

import numpy as np 
import cv2 
import serial 
import time 
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.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) 

    for (x, y, w, h) in faces: 
     cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2) 
     detect=x 
     print(detect) 

     cv2.imshow('img', img) 
     k = cv2.waitKey(30) & 0xff 

     if 0 < detect < 100: 
     ser = serial.Serial("COM1", 19200, timeout=5) 
     time.sleep(2) 
     ser.write("\x35") 
     print "RECIEVED BACK:", repr(ser.read(5000)) 

     if k == 27: 
      break 

Arduino的代码:

int incomingByte = 0; // for incoming serial data 

void setup() { 
     Serial.begin(19200);  
} 

void loop() { 

     // send data only when you receive data: 
     if (Serial.available() > 0) { 
       // read the incoming byte: 
       incomingByte = Serial.read(); 

       // say what you got: 
       Serial.print("I received: "); 
       Serial.println(incomingByte, DEC); 
     } 
} 

我获得以下 '检测' 值:

'301 
71 
RECIEVED BACK: 'I received: 53\r\n' 
299 
301 
301 
302 
302 
301 
303 
300 
306 
72' 

在检测= 71,信号被发送到的Arduino ,它会返回一个值,之后它会工作一段时间,然后所有通信都会中断,并且出现以下错误:

Traceback (most recent call last): 
    File "C:/Users/khan1/Desktop/python 
    project/tennis_ball_vid/tennis_vid.py", line 40, in <module> 
    ser = serial.Serial('COM1', 19200,timeout=5) 
    File "C:\Python27\lib\site-packages\serial\serialwin32.py", line 38, in 
__init__ 
    SerialBase.__init__(self, *args, **kwargs) 
    File "C:\Python27\lib\site-packages\serial\serialutil.py", line 282, in 
__init__ 
    self.open() 
    File "C:\Python27\lib\site-packages\serial\serialwin32.py", line 66, in 
    open 
    raise SerialException("could not open port %r: %r" % (self.portstr, 
    ctypes.WinError())) 
serial.serialutil.SerialException: could not open port 'COM1': 
WindowsError(5, 'Access is denied.') 

Process finished with exit code 1 

这是我原来的职位: Serial comunication between opencv (python) and arduino

如何保持通讯畅通?

+1

请解决您的压痕。你向Arduino发送信号的地方,它从哪里获得价值? 'serial.Serial('COM1',19200,timeout = 5)'行创建一个端口对象,但不发送或接收任何东西。 –

+0

您不断打开序列号,但从不关闭它。为什么不在开始时打开它。 –

+0

我编辑了我的帖子。对不起,沟通不畅。 @PaulCornelius – sayem48

回答

1

评论:我不明白你的问题。你能解释一下

loop应该是这样的,比如:

ser = serial.Serial("COM1", 19200, timeout=5) 
time.sleep(2) 
while True: 
    ret, img = cap.read() 
    # ... img processing 

    for (x, y, w, h) in faces: 
     # ... faces processing 

     if 0 < detect < 100: 
      print('ser.is_open=%s' % ser.is_open()) 
      ser.write("\x35") 
      print("RECIEVED BACK:", repr(ser.read(5000))) 

问题:如何保持通讯畅通?

移动代码的while ...循环外该行

ser = serial.Serial('COM1', 19200,timeout=5) 
time.sleep(6) 
print(ser) 
+0

似乎解决了这个问题!非常感谢@stovfl – sayem48

+0

端口一直保持打开状态,直到您调用ser.close()。如果0 stovfl

+0

我不明白你的问题。你能解释一下吗? – sayem48