Je suis Newbie pour OpenCV. Je souhaite créer un algorithme de détection d'objet qui suit un joueur de football. Je veux savoir qui est ce joueur quel est son numéro de maillot. Je veux savoir est la meilleure façon de le trouver. Quel algorithme dois-je utiliser? J'ai fait un projet qui suit l'utilisateur avec la plage de couleurs dans laquelle j'ai converti chaque image vidéo en Voici mon code - P> HSV code>. Mais le défi me vient à moi, c'est qu'après avoir détecté le joueur, comment puis-je trouver le numéro de maillot.
#Import libraries
import cv2
import os
import numpy as np
# import the necessary packages
from collections import deque
import numpy as np
import cv2
import imutils
import time
#Reading the video
vidcap = cv2.VideoCapture('football.mp4')
success,image = vidcap.read()
count = 0
success = True
idx = 0
#Read the video frame by frame
while success:
#converting into hsv image
hsv = cv2.cvtColor(image,cv2.COLOR_BGR2HSV)
#green range
lower_green = np.array([40,40, 40])
upper_green = np.array([70, 255, 255])
#blue range
lower_blue = np.array([110,50,50])
upper_blue = np.array([130,255,255])
#Red range
lower_red = np.array([0,31,255])
upper_red = np.array([176,255,255])
#white range
lower_white = np.array([0,0,0])
upper_white = np.array([0,0,255])
#Define a mask ranging from lower to uppper
mask = cv2.inRange(hsv, lower_green, upper_green)
#Do masking
res = cv2.bitwise_and(image, image, mask=mask)
#convert to hsv to gray
res_bgr = cv2.cvtColor(res,cv2.COLOR_HSV2BGR)
res_gray = cv2.cvtColor(res,cv2.COLOR_BGR2GRAY)
#Defining a kernel to do morphological operation in threshold image to
#get better output.
kernel = np.ones((13,13),np.uint8)
thresh = cv2.threshold(res_gray,127,255,cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
thresh = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
#find contours in threshold image
im2,contours,hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
prev = 0
font = cv2.FONT_HERSHEY_SIMPLEX
for c in contours:
x,y,w,h = cv2.boundingRect(c)
#Detect players
if(h>=(1.5)*w):
if(w>15 and h>= 15):
idx = idx+1
player_img = image[y:y+h,x:x+w]
player_hsv = cv2.cvtColor(player_img,cv2.COLOR_BGR2HSV)
#If player has blue jersy
mask1 = cv2.inRange(player_hsv, lower_blue, upper_blue)
res1 = cv2.bitwise_and(player_img, player_img, mask=mask1)
res1 = cv2.cvtColor(res1,cv2.COLOR_HSV2BGR)
res1 = cv2.cvtColor(res1,cv2.COLOR_BGR2GRAY)
nzCount = cv2.countNonZero(res1)
#If player has red jersy
mask2 = cv2.inRange(player_hsv, lower_red, upper_red)
res2 = cv2.bitwise_and(player_img, player_img, mask=mask2)
res2 = cv2.cvtColor(res2,cv2.COLOR_HSV2BGR)
res2 = cv2.cvtColor(res2,cv2.COLOR_BGR2GRAY)
nzCountred = cv2.countNonZero(res2)
if(nzCount >= 20):
#Mark blue jersy players as france
cv2.putText(image, 'France', (x-2, y-2), font, 0.8, (255,0,0), 2, cv2.LINE_AA)
cv2.rectangle(image,(x,y),(x+w,y+h),(255,0,0),3)
else:
pass
if(nzCountred>=20):
#Mark red jersy players as belgium
cv2.putText(image, 'Belgium', (x-2, y-2), font, 0.8, (0,0,255), 2, cv2.LINE_AA)
cv2.rectangle(image,(x,y),(x+w,y+h),(0,0,255),3)
else:
pass
if((h>=1 and w>=1) and (h<=30 and w<=30)):
player_img = image[y:y+h,x:x+w]
player_hsv = cv2.cvtColor(player_img,cv2.COLOR_BGR2HSV)
#white ball detection
mask1 = cv2.inRange(player_hsv, lower_white, upper_white)
res1 = cv2.bitwise_and(player_img, player_img, mask=mask1)
res1 = cv2.cvtColor(res1,cv2.COLOR_HSV2BGR)
res1 = cv2.cvtColor(res1,cv2.COLOR_BGR2GRAY)
nzCount = cv2.countNonZero(res1)
if(nzCount >= 3):
# detect football
cv2.putText(image, 'football', (x-2, y-2), font, 0.8, (0,255,0), 2, cv2.LINE_AA)
cv2.rectangle(image,(x,y),(x+w,y+h),(0,255,0),3)
cv2.imwrite("./Cropped/frame%d.jpg" % count, res)
# print('Read a new frame: ', success) # save frame as JPEG file
count += 1
cv2.imshow('Match Detection',image)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
success,image = vidcap.read()
vidcap.release()
cv2.destroyAllWindows()
4 Réponses :
La question de la "meilleure algorithme d'exécution de x sur (nouveau jeu de données ou de la tâche) Y" est assez invalide pour l'apprentissage des algorithmes, car ils sont tous écoutés pour nos applications, en fonction des données que nous les avons formées et aucune optimalité n'est (ou peut être) garantie. p>
Algorithmes de détection De nos jours utilisez une grande variété de mécanismes, de la détection des objets à l'aide d'un apprentissage profond, de la filtration de Kalman à la piste et de l'incorporation de contextes et de fusion différents. P>
Vous pouvez vous demander la différence entre le suivi et la détection. Essayez de trouver les différences entre la détection (parfaitement) un objet (de la même instance) dans plusieurs cadres vs le suivi en utilisant les informations de temps. Si vous pouviez parfaitement trouver tous les objets, et le nombre d'instances de manière cohérente, quelle est la différence maintenant? P>
Je peux vous renvoyer à de nombreuses sources pour l'étudier, pour des exemples Ceci article moyen, Detectron de Facebook (basé sur MASK-RCNN) et ainsi de suite. Essayez diverses combinaisons de mots-clés dans Google pour améliorer vos résultats: "L'apprentissage profond de la détection d'objet" (filtrer pour 2017 et supérieur), "Suivi de l'objet" en érudit ... P>
bonne chance! p>
Vous pouvez utiliser OPENCV pour le suivi de l'objet: P>
Entraînez votre propre cascade OpenCV pour reconnaître le numéro de maillot: P>
Formation de cascade personnalisée sur mesure + monuments faciaux P>
Pour plus d'informations sur l'installation OpenCV, reportez-vous à la section: P>
https://www.pyimagesearch.com/ et p>
https://www.learnopencv.com/ p>
C'est ce que vous avez probablement besoin: p>
Vous pouvez commencer par un projet factice à l'aide d'un réseau de neurones avec un modèle de coco pré-formé: https://github.com/icy3d/hello-coco-py P >
Si vous avez besoin de plus apprendre à réduire le nombre de classes à détecter (personne, voiture, bus, ..). Si vous avez besoin de plusieurs solutions SophicstiCated, formez votre propre réseau de neurones ou adaptez un réseau existant à vos besoins (Google pour l'apprentissage de transfert). P>
De toute façon, vous devriez Se familiariser avec Tensorflow . p>
Bonjour, merci pour votre réponse précieuse. J'ai besoin de plus de conseils que je suis très nouveau à OpenCV et j'apprécierais votre aide.
Hé - Je suis heureux d'aider à faire des détails, mais je ne peux pas vous enseigner à OpenCV. Une fois que vous avez la boîte de liaison des joueurs, vous devez le suivre du cadre à l'encadre. Et pour le numéro de maillot, je recommanderais d'utiliser OCR pour extraire le nombre. Regardez ce tutoriel: pyimagesearch.com/2018/09/17/...
Génial ... merci ... j'apprends un cours sur OpenCV. Et j'espère que cela ne vous dérange pas si j'ai des questions futures. Apprécier ton aide. Merci, stackoverflow ami.
Vous pouvez vérifier à partir de ce document récent ( https://arxiv.org/pdf/1902.03524.pdf ) que le CNN développé par Baidu est l'état de la technique dans un problème de reconnaissance d'image. P>