Created
September 17, 2017 14:58
-
-
Save liyanasahir/1e0424c695ca9ee86c2876be6d19cc06 to your computer and use it in GitHub Desktop.
Tracking two balls using OpenCV-Python
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from collections import deque | |
import numpy as np | |
import argparse | |
import imutils | |
import cv2 | |
# construct the argument parse and parse the arguments | |
ap = argparse.ArgumentParser() | |
ap.add_argument("-v", "--video", | |
help="path to the (optional) video file") | |
ap.add_argument("-b", "--buffer", type=int, default=64, | |
help="max buffer size") | |
args = vars(ap.parse_args()) | |
# define the lower and upper boundaries of the "green" | |
# ball in the HSV color space, then initialize the | |
# list of tracked points | |
greenLower = (44, 86, 56) | |
greenUpper = (94, 177, 255) | |
redLower = (133, 54, 99) | |
redUpper = (255, 255, 255) | |
pts = deque(maxlen=args["buffer"]) | |
# if a video path was not supplied, grab the reference | |
# to the webcam | |
if not args.get("video", False): | |
camera = cv2.VideoCapture(0) | |
# otherwise, grab a reference to the video file | |
else: | |
camera = cv2.VideoCapture(args["video"]) | |
# keep looping | |
while True: | |
# grab the current frame | |
(grabbed, frame) = camera.read() | |
# if we are viewing a video and we did not grab a frame, | |
# then we have reached the end of the video | |
if args.get("video") and not grabbed: | |
break | |
# resize the frame, blur it, and convert it to the HSV | |
# color space | |
frame = imutils.resize(frame, width=600) | |
# blurred = cv2.GaussianBlur(frame, (11, 11), 0) | |
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) | |
# construct a mask for the color "green", then perform | |
# a series of dilations and erosions to remove any small | |
# blobs left in the mask | |
mask1 = cv2.inRange(hsv, greenLower, greenUpper) | |
mask1 = cv2.erode(mask1, None, iterations=2) | |
mask1 = cv2.dilate(mask1, None, iterations=2) | |
mask2 = cv2.inRange(hsv, redLower, redUpper) | |
mask2 = cv2.erode(mask2, None, iterations=2) | |
mask2 = cv2.dilate(mask2, None, iterations=2) | |
mask = cv2.bitwise_or(mask1, mask2) | |
# find contours in the mask and initialize the current | |
# (x, y) center of the ball | |
cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, | |
cv2.CHAIN_APPROX_SIMPLE)[-2] | |
center = None | |
# only proceed if at least one contour was found | |
if len(cnts) > 0: | |
# find the largest contour in the mask, then use | |
# it to compute the minimum enclosing circle and | |
# centroid | |
c = max(cnts, key=cv2.contourArea) | |
((x, y), radius) = cv2.minEnclosingCircle(c) | |
M = cv2.moments(c) | |
center = (int(M["m10"] / M["m00"]), int(M["m01"] / M["m00"])) | |
# only proceed if the radius meets a minimum size | |
if radius > 10: | |
# draw the circle and centroid on the frame, | |
# then update the list of tracked points | |
cv2.circle(frame, (int(x), int(y)), int(radius), | |
(0, 255, 255), 2) | |
cv2.circle(frame, center, 5, (0, 0, 255), -1) | |
# update the points queue | |
pts.appendleft(center) | |
# loop over the set of tracked points | |
for i in xrange(1, len(pts)): | |
# if either of the tracked points are None, ignore | |
# them | |
if pts[i - 1] is None or pts[i] is None: | |
continue | |
# otherwise, compute the thickness of the line and | |
# draw the connecting lines | |
thickness = int(np.sqrt(args["buffer"] / float(i + 1)) * 2.5) | |
cv2.line(frame, pts[i - 1], pts[i], (0, 0, 255), thickness) | |
# show the frame to our screen | |
cv2.imshow("Frame", frame) | |
key = cv2.waitKey(1) & 0xFF | |
# if the 'q' key is pressed, stop the loop | |
if key == ord("q"): | |
break | |
# cleanup the camera and close any open windows | |
camera.release() | |
cv2.destroyAllWindows() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
There is an error on line 92 for i in xrange(1, len(pts)) should be for i in range(1, len(pts))
Thank you for the code. Worked first time after fixing that.