5

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?

+0

pourquoi ne pas le trier par x et y alors? – Tom

+0

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. –

+0

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. –

Répondre

5

I GOT la segmentation nécessaire en faisant une modification du code ci-dessus sur la ligne:

kernel = np.ones((5,5), np.uint8) 

je l'ai changé:

kernel = np.ones((5,100), np.uint8) 

Maintenant je les sorties comme suit segmented lines of input text Cela fonctionne également avec les images de texte manuscrites avec des lignes qui ne sont pas parfaitement horizontales: