#
# Controlling an RC car via webcam (well, so far, just tracking it...)
#
# Requires OpenCV 2.0 and Python 2.6
#

import cv2.cv as cv


def find_car(image):
    """ Finds red blob (hopefully only one, the rc car) in an image
    """
    size = cv.GetSize(image)

    #prepare memory
    car = cv.CreateImage(size, 8, 1)
    red = cv.CreateImage(size, 8, 1)
    hsv = cv.CreateImage(size, 8, 3)
    sat = cv.CreateImage(size, 8, 1)

    #split image into hsv, grab the sat
    cv.CvtColor(image, hsv, cv.CV_BGR2HSV)
    cv.Split(hsv, None, sat, None, None)

    #split image into rgb
    cv.Split(image, None, None, red, None)

    #find the car by looking for red, with high saturation
    cv.Threshold(red, red, 128, 255, cv.CV_THRESH_BINARY)
    cv.Threshold(sat, sat, 128, 255, cv.CV_THRESH_BINARY)

    #AND the two thresholds, finding the car
    cv.Mul(red, sat, car)

    #remove noise, highlighting the car
    cv.Erode(car, car, iterations=2)
    cv.Dilate(car, car, iterations=5)

    #return a bounding box
    return cv.BoundingRect(car)


points = []
capture = cv.CaptureFromCAM(0)
if not capture:
    print "Error opening capture device"
    sys.exit(1)

cv.SetCaptureProperty(capture, cv.CV_CAP_PROP_FRAME_WIDTH, 640)
cv.SetCaptureProperty(capture, cv.CV_CAP_PROP_FRAME_HEIGHT, 480)

#writer = cv.CreateVideoWriter('test.avi', cv.CV_FOURCC('F','M','P','4'), 30, (640, 480))

while 1:

    original = cv.QueryFrame(capture)

    car_rect = find_car(original)

    middle = (car_rect[0] + (car_rect[2] / 2), car_rect[1] + (car_rect[3]/2))
    if points == []:
        points.append(middle)
    else:
        if abs(points[-1][0] - middle[0]) > 5 and abs(points[-1][1] - middle[1]) > 10:
            points.append(middle)

    cv.Rectangle(original,
                 (car_rect[0], car_rect[1]),
                 (car_rect[0] + car_rect[2], car_rect[1] + car_rect[3]),
                 (255, 0, 0),
                 2,
                 8,
                 0)

    for point in points:
        cv.Circle(original,
                  point,
                  3,
                 (0, 0, 255),
                 -1,
                 8,
                 0)

    #cv.WriteFrame(writer, original)

    cv.ShowImage('Analysed', original)
    k = cv.WaitKey(33)

#
# Controlling an RC car via webcam (well, so far, just tracking it...)
#
# Requires OpenCV 2.0 and Python 2.6
#

import cv2.cv as cv


def find_car(image):
    """ Finds red blob (hopefully only one, the rc car) in an image
    """
    size = cv.GetSize(image)

    #prepare memory
    car = cv.CreateImage(size, 8, 1)
    red = cv.CreateImage(size, 8, 1)
    hsv = cv.CreateImage(size, 8, 3)
    sat = cv.CreateImage(size, 8, 1)

    #split image into hsv, grab the sat
    cv.CvtColor(image, hsv, cv.CV_BGR2HSV)
    cv.Split(hsv, None, sat, None, None)

    #split image into rgb
    cv.Split(image, None, None, red, None)

    #find the car by looking for red, with high saturation
    cv.Threshold(red, red, 128, 255, cv.CV_THRESH_BINARY)
    cv.Threshold(sat, sat, 128, 255, cv.CV_THRESH_BINARY)

    #AND the two thresholds, finding the car
    cv.Mul(red, sat, car)

    #remove noise, highlighting the car
    cv.Erode(car, car, iterations=2)
    cv.Dilate(car, car, iterations=5)

    #return a bounding box
    return cv.BoundingRect(car)


points = []
capture = cv.CaptureFromCAM(0)
if not capture:
    print "Error opening capture device"
    sys.exit(1)

cv.SetCaptureProperty(capture, cv.CV_CAP_PROP_FRAME_WIDTH, 640)
cv.SetCaptureProperty(capture, cv.CV_CAP_PROP_FRAME_HEIGHT, 480)

#writer = cv.CreateVideoWriter('test.avi', cv.CV_FOURCC('F','M','P','4'), 30, (640, 480))

while 1:

    original = cv.QueryFrame(capture)

    car_rect = find_car(original)

    middle = (car_rect[0] + (car_rect[2] / 2), car_rect[1] + (car_rect[3]/2))
    if points == []:
        points.append(middle)
    else:
        if abs(points[-1][0] - middle[0]) > 5 and abs(points[-1][1] - middle[1]) > 10:
            points.append(middle)

    cv.Rectangle(original,
                 (car_rect[0], car_rect[1]),
                 (car_rect[0] + car_rect[2], car_rect[1] + car_rect[3]),
                 (255, 0, 0),
                 2,
                 8,
                 0)

    for point in points:
        cv.Circle(original,
                  point,
                  3,
                 (0, 0, 255),
                 -1,
                 8,
                 0)

    #cv.WriteFrame(writer, original)

    cv.ShowImage('Analysed', original)
    k = cv.WaitKey(33)

# # Controlling an RC car via webcam (well, so far, just tracking it...) # # Requires OpenCV 2.0 and Python 2.6 # Finds red blob (hopefully only one, the rc car) in an image #prepare memory #split image into hsv, grab the sat #split image into rgb #find the car by looking for red, with high saturation #AND the two thresholds, finding the car #remove noise, highlighting the car #return a bounding box #writer = cv.CreateVideoWriter('test.avi', cv.CV_FOURCC('F','M','P','4'), 30, (640, 480)) #cv.WriteFrame(writer, original)