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

我是Opencv的新手。我想创建一个跟踪足球运动员的目标检测算法。我想知道那个球员是谁,他的球衣号码是多少。我想知道找到它的最好方法是什么。我应该使用哪种算法。我做了一个项目,跟踪用户的颜色范围,在其中我将每个视频图像转换为
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