Получить номер спортивного игрока - PullRequest
0 голосов
/ 12 октября 2019

У меня много фотографий с высоким разрешением. Я собираюсь получить номер марафонца с фото. примеры изображений: https://drive.google.com/open?id=1rfOnnKDUmbR3A8xAhpwHdykhNFfMR1QG

Чтобы решить эту проблему, я собирался сделать следующие шаги:

  1. Обнаружить человека на изображении
  2. Обнаружить область номера вплощадь человека
  3. Получить номер с помощью tesseract или tenorflow-ocr

Я успешно обнаружил человека с помощью yolo3. Но по моему изображению было очень трудно получить числовую область, используя findContours. Количество точек не 4. Поэтому я отфильтровал прямоугольники по площади и получил несколько прямоугольников. Я не уверен, что это правильный метод. Но я столкнулся с проблемой в следующем шаге. Я пытался получить номер из этих областей, но он не мог получить правильные номера. Я пытался выполнить предварительную обработку, но результат не был улучшен.

        imgOriginalScene = cv2.bilateralFilter(imgOriginalScene, 11, 17, 17)
        cv2.imshow("Bilateral", imgOriginalScene)

        kernel = np.ones((1,1),np.uint8)
        imgOriginalScene = cv2.erode(imgOriginalScene,kernel,iterations = 2)
        cv2.imshow("Erode", imgOriginalScene)

        kernel = np.ones((2,2),np.uint8)
        imgOriginalScene = cv2.dilate(imgOriginalScene,kernel,iterations = 2)
        cv2.imshow("Dilate", imgOriginalScene)

        imgOriginalScene = cv2.Canny(imgOriginalScene, 30, 200)
        cv2.imshow("Canny", imgOriginalScene)

        imgCanny = imgOriginalScene

        contours = cv2.findContours(imgOriginalScene.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
        contours = imutils.grab_contours(contours)

        imgContours = np.zeros((height, width, 3), np.uint8)

        rects = [cv2.boundingRect(cnt) for cnt in contours]
        rects = sorted(rects,key=lambda  x:x[1],reverse=True)

        imgRect = imgCrop
        imgRectDisp = imgCrop

        imgRect = cv2.cvtColor(imgRect, cv2.COLOR_BGR2GRAY)
        ret_thresh, thresh = cv2.threshold(imgRect, kmeans(input_img=imgRect, k=8, i_val=5)[0], 255, cv2.THRESH_BINARY)
        cv2.imshow("or", thresh)

        i = -1
        j = 1
        y_old = 5000
        x_old = 5000
        for rect in rects:
            x,y,w,h = rect
            area = w * h

            if w > h and w < h * 4 :
                i += 1
                y_old = y

                x,y,w,h = rect

                cv2.rectangle(imgContours, (x , y ), (x + w , y + h ), color, 1)
                cv2.rectangle(imgRectDisp, (x , y ), (x + w , y + h ), color, 3)

                bbcrop = thresh[y : y + h, x : x + w]
                config = ('-l eng --oem 1 --psm 3')
                text = pytesseract.image_to_string(bbcrop, config=config)
                print("OCR " + text)

                j += 1

        cv2.imshow("contours", imgContours)
        cv2.imshow("rectangle", imgRectDisp)

В моем коде tesseract не смог определить число. Интересно, если моя предварительная обработка не подходит.

Также я хочу знать, как повысить точность тессеракта. Должен ли я обучить собственную модель для OCR? Может ли кто-нибудь помочь мне? Спасибо!

...