Группировать контуры с одинаковым значением y - PullRequest
0 голосов
/ 14 апреля 2020

Я следовал руководству по компьютерному зрению и выполнял небольшой проект, чтобы прочитать время из игры Время игры отформатировано ч: м. До сих пор я вычислил h и m с помощью findContours, но у меня возникли проблемы с выделением двоеточия, поскольку форма символа не является непрерывной. Из-за этого, когда я пытаюсь сопоставить шаблон, код выходит из строя и начинает использовать точку для сопоставления со всеми остальными цифрами.

Есть ли способы сгруппировать контуры по X?

Вот упрощенный код для получения контрольных цифр, код для получения цифр с экрана в основном такой же.

    refCnts = cv2.findContours(ref.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    refCnts = imutils.grab_contours(refCnts)
    refCnts = contours.sort_contours(refCnts, method="left-to-right")[0]

    digits = {}

    # loop over the OCR-A reference contours
    for (i, c) in enumerate(refCnts):
        # compute the bounding box for the digit, extract it, and resize
        # it to a fixed size
        (x, y, w, h) = cv2.boundingRect(c)

        roi = ref[y:y + h, x:x + w]
        roi = cv2.resize(roi, (10, 13))
        digits[i] = roi

Я новичок в python и opencv. Заранее извиняюсь, если это тупой вопрос.

Вот эталонное изображение, которое я использую:

enter image description here

Вот входное изображение, которое я пытаюсь прочитать:

enter image description here

1 Ответ

0 голосов
/ 22 апреля 2020

У вас есть для использования findCountours? Потому что есть подходящие методы для таких проблем. Например, вы можете использовать шаблон соответствия , как показано ниже:

Это input, template (вырезано из вашего эталонного изображения) и output изображения:

input.png

template.png

output.png

import cv2 
import numpy as np 

# Read the input image & convert to grayscale
input_rgb = cv2.imread('input.png')
input_gray = cv2.cvtColor(input_rgb, cv2.COLOR_BGR2GRAY) 

# Read the template (Using 0 to read image in grayscale mode)
template = cv2.imread('template.png', 0) 

# Perform template matching - more on this here: https://docs.opencv.org/4.0.1/df/dfb/group__imgproc__object.html#ga3a7850640f1fe1f58fe91a2d7583695d
res = cv2.matchTemplate(input_gray,template,cv2.TM_CCOEFF_NORMED) 

# Store the coordinates of matched area 
# found the threshold value of .56 using trial & error using the input image - might be different in your game
lc = np.where( res >= 0.56)  

# Draw a rectangle around the matched region
# I used the width and height of the template image but in practice you need to use a better method to accomplish this
w, h = template.shape[::-1] 
for pt in zip(*lc[::-1]): 
    cv2.rectangle(input_rgb, pt, (pt[0] + w, pt[1] + h), (0,255,255), 1)

# display output
cv2.imshow('Detected',input_rgb) 
# cv2.imwrite('output.png', input_rgb)
# cv2.waitKey(0)
# cv2.destroyAllWindows()

Вы также можете посмотреть на обнаружение и распознавание текста с помощью openCV.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...