У меня много фотографий с высоким разрешением. Я собираюсь получить номер марафонца с фото. примеры изображений: https://drive.google.com/open?id=1rfOnnKDUmbR3A8xAhpwHdykhNFfMR1QG
Чтобы решить эту проблему, я собирался сделать следующие шаги:
- Обнаружить человека на изображении
- Обнаружить область номера вплощадь человека
- Получить номер с помощью 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? Может ли кто-нибудь помочь мне? Спасибо!