【问题标题】:How to run OpenCV and Arduino PySerial simultaneously如何同时运行 OpenCV 和 Arduino PySerial
【发布时间】:2020-11-23 14:28:14
【问题描述】:

我正在尝试使用 Arduino Uno 通过网络摄像头拍摄快照照片。我正在使用 python OpenCV 与相机接口以捕获视频。我还在为 Arduino 接口使用 pyserial,这样当按下按钮时,Arduino 和 python 将交互并且相机将拍照。我遇到的问题是,当我为 Arduino 运行串行连接时,网络摄像头窗口不会加载视频,例如(没有响应)。当我注释掉与串行接口有关的代码行时,相机窗口框架会加载并且我可以查看视频。我在想,由于这两个设备都通过 USB 连接到我的计算机,PySerial 正在接管串行接口,并且不允许相机视频源将其数据加载到接口上供我查看。我的问题是有没有办法将两者连接在一起,这样当 Arduino 接收到数字输入时,它会向 python 发送“命令”以使网络摄像头拍照?任何建议将不胜感激。

平台:

Windows 10 Python 3.8

Python 代码:

 import cv2
 import serial

 cam = cv2.VideoCapture(0)
 ser = serial.Serial('COM7', 9600)
 cv2.namedWindow("Object")
 img_counter = 0

 while True:
    ret, frame = cam.read()
    snap = ser.read()
    ser.reset_input_buffer()
    
    if not ret:
        print("failed to grab frame")
        break
        cv2.imshow("Object", frame)

    k = cv2.waitKey(1)
    if k%256 == 27:
        # ESC pressed
        print("Program closing...")
        break
    
    elif str(snap) == '1':
        # Button pressed
        img_name = "opencv_frame_{}.png".format(img_counter)
        cv2.imwrite(img_name, frame)
        print("{} written!".format(img_name))
        img_counter += 1

cam.release()

cv2.destroyAllWindows()             

附:如果这个问题看起来很基本,请原谅,我对这个工作范围有点新手。我正在创建这个学校项目来连接神经网络和 PLC。我还有一个 Rasberry Pi,我可以用它来运行神经网络,但这对我来说是另一个需要学习曲线的领域,哈哈。

【问题讨论】:

  • 我不知道什么与什么有关,或者如何!你有一台 Windows PC,OpenCV 在某处运行,Arduino 连接到某个东西,其他东西是串行的,有一个按钮和一个网络摄像头连接到某个东西。也许图表会有所帮助。
  • 网络摄像头已连接到 Windows PC。 OpenCV 在连接到网络摄像头的同一台 Windows PC 中的 Anaconda Spyder IDE 中运行。 Arduino Uno 连接到与网络摄像头连接的同一台 Windows PC。按钮位于面包板上,并连接到所述 Arduino 设备上的引脚 10。运行 OpenCV Python 代码的两个设备(网络摄像头和 Arduino 都通过 USB 端口连接到同一台计算机)。
  • 请问串行连接在做什么?
  • 所以您并没有像第一句话所说的那样真正使用 Arduino 拍照,因为 PC 是与相机对话的人。而且您拍摄的照片并不是真正的照片,因为它是视频。

标签: python opencv arduino


【解决方案1】:

输入串口连接超时时间。

ser=serial.Serial(port='comX',baudrate=9600,timeout=.1) #timeout - float type

我认为没有用 read(),而是 readline()。您可以转换此数据(如果是整数)。

#write this in while 
try:
    dat=ser.readline()
    try:
        datInt=int(dat)
    except:
        print('Convert fail')#often readed b'', and may not converted
except:
    print('Serial connecting fail')

这个 datInt 值是写入的整数。 如果不是intiger,你能不能把方法串起来,用更多的命令来转换。

如果您将列出或读取更多数据,请在此处写一条消息。

祝你好运!

(对不起,我的英语不完美)

【讨论】:

    猜你喜欢
    • 2014-03-12
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    • 2014-09-10
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多