Opencv 最佳目标检测与跟踪算法
我是Opencv的新手。我想创建一个跟踪足球运动员的目标检测算法。我想知道那个球员是谁,他的球衣号码是多少。我想知道找到它的最好方法是什么。我应该使用哪种算法。我做了一个项目,跟踪用户的颜色范围,在其中我将每个视频图像转换为Opencv 最佳目标检测与跟踪算法,opencv,tensorflow,deep-learning,Opencv,Tensorflow,Deep Learning,我是Opencv的新手。我想创建一个跟踪足球运动员的目标检测算法。我想知道那个球员是谁,他的球衣号码是多少。我想知道找到它的最好方法是什么。我应该使用哪种算法。我做了一个项目,跟踪用户的颜色范围,在其中我将每个视频图像转换为hsv。但我面临的挑战是,在发现球员后,我如何才能找到球衣号码 这是我的密码- #Import libraries import cv2 import os import numpy as np # import the necessary packages from co
hsv
。但我面临的挑战是,在发现球员后,我如何才能找到球衣号码
这是我的密码-
#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()
#导入库
进口cv2
导入操作系统
将numpy作为np导入
#导入必要的包
从集合导入deque
将numpy作为np导入
进口cv2
导入imutils
导入时间
#阅读视频
vidcap=cv2.VideoCapture('football.mp4')
成功,image=vidcap.read()
计数=0
成功=正确
idx=0
#逐帧阅读视频
在取得成功的同时:
#转换成hsv图像
hsv=cv2.cvt颜色(图像,cv2.COLOR\u BGR2HSV)
#绿野
下_green=np.数组([40,40,40])
上_green=np.array([70255255])
#蓝区
lower_blue=np.数组([110,50,50])
上_蓝=np.数组([130255255])
#红场
lower_red=np.数组([0,31255])
上部红色=np.数组([176255255])
#白区
lower_white=np.数组([0,0,0])
上_white=np.数组([0,0255])
#定义范围从较低到较高的遮罩
遮罩=cv2.inRange(hsv,下绿色,上绿色)
#做掩蔽
res=cv2.按位_和(图像,图像,掩码=掩码)
#将hsv转换为灰色
res_bgr=cv2.CVT颜色(res,cv2.COLOR_HSV2BGR)
res_gray=cv2.CVT颜色(res,cv2.COLOR_BGR2GRAY)
#定义一个核函数对阈值图像进行形态学运算
#获得更好的输出。
kernel=np.one((13,13),np.uint8)
thresh=cv2.阈值(res_gray,127255,cv2.thresh_BINARY_INV | cv2.thresh_OTSU)[1]
thresh=cv2.morphologyEx(thresh,cv2.MORPH\u CLOSE,kernel)
#在阈值图像中寻找轮廓
im2,等高线,层次=cv2.findContours(阈值,cv2.RETR\u树,cv2.CHAIN\u近似值\u简单)
prev=0
font=cv2.font\u HERSHEY\u SIMPLEX
对于等高线中的c:
x、 y,w,h=cv2.boundingRect(c)
#检测玩家
如果(h>=(1.5)*w):
如果(w>15且h>=15):
idx=idx+1
player_img=图像[y:y+h,x:x+w]
player\u hsv=cv2.cvt颜色(player\u img,cv2.COLOR\u BGR2HSV)
#如果玩家有蓝色球衣
mask1=cv2.inRange(播放器、下蓝、上蓝)
res1=cv2.按位与(player\u img,player\u img,mask=mask1)
res1=cv2.cvt颜色(res1,cv2.COLOR_HSV2BGR)
res1=cv2.cvt颜色(res1,cv2.COLOR\u bgr2灰色)
nzCount=cv2.countNonZero(res1)
#如果球员有红色球衣
mask2=cv2.inRange(播放器高速、下红色、上红色)
res2=cv2.按位与(player\u img,player\u img,mask=mask2)
res2=cv2.cvt颜色(res2,cv2.COLOR_HSV2BGR)
res2=cv2.cvt颜色(res2,cv2.COLOR\u bgr2灰色)
nzCountred=cv2.countNonZero(res2)
如果(nzCount>=20):
#马克·蓝·杰西是法国队的球员
cv2.putText(图像“France”(x-2,y-2),字体,0.8,(255,0,0),2,cv2.LINE_AA)
cv2.矩形(图像,(x,y),(x+w,y+h),(255,0,0),3)
其他:
通过
如果(nzCountred>=20):
#马克·雷德·杰西是比利时队的球员
cv2.putText(图像‘比利时’,(x-2,y-2),字体,0.8,(0,0255),2,cv2.LINE_AA)
cv2.矩形(图像,(x,y),(x+w,y+h),(0,0255),3)
其他:
通过
如果((h>=1和w>=1)和(h关于“在(新数据集或任务)Y上执行X的最佳算法”的问题对于学习算法是非常无效的,因为它们都是针对我们的应用程序进行调整的,基于我们训练它们的数据,并且没有(或可以)保证最优性
如今的检测算法使用了多种机制,从使用深度学习的目标检测、卡尔曼滤波到跟踪和合并不同背景和融合
你可以问问自己追踪和探测的区别。试着找出(完美地)探测(同一个物体)的区别与使用时间信息跟踪它相比,在多个帧中。如果您可以完美地找到所有对象,并一致地对实例进行编号,那么现在的区别是什么
我可以向你推荐许多研究它的来源,例如facebook的媒体文章(基于Mask RCNN)等等。在谷歌中尝试各种关键字组合以增强你的结果:“对象检测深度学习”(过滤2017年及以上)、“目标跟踪”在学者中
祝您好运!您可以使用OpenCV进行对象跟踪:
然后训练您自己的OpenCV cascade识别球衣号码:
有关OpenCV安装的更多信息,请参阅:
及
这是您可能需要的:
您可以从一个虚拟项目开始,使用一个带有预先训练的coco模型的神经网络:
如果您需要更多,请学习如何减少要检测的类(人、车、公共汽车等)的数量。如果您需要更复杂的解决方案,请培训您自己的神经网络或根据您的需要调整现有网络(google for transfer learning)
无论如何,你应该这样做。你可以从这篇最近的论文()中查到百度开发的CNN在图像识别问题上是最先进的。Hi,谢谢你宝贵的回答。我需要更多的指导,因为我对opencv非常陌生,非常感谢你的帮助。嘿-我很高兴为你提供具体帮助,但我不能教你opencv。一旦你有了玩家边界框,你需要跟踪它从一帧到另一帧。对于球衣号码,我建议使用OCR