J'essaye de construire un système de reconnaissance d'écriture manuscrite en utilisant python et opencv. La reconnaissance des caractères n'est pas le problème mais la segmentation. J'ai avec succès:opencv - rogner des lignes manuscrites (segmentation de ligne)
- segmentée un mot en caractères simples
- segmentée une seule phrase en mots dans l'ordre requis.
Mais je ne pouvais pas segmenter des lignes différentes dans le document. J'ai essayé de trier les contours (pour éviter la segmentation des lignes et n'utiliser que la segmentation des mots) mais cela n'a pas fonctionné. Je l'ai utilisé le code suivant pour segmenter les mots contenus dans un document écrit à la main, mais il renvoie les mots hors de l'ordre (il retourne mots manière triée gauche à droite):
import cv2
import numpy as np
#import image
image = cv2.imread('input.jpg')
#cv2.imshow('orig',image)
#cv2.waitKey(0)
#grayscale
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
cv2.imshow('gray',gray)
cv2.waitKey(0)
#binary
ret,thresh = cv2.threshold(gray,127,255,cv2.THRESH_BINARY_INV)
cv2.imshow('second',thresh)
cv2.waitKey(0)
#dilation
kernel = np.ones((5,5), np.uint8)
img_dilation = cv2.dilate(thresh, kernel, iterations=1)
cv2.imshow('dilated',img_dilation)
cv2.waitKey(0)
#find contours
im2,ctrs, hier = cv2.findContours(img_dilation.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
#sort contours
sorted_ctrs = sorted(ctrs, key=lambda ctr: cv2.boundingRect(ctr)[0])
for i, ctr in enumerate(sorted_ctrs):
# Get bounding box
x, y, w, h = cv2.boundingRect(ctr)
# Getting ROI
roi = image[y:y+h, x:x+w]
# show ROI
cv2.imshow('segment no:'+str(i),roi)
cv2.rectangle(image,(x,y),(x + w, y + h),(90,0,255),2)
cv2.waitKey(0)
cv2.imshow('marked areas',image)
cv2.waitKey(0)
S'il vous plaît noter que je suis en mesure de segmenter tous les mots ici mais ils apparaissent sur order.Is il possible de trier ces contours en ordre de haut en bas
OU
segmenter l'image en l séparée ines de sorte que chaque ligne peut être segmentée en mots en utilisant le code ci-dessus?
pourquoi ne pas le trier par x et y alors? – Tom
En fait, j'ai essayé cela, mais il en résulte juste une réorganisation complète des contours à nouveau. il ne retourne pas les contours dans le bon ordre. J'ai effectué un tri de gauche à droite suivi d'un tri descendant, mais les contours sont hors service. Donc je pense que chaque ligne devrait être séparée. –
Faire une liste en triant les contours basés sur x, y est le plus simple que je dirais. Ajouter une image est que vous pouvez. –