Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

Finding suitable HSV color

Hi, Im a new learner in OpenCV. Could you please help me in finding the suitble hsv range color for both team and the goalkeeper. I have tested a lot of range, but still does not get a good result. Please help me. Color range that I need is orange(left keeper), green (right keeper), yellow/brown(for left team) and purple/pink(for right team). Could you provide an example. Thanks

import cv2
import numpy as np

cap = cv2.VideoCapture("pitch2.mkv")

kernel_dil = np.ones((0,0), np.uint8)
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3,3))
fgbg = cv2.createBackgroundSubtractorMOG2(history=0, varThreshold=100, detectShadows=False)

while True:

#read frame
ret, frame1 = cap.read()

#screen Resize
frame = cv2.resize(frame1,(1364,700),fx=0,fy=0, interpolation = cv2.INTER_CUBIC)

#warpPerspective
width,height = 682,350
#width,height = 1023,525
pts1 = np.float32([[426,90],[940,90],[11,652],[1353,652]])
pts2 = np.float32([[0,0],[width,0],[0,height],[width,height]])
matrix = cv2.getPerspectiveTransform(pts1,pts2)
warpOutput = cv2.warpPerspective(frame,matrix,(width,height))

#implement ROI
mask = np.zeros(warpOutput.shape, dtype=np.uint8)
mask.fill(255)
roi_corners = np.array([[(0,340), (682,340), (682,20), (0,20)]], dtype=np.int32)
mask = cv2.fillPoly(mask, roi_corners, 0)
masking = cv2.bitwise_or(warpOutput, mask)

if ret == True:
    fgmask1 = fgbg.apply(masking,mask)
    fgmask2 = cv2.morphologyEx(fgmask1, cv2.MORPH_OPEN, kernel)
    dilation = cv2.dilate(fgmask2, kernel_dil, iterations = 0)
    (contours,hierarchy) = cv2.findContours(dilation, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

    XContour = []
    maxX = 0
    xBefore = 0

    XCont = []
    max_x = 0
    xLast = 0

    for pic, contour in enumerate(contours):

        area = cv2.contourArea(contour)
        x,y,w,h = cv2.boundingRect(contour)
        if(area>5): #set to 2 to undetect the ball

            player_img = warpOutput[y:y+h,x:x+6]
            player_hsv = cv2.cvtColor(player_img,cv2.COLOR_BGR2HSV)

            lower_purple = np.array([150,150,100])
            upper_purple = np.array([184,255,255])

            lower_yellow = np.array([70,150,100])
            upper_yellow = np.array([100,255,255])

            lower_green = np.array([70,150,100])
            upper_green = np.array([100,255,255])

            lower_orange = np.array([70,150,100])
            upper_orange = np.array([100,255,255])

            mask_purple = cv2.inRange(player_img, lower_purple, upper_purple)
            output_purple = cv2.bitwise_and(player_hsv, player_img, mask = mask_purple)
            resPurple = cv2.cvtColor(output_purple,cv2.COLOR_HSV2BGR)
            resPurple = cv2.cvtColor(resPurple,cv2.COLOR_BGR2GRAY)
            nzCountPurple = cv2.countNonZero(resPurple)

            mask_yellow = cv2.inRange(player_img, lower_yellow, upper_yellow)
            output_yellow = cv2.bitwise_and(player_img, player_img, mask = mask_yellow)
            resYellow = cv2.cvtColor(output_yellow,cv2.COLOR_HSV2BGR)
            resYellow = cv2.cvtColor(resYellow,cv2.COLOR_BGR2GRAY)
            nzCountYellow = cv2.countNonZero(resYellow)

            mask_green = cv2.inRange(player_img, lower_green, upper_green)
            output_green = cv2.bitwise_and(player_img, player_img, mask = mask_green)
            resGreen = cv2.cvtColor(output_green,cv2.COLOR_HSV2BGR)
            resGreen = cv2.cvtColor(resGreen,cv2.COLOR_BGR2GRAY)
            nzCountGreen = cv2.countNonZero(resGreen)

            mask_orange = cv2.inRange(player_img, lower_orange, upper_orange)
            output_orange = cv2.bitwise_and(player_img, player_img, mask = mask_orange)
            resOrange = cv2.cvtColor(output_orange,cv2.COLOR_HSV2BGR)
            resOrange = cv2.cvtColor(resOrange,cv2.COLOR_BGR2GRAY)
            nzCountOrange = cv2.countNonZero(resOrange)

            if(nzCountPurple>=5):
                    cv2.rectangle(warpOutput, (x,y), (x+w,y+h), (0,255,255), 1)

            elif(nzCountYellow>=5):
                cv2.rectangle(warpOutput, (x,y), (x+w,y+h), (0,0,0), 1)

            elif(nzCountGreen>=5):
                cv2.rectangle(warpOutput, (x,y), (x+w,y+h), (255,255,0), 1)

            elif(nzCountOrange>=5):
                cv2.rectangle(warpOutput, (x,y), (x+w,y+h), (255,0,0), 1)

            else:
                cv2.rectangle(warpOutput, (x,y), (x+w,y+h), (0,0,255), 1)

    # cv2.line(warpOutput, (110,144), (110,232), (255,0,0), 1)

cv2.imshow("FullScreen", frame)
cv2.imshow("WarpOutput", warpOutput)

key = cv2.waitKey(10)
if key == ord("q"):
    print("Video Stopped")
    break

cap.release()
cv2.destroyAllWindows()