Как определить несколько строк и слов, используя opencv в python? - PullRequest
1 голос
/ 17 октября 2019

Я бразильский студент и в pt-stackoverflow ничего не нашел по этому поводу. Я новичок в python и opencv, о котором мне трудно учиться.
Я пытаюсь создать программу на OCR на python, которая может идентифицировать несколько строк и слов с помощью видео с веб-камеры.

IСначала я пытаюсь использовать статические изображения для тестирования, и я уже пробовал использовать этот код в учебных руководствах opencv, например, но вернуть только 1 строку или покрыть слова

# single line
    if lines is not None:
        for rho, theta in lines[0]:
            a = np.cos(theta)
            b = np.sin(theta)
            x0 = a * rho
            y0 = b * rho
            x1 = int(x0 + 800 * (-b))
            y1 = int(y0 + 800 * (a))
            x2 = int(x0 - 800 * (-b))
            y2 = int(y0 - 800 * (a))
            cv2.line(cap, (x1, y1), (x2, y2), (0, 0, 255), 2)
        cv2.imshow("windowName", cap)

# -
# demark text with multiple lines
# -

if True:  # HoughLinesP
        lines = cv.HoughLinesP(dst, 1, math.pi/180.0, 40, np.array([]), 30, 10)
        a, b, c = lines.shape
        for i in range(a):
            cv.line(cdst, (lines[i][0][0], lines[i][0][1]), (lines[i][0][2], lines[i][0][3]), (0, 0, 255), 3, cv.LINE_AA)

    else:  # HoughLines
        lines = cv.HoughLines(dst, 1, math.pi/180.0, 50, np.array([]), 0, 0)
        if lines is not None:
            a, b, c = lines.shape
            for i in range(a):
                rho = lines[i][0][0]
                theta = lines[i][0][1]
                a = math.cos(theta)
                b = math.sin(theta)
                x0, y0 = a*rho, b*rho
                pt1 = (int(x0+1000*(-b)), int(y0+1000*(a)))
                pt2 = (int(x0-1000*(-b)), int(y0-1000*(a)))
                cv.line(cdst, pt1, pt2, (0, 0, 255), 3, cv.LINE_AA)

    cv.imshow("detected lines", cdst)

В первой части кода ябудет помечена только одна строка, а во второй части будет несколько строк, но они перед словами.

! [1]: https://i.imgur.com/lZ3oAtx.png «одна строка»! [2]:https://i.imgur.com/5N0SHQI.png «несколько строк» ​​

Я хотел бы, чтобы несколько строк и режим распознавали слова в строке, как показано на следующем рисунке.

! [3]: https://i.imgur.com/ecmYGN6.png «несколько строк»! [4]: ​​https://i.imgur.com/2GxlGox.png «моя цель»

Извините за большой текст, но мне здесь некому помочь, мне два годашаги, чтобы сдаться.

Дополнительная информация: код контуров

sorted_ctrs = sorted(ctrs, key=lambda ctr: cv2.boundingRect(ctr)[0])

for i, ctr in enumerate(sorted_ctrs):
    x, y, w, h = cv2.boundingRect(ctr)
    roi = image[y:y + h, x:x + w]
    cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)

    if w > 15 and h > 15:
        im = Image.fromarray(roi)
        text = pytesseract.image_to_string(im)
        print text
        voiceEngine.say(text)
        voiceEngine.runAndWait()
...