Advertisement
Guest User

Untitled

a guest
Nov 4th, 2014
280
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.71 KB | None | 0 0
  1. import cv
  2. import serial
  3. import time
  4. import threading
  5. import sys
  6.  
  7.  
  8. class Target:
  9.     def __init__(self):
  10.         self.capture = cv.CaptureFromCAM(0)
  11.         cv.NamedWindow("Target", 1)
  12.  
  13.     def run(self):
  14.         # Capture first frame to get size
  15.         frame = cv.QueryFrame(self.capture)
  16.         frame_size = cv.GetSize(frame)
  17.         grey_image = cv.CreateImage(cv.GetSize(frame), cv.IPL_DEPTH_8U, 1)
  18.         moving_average = cv.CreateImage(cv.GetSize(frame), cv.IPL_DEPTH_32F, 3)
  19.         difference = None
  20.         ser = serial.Serial("/dev/ttyACM0", 9600, timeout = 1) #need to uncomment
  21.         connected = 0 # need to change back to 0 after test
  22.         while connected == 0:
  23.             print("not connected") #Just debug message
  24.             ser.write('c') #Seeing if the arduino is open to com yet
  25.             if ser.read() == '4': #Arduino saying it is open to com
  26.                  connected = 1 #Another debug message
  27.                  print("connected")
  28.                  ser = serial.Serial("/dev/ttyACM0", 9600, timeout = .1)
  29.             time.sleep(1)
  30.  
  31.             print("it has slept")
  32.        
  33.         while connected == 1:
  34.             print("it worked")
  35.             # Capture frame from webcam
  36.             color_image = cv.QueryFrame(self.capture)
  37.  
  38.             # Smooth to get rid of false positives
  39.             cv.Smooth(color_image, color_image, cv.CV_GAUSSIAN, 3, 0)
  40.  
  41.             if not difference:
  42.                 # Initialize
  43.                 difference = cv.CloneImage(color_image)
  44.                 temp = cv.CloneImage(color_image)
  45.                 cv.ConvertScale(color_image, moving_average, 1.0, 0.0)
  46.             else:
  47.                 cv.RunningAvg(color_image, moving_average, 0.020, None)
  48.  
  49.             # Convert the scale of the moving average.
  50.             cv.ConvertScale(moving_average, temp, 1.0, 0.0)
  51.  
  52.             # Minus the current frame from the moving average.
  53.             cv.AbsDiff(color_image, temp, difference)
  54.  
  55.             # Convert the image to grayscale.
  56.             cv.CvtColor(difference, grey_image, cv.CV_RGB2GRAY)
  57.  
  58.             # Convert the image to black and white.
  59.             cv.Threshold(grey_image, grey_image, 70, 255, cv.CV_THRESH_BINARY)
  60.  
  61.             # Dilate and erode to get object blobs
  62.             cv.Dilate(grey_image, grey_image, None, 18)
  63.             cv.Erode(grey_image, grey_image, None, 10)
  64.  
  65.             # Calculate movements
  66.             storage = cv.CreateMemStorage(0)
  67.             contour = cv.FindContours(grey_image, storage, cv.CV_RETR_CCOMP, cv.CV_CHAIN_APPROX_SIMPLE)
  68.             points = []
  69.  
  70.             while contour:
  71.                 # Draw rectangles
  72.                 bound_rect = cv.BoundingRect(list(contour))
  73.                 contour = contour.h_next()
  74.  
  75.                 pt1 = (bound_rect[0], bound_rect[1])
  76.                 pt2 = (bound_rect[0] + bound_rect[2], bound_rect[1] + bound_rect[3])
  77.                 points.append(pt1)
  78.                 points.append(pt2)
  79.                 cv.Rectangle(color_image, pt1, pt2, cv.CV_RGB(255,0,0), 1)
  80.  
  81.             num_points = len(points)
  82.             if num_points:
  83.                 # Draw bullseye in midpoint of all movements
  84.                 x = y = 0
  85.                 for point in points:
  86.                     x += point[0]
  87.                     y += point[1]
  88.                 x /= num_points
  89.                 y /= num_points
  90.                 center_point = (x, y)
  91.                 cv.Circle(color_image, center_point, 40, cv.CV_RGB(255, 255, 255), 1)
  92.                 cv.Circle(color_image, center_point, 30, cv.CV_RGB(255, 100, 0), 1)
  93.                 cv.Circle(color_image, center_point, 20, cv.CV_RGB(255, 255, 255), 1)
  94.                 cv.Circle(color_image, center_point, 10, cv.CV_RGB(255, 100, 0), 5)
  95.                     #############serial communication###########
  96.                 ser.write("x") #checking if arduino is ready for new cordinates
  97.                 read = ser.read()
  98.                 if read == '3': #arduino saying it's ready for new cordinates
  99.                    ser.write(str(center_point[0]))
  100.                 read = ser.read()
  101.                 if read == '4':
  102.                    ser.write(str(center_point[1]))
  103.                # print(center_point[1])
  104.                 print(ser.readline(len(str(center_point[1]+3))))
  105.                 ser.flushInput()
  106.                 ser.flushOutput()
  107.              
  108.                    
  109.                
  110.                
  111.             # Display frame to user
  112.             cv.ShowImage("Target", color_image)
  113.  
  114.             # Listen for ESC or ENTER key
  115.             c = cv.WaitKey(7) % 0x100
  116.             if c == 27 or c == 10:
  117.                 ser.close
  118.                 break
  119.                
  120. if __name__=="__main__":
  121.     t = Target()
  122.     t.run()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement