2

I'm trying to get the text "P1" and "P2" from the upper left corner of the video.

P1

P2

I take a frame and crop them down to following images and then apply the image processing found here:

P1 Crop

P2 Crop

use pytesseract to recognize text from image

and while it works on cropped still images I edited manually using an image editor, it doesn't work when taking frames from the video using cv2.

I'm not sure why this is but I suspect it has something to do with the black and white background like in the picture below, but I don't know how to get rid of it without also removing the text.

P1 post image manipulation

and here's my code

import cv2
import pytesseract
import re
from difflib import SequenceMatcher
def determineWinner(video):
    winnerRect = [(70,95),(146,152)]
    cap = cv2.VideoCapture(video)
    if(cap.isOpened() == False):
        print("No dice")
        return
    fps = cap.get(cv2.CAP_PROP_FPS)
    frames = cap.get(cv2.CAP_PROP_FRAME_COUNT)
    print(fps)
    print(frames)
    desiredSeek = frames - int(fps * 9)
    print(desiredSeek)
    seconds = desiredSeek/fps
    print(seconds)
    minutes = seconds/60
    print(minutes)
    partial = minutes - int(minutes)
    print(partial)
    seconds = partial * 60
    print(seconds)
    print(str(int(minutes)) +":"+ str(seconds))

    cap.set(cv2.CAP_PROP_POS_FRAMES,(desiredSeek))

    ret,img = cap.read()
    winTxt = []
    p1Count = 0
    p2Count = 0

    cv2.namedWindow("",cv2.WINDOW_NORMAL)

    ret,img = cap.read()
    while ret:
        key = cv2.waitKey(1)
        if key == ord('q'):
            break
        if key == ord('e'):
            ret,img = cap.read()
            if ret:
                winROI = img[winnerRect[0][1]:winnerRect[1][1],winnerRect[0][0]:winnerRect[1][0]]
                gray = cv2.cvtColor(winROI, cv2.COLOR_BGR2GRAY)
                blur = cv2.GaussianBlur(gray, (3,3), 0)
                thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]

                # Morph open to remove noise and invert image
                kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
                opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=1)
                invert = 255-opening
                invert=cv2.resize(invert,None,fx=2,fy=2)
                wConfig='-l eng --oem 1 --psm 10 -c tessedit_char_whitelist=P12'
                winTxt = pytesseract.image_to_string(invert,config=wConfig)
                cv2.rectangle(img,winnerRect[0],winnerRect[1],(255,0,0),2)
                cv2.imshow("winroi",invert)
                cv2.imshow("",img)
                cv2.resizeWindow("",800,600)
                print(winTxt)
                desiredSeek+=1
                seconds = desiredSeek/fps
                minutes = seconds/60
                partial = minutes - int(minutes)
                seconds = partial * 60
                print(str(int(minutes)) +":"+ str(seconds))
            else:
                break

    cap.release()
    cv2.destroyAllWindows()
Cătălina Sîrbu
  • 1,253
  • 9
  • 30
DohnJoe
  • 146
  • 1
  • 1
  • 7
  • You could try to apply a color filter (one for the blue inside the P1) and one for the pink inside the P2. Then, you would only see that specific color. You could then apply the other functions. Let me know if you know what I mean. – Cătălina Sîrbu May 17 '20 at 13:33
  • @CătălinaSîrbu So filter our the non red/blue colors, is that what you're saying? – DohnJoe May 17 '20 at 13:36

1 Answers1

2

This code works as a testing script. I only extracted the parameters for the image containing P1. For applying a filter on a new image, just erase the predefined thresholds values as following:

From:

low_blue, low_green, low_red, upper_blue, upper_green, upper_red = (115, 0, 0, 255, 178, 255)

To:

low_blue, low_green, low_red, upper_blue, upper_green, upper_red = (0, 0, 0, 255, 255, 255)

And start modifying the parameters as described below. After determining the parameters, press esc to exit the program, take the parameters shown in the console and paste them in the thresholds tuple.


How to use it:

  • Very important. For this to work properly, you have to select with left click of the mouse, the window from cv2.imshow() , in this case Original image or Binary image

  • q increases and w decreases the lower blue threshold

  • a increases and s decreases the lower green threshold
  • ... so on and so forth for both lower and upper colors (BGR) thresholds

import numpy as np
import cv2

low_blue, low_green, low_red, upper_blue, upper_green, upper_red = (115, 0, 0, 255, 178, 255)

# Get picture
path = "C:\\Users\\asd\\asd\\P1.png"
frame = cv2.imread(path)

while 1:

    lower_color = np.array((low_blue, low_green, low_red))
    upper_color = np.array((upper_blue, upper_green, upper_red))

    # extract binary image with active blue regions
    binary_image = cv2.inRange(frame, lower_color, upper_color)

    cv2.imshow('Original image', binary_image)

    #erode for the little white contour to dissapear
    binary_image = cv2.erode(binary_image, cv2.getStructuringElement(cv2.MORPH_RECT,(3,3)))
    binary_image = cv2.dilate(binary_image, cv2.getStructuringElement(cv2.MORPH_RECT,(3,3)))

    cv2.imshow('Binary image  ', binary_image)

    k = cv2.waitKey(5) & 0xFF
    if k == 27:
        break
    if k == ord('q'):
        low_blue += 1
    if k == ord('w'):
        low_blue -= 1
    if k == ord('a'):
        low_green += 1
    if k == ord('s'):
        low_green -= 1
    if k == ord('z'):
        low_red += 1
    if k == ord('x'):
        low_red -= 1
    if k == ord('e'):
        upper_blue += 1
    if k == ord('r'):
        upper_blue -= 1
    if k == ord('d'):
        upper_green += 1
    if k == ord('f'):
        upper_green -= 1
    if k == ord('c'):
        upper_red += 1
    if k == ord('v'):
        upper_red -= 1

    print("low_blue=", low_blue, "low_green=", low_green, "low_red=",low_red, "upper_blue", upper_blue, "upper_green=",
          upper_green, "upper_red=",upper_red)


cv2.destroyAllWindows()

The results

From:

enter image description here

To:

enter image description here

Cătălina Sîrbu
  • 1,253
  • 9
  • 30