3

Je travaille sur un problème de reconnaissance de marque optique. J'ai trouvé Région d'intérêt (ROI) où le numéro de rôle de l'étudiant à remplir. Quelle approche peut m'aider à décoder la valeur du cercle rempli? J'ai essayé de coder mais ça ne fonctionne pas correctement.Détecter le marqueur OCR

Images

Dans cette image initiale ROI est given.After que j'ai appliqué l'image segmentation.Third est remplie par des étudiants qui indiquent le numéro de rôle de l'étudiant.

cette image détecter 381 cercle, mais cercle réel sont 100

Input: Filled circle image 
Output: roll number : 4216789503 

image = cv2.imread("rotatedb/ROI_omr.png") 
hsvimg = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) 
lower_blue = np.array([0,70,0]) 
upper_blue = np.array([255,255,255]) 
mask = cv2.inRange(hsvimg, lower_blue, upper_blue) 
contours, hierarchy = cv2.findContours(mask.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE) 
print "No. of circles",len(contours) 

i=0 
for contour in contours: 
    (x,y),radius = cv2.minEnclosingCircle(contour) 
    center = (int(x),int(y)) 
    radius = int(radius) 
    cv2.circle(image,center,radius,(0,255,0),2) 
    position = (center[0] - 10, center[1] + 10) 
    text_color = (0, 0, 255) 
    cv2.putText(image, str(i + 1), position, cv2.FONT_HERSHEY_SIMPLEX, 0.5, text_color, 2) 
    i=i+1 

cv2.imshow("thresold",image) 
cv2.waitKey(0) 
cv2.destroyAllWindows() 
+1

dans findContours utiliser le drapeau "externe" au lieu de 'cv2.RETR_TREE'. – Micka

Répondre

1

Comme les marqueurs sont de couleur noire, vous devriez donc essayer de segmenter les segments de couleur noire dans l'image d'entrée, et à partir de ce masque binaire vous peut trouver les contours et filtrer les contours de forme circulaire (vous pouvez également filtrer les contours de la zone si vous le souhaitez).

Après avoir trouvé tous les contours, trier les contours selon leur x coordonnée bondissant rect, qui rapporterait l'ordre des contours que nous les parcourons dans le sens horizontal (cv2.findContours() renvoie les contours dans un ordre aléatoire, il est donc toujours une bonne idée pour les trier selon vos besoins.)

Enfin, vous calculez le point médian de chaque contour et estimez le cercle sur lequel ils se trouvent.

code:

import cv2 

img = cv2.imread('/Users/anmoluppal/Downloads/QYtuv.png') 
MARKER_LOWER_BOUND = (0, 0, 0) 
MARKER_UPPER_BOUND = (20, 20, 20) 

img = cv2.blur(img, (7, 7)) 
marker_seg_mask = cv2.inRange(img, MARKER_LOWER_BOUND, MARKER_UPPER_BOUND) 

# Number of rows and columns of number matrix 
n_rows, n_cols = 10, 10 
single_element_height, single_element_width = marker_seg_mask.shape[0]/10, marker_seg_mask.shape[1]/10 

# Now find the contours in the segmented mask 
img, contours, hierarchy = cv2.findContours(marker_seg_mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) 

# Sorting the contours w.r.t contour rect X 
contours.sort(key = lambda x:cv2.boundingRect(x)[0]) 

# Now iterate over each contour and see if it is in circular shape 
roll_number = "" 
for contour in contours: 
    approx = cv2.approxPolyDP(contour, 0.01*cv2.arcLength(contour,True), True) 
    if len(approx) > 8: 
     # Find the bounding rect of contour. 
     contour_bounding_rect = cv2.boundingRect(contour) 
     mid_point = contour_bounding_rect[0] + contour_bounding_rect[2]/2, contour_bounding_rect[1] + contour_bounding_rect[3]/2 
     roll_num_digit = mid_point[1]/single_element_height 

     # Since your numbering format is from 1, 2, 3, ... 0, So to parse the roll number correctly we need additional operation 
     roll_num_digit = (roll_num_digit + 1) % 10 
     roll_number += str(roll_num_digit) 
print "Roll Number: ", roll_number 

Sortie:

Roll Number: 4216789503 
+1

Peut-être que vous utilisez OpenCV2.x API et j'ai écrit du code dans OpenCV 3.1.0, il pourrait y avoir des différences mineures comme dans OpenCV2.x, 'cv2.findContours()' retourné 2 objets comme 'contours, hierarchy', donc vous devez remplacer la ligne par 'contours, hierarchy = cv2.findContours (marker_seg_mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) ' – ZdaR

+0

Alors quel est le problème? Pouvez-vous également télécharger la nouvelle image avec des bulles remplies '4216789503'? – ZdaR

+0

Quelle est la sortie actuelle de cet extrait? Et quelle est votre sortie attendue? – ZdaR