Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
531 views
in Technique[技术] by (71.8m points)

opencv - Python not communicating with Arduino (in real time). Shows no error

I am using Python to communicate with Arduino. The python code uses OpenCV and sends some data to the Arduino.

import cv2
import numpy as np
import serial
import time


arduino = serial.Serial('COM3', 9600) 
time.sleep(2)
print("Connection to arduino...")

frameWidth = 640
frameHeight = 480

cY1=0


cap = cv2.VideoCapture(0)
cap.set(3, frameWidth)
cap.set(4, frameHeight)

def empty(a):
    pass



#colour 
cv2.namedWindow("HSV1")
cv2.resizeWindow("HSV1", 640, 240)
cv2.createTrackbar("HUE Min", "HSV1", 0, 179, empty)
cv2.createTrackbar("HUE Max", "HSV1", 179, 179, empty)
cv2.createTrackbar("SAT Min", "HSV1", 0, 255, empty)
cv2.createTrackbar("SAT Max", "HSV1", 255, 255, empty)
cv2.createTrackbar("VALUE Min", "HSV1", 0, 255, empty)
cv2.createTrackbar("VALUE Max", "HSV1", 255, 255, empty)


while True:

    success, img = cap.read()
    imgHsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)

    #colour 1
    h_min1 = cv2.getTrackbarPos("HUE Min","HSV1")
    h_max1 = cv2.getTrackbarPos("HUE Max", "HSV1")
    s_min1 = cv2.getTrackbarPos("SAT Min", "HSV1")
    s_max1 = cv2.getTrackbarPos("SAT Max", "HSV1")
    v_min1 = cv2.getTrackbarPos("VALUE Min", "HSV1")
    v_max1 = cv2.getTrackbarPos("VALUE Max", "HSV1")

    lower1 = np.array([h_min1,s_min1,v_min1])
    upper1 = np.array([h_max1,s_max1,v_max1])

    mask1 = cv2.inRange(imgHsv,lower1,upper1)       #changed mask to mask1
    cv2.imshow('Mask1', mask1)

    #Moment 1
    M1 = cv2.moments(mask1)

    if M1["m00"] != 0 :
        cX1 = int(M1["m10"] / M1["m00"])
        cY1 = int(M1["m01"] / M1["m00"])
        cv2.circle(img, (cX1,cY1), 5, (255, 255, 255), -1)

    cv2.imshow('centroid1', img)
    print(cX1, cY1)

    data = "A{0:d}E".format(cY1)
    print("output = '" + data + "'")
    arduino.write(data.encode())

    if cv2.waitKey(1) and 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

The arduino part is

#include<Servo.h>

Servo servo1; 
int y1;
int prevy1;

void setup()
{
  Serial.begin(9600);
  servo1.attach(9);
  
  servo1.write(0);
}

void Pos()
{
  if(prevy1 != y1)
  {    int servo1w = map(y1, 0, 0, 479, 179);     
       servo1.write(servo1w);
    }

}

void loop()
{ 
  if(Serial.available() > 0)
  {
    if(Serial.read() == 'A')  
    {
      y1 = Serial.parseInt();
      Pos();       
    }
    while(Serial.available() > 0)
    {
      Serial.read();
    }
  }
}

The Python code works at least till what's visible. It prints the data right before it sends it to arduino also properly. The Arduino does receive data as it starts blinking but the servo doesn't move.

I added code to move servo right after void loop() and one inside the first if statement [if(Serial.available()>0], the first time it moves (right after loop), but it doesn't seem to enter the if block


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)
等待大神答复

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

1.4m articles

1.4m replys

5 comments

56.7k users

...