[PYTHON] Notes pour une analyse vidéo de basketball difficile

http://qiita.com/northriver/items/d6b73da79a13bf3526e2 Maintenant que vous connaissez opencv, défions le titre

Tout d'abord, comprenez l'utilisation de quelque chose qui semble utile

J'ai trouvé un code qui suit la balle verte, alors je vais essayer. Cela semble être détecté par la couleur http://www.pyimagesearch.com/2015/09/14/ball-tracking-with-opencv/

#Importer les packages requis
from collections import deque
import numpy as np
import argparse
import imutils
import cv2
#Faites un argument à exécuter. "Python xxx.py -v test.mov "-À propos de v
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())

Cliquez ici pour une explication de argparse http://python.civic-apps.com/argparse/

#Définir la couleur de la balle qui poursuit"green" (HSV)
greenLower = (29, 86, 6)
greenUpper = (64, 255, 255)
pts = deque(maxlen=args["buffer"])

Espace colorimétrique HSV http://www.peko-step.com/html/hsv.html

#S'il y a un argument, le chemin du fichier, sinon, vers la webcam
if not args.get("video", False):
	camera = cv2.VideoCapture(0)
else:
	camera = cv2.VideoCapture(args["video"])
while True:
	#Appareil photo, prenez une vidéo
	(grabbed, frame) = camera.read()
 
	#Si tu ne peux pas, brise
	if args.get("video") and not grabbed:
		break
 
	# resize
	frame = imutils.resize(frame, width=600)
	#Convertir en hsv
	hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
	#Extraire uniquement la partie verte et effectuer la conversion morphologique
	mask = cv2.inRange(hsv, greenLower, greenUpper)
	mask = cv2.erode(mask, None, iterations=2)
	mask = cv2.dilate(mask, None, iterations=2)

Je fais une conversion de morphologie. La transformation morphologique extrait la partie caractéristique de l'objet et supprime les autres parties. J'essaye de le réduire. cv2.erode se contracte (Erosion) pour quitter la partie caractéristique, et cv2.dilate se dilate (Dilation) pour ne restaurer que la partie importante. http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_imgproc/py_morphological_ops/py_morphological_ops.html

	#Extraire le contour des données binaires en noir et blanc
	# (x, y) center of the ball
	cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)[-2]
	center = None

Extraire les contours des données binaires en noir et blanc avec cv2.findContours. RETR_EXTERNAL est un mode qui extrait uniquement la partie la plus externe, CHAIN_APPROX_SIMPLE est une méthode de méthode d'approximation de contour http://opencv.jp/opencv-2.1/cpp/structural_analysis_and_shape_descriptors.html

    if len(cnts) > 0:
        #Calculez la superficie occupée par la superficie et trouvez celle qui a la plus grande superficie
        c = max(cnts, key=cv2.contourArea)
        #Trouvez le plus petit cercle
        ((x, y), radius) = cv2.minEnclosingCircle(c)
    #Moment(Valeurs de base telles que la surface et le centre de gravité)Et obtenir les coordonnées du centre du cercle
        M = cv2.moments(c)
        center = (int(M["m10"] / M["m00"]), int(M["m01"] / M["m00"]))

        #Tracez un cercle
        if radius > 10:
            cv2.circle(frame, (int(x), int(y)), int(radius),
(0, 255, 255), 2)
            cv2.circle(frame, center, 5, (0, 0, 255), -1)

http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_imgproc/py_contours/py_contour_features/py_contour_features.html

Ce qui suit est de suivre la trajectoire, donc vous n'avez pas à

	# 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)

Le reste est juste sorti, c'est le même que le tutoriel

	# 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()

Connectez-vous du début à la fin

# import the necessary packages
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 = (29, 86, 6)
greenUpper = (64, 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
	mask = cv2.inRange(hsv, greenLower, greenUpper)
	mask = cv2.erode(mask, None, iterations=2)
	mask = cv2.dilate(mask, None, iterations=2)
	# 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()

Bon, j'ai essayé jusqu'à présent, mais quand j'ai mis une vidéo de basket, je n'ai pas pu le détecter, il y a un problème de couleur

greenLower = (7,100,100)
greenUpper = (11,255,255)

Dans le cas du basket-ball, les ballons sont de couleur similaire à celle du gymnase et les vieux ballons sont noirs. Par conséquent, il est nécessaire d'utiliser une méthode de reconnaissance autre que la détection de couleur.

http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_video/py_table_of_contents_video/py_table_of_contents_video.html#py-table-of-content-video J'ai aussi trouvé une version améliorée http://answers.opencv.org/question/17637/backgroundsubtractormog-with-python/ Pour le moment, il y a aussi une méthode pour détecter les mouvements par différence de fond, donc je l'ai essayé, mais dans le cas du basket, la caméra bouge, donc il n'y a pas de fond ... Subtil ...

Je ne peux pas trouver une bonne idée ... Veuillez me faire savoir si vous souhaitez le faire.

cette? http://qiita.com/olympic2020/items/3d8973f855e963c9d999

Je l'ai essayé, mais cela n'a pas fonctionné ...

Recommended Posts

Notes pour une analyse vidéo de basketball difficile
Conseils et précautions lors de l'analyse des données
Structure des dossiers pour l'analyse
Analyse de la source pour Django - INSTALLED_APPS
Notes d'installation pour TensorFlow pour Windows
Python pour l'analyse des données Chapitre 4
Mémo Python Tkinter (pour moi)
[Python] Notes sur l'analyse des données
Notes d'apprentissage sur l'analyse des données Python
Python pour l'analyse des données Chapitre 2
Notes pour le concours de programmation HHKB 2020
Python pour l'analyse des données Chapitre 3