Python OpenCV通过Arduino的串行字节显示下一张图像

时间:2019-02-18 04:41:14

标签: python opencv serialization arduino raspberry-pi

到目前为止,当按下按钮时,arduino将串行数据发送到树莓派上的python程序。发送该数据后,python程序将解释该字节并显示图像。对于显示图像0和图像1,发送的字节分别在0和1之间振荡。但是,当显示一个图像时,我必须在显示第二个图像之前按键盘上的一个键将其清除。这是由于'cv2.waitKey(0)'。

我要实现的目标是,即使显示图像,代码也要接收串行数据,退出当前图像并自动显示下一张图像。更具体地说,我正在尝试通过连接到arduino的按钮来完成所有这些操作

简而言之,目标是按钮->显示图像,再次按钮->显示下一张图像。不能在任何地方使用键盘。

这是我当前使用cv2.waitKey(0)命令使用键盘的代码。任何帮助都会很棒。

Arduino代码:

int First=2;
int buttonState=0;
int num = 0;

void setup()
{
 Serial.begin(9600);
 pinMode(First, INPUT); 

}

void loop()
{
 int buttonState=digitalRead(First);

 if(buttonState==HIGH&&(num==1))
 {
   Serial.print(0x1);
   num--;
   delay(500);
   buttonState = 0;
 }
 if(buttonState==HIGH&&(num==0))
 {
   Serial.print(0x0);
   num++;
   delay(500);
   buttonState = 0;
 }
 if(buttonState==LOW)
 {
   //do nothing
 }
}

Python代码

import numpy
import cv2, glob
import sys
import os
import serial
from subprocess import Popen

ser=serial.Serial('/dev/ttyUSB0',9600)

Title = cv2.imread('/home/pi/Desktop/Avengers/Title.jpg')
Zero = cv2.imread('/home/pi/Desktop/Avengers/000.jpg')

while True:
    command = ser.read()
    if command:
        #flush serial for unprocessed data
        ser.flushInput()
        print("new command:", command)
        if (int(command) == 0):
            cv2.destroyAllWindows()
            cv2.namedWindow("Title", cv2.WND_PROP_FULLSCREEN)
            cv2.setWindowProperty("Title",cv2.WND_PROP_FULLSCREEN,cv2.WINDOW_FULLSCREEN)
            cv2.imshow('Title', Title)
            cv2.waitKey(0)
            cv2.destroyAllWindows()

        if (int(command) == 1):
            cv2.destroyAllWindows()
            cv2.namedWindow("Zero", cv2.WND_PROP_FULLSCREEN)
            cv2.setWindowProperty("Zero",cv2.WND_PROP_FULLSCREEN,cv2.WINDOW_FULLSCREEN)
            cv2.imshow('Zero', Zero)
            cv2.waitKey(0)
            cv2.destroyAllWindows()
            ser.flushInput()

0 个答案:

没有答案