Я бразильский студент и в 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()