Dans le centre commercial du quartier, de nombreuses plantes sont plantées dans le passage extérieur, et il y a une plaque avec une description des plantes ensemble. Je me demandais quel genre de plante il y avait (il semble qu'il y en ait plus de 100 sortes), alors j'ai décidé d'agréger les informations sur l'assiette. ――Cependant, il est difficile de saisir les informations de la plaque dans le smartphone et de collecter les informations. .. .. J'ai décidé de prendre une photo, de la corriger, puis d'effectuer l'OCR par souci de simplicité.
Convertissez l'image au format HSV, émettez du blanc si la teinte (teinte) est incluse dans la plage qui serait une plaque, et émettez du noir pour les autres, et effectuez un masquage et une binarisation.
preprocess.py
cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
Le masque a l'air bien.
HSV est une méthode d'expression de la couleur avec trois éléments
--Teinte
Après fermeture, ouverture Fermer d'abord car les pixels de la plaque peuvent manquer
--Dilatation
Détecte et dessine les contours des objets contenus dans l'image sans bruit.
preprocess.py
img, contours, hierarchy = cv2.findContours(img, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPL)
img = cv2.drawContours(img, contour, -1, (0, 0, 255), 30)
cv2.imwrite(output_path, img)
Le contour a été dessiné pour cela.
Dans cette image, il n'y a pas d'autre contour que la plaque, Obtenez le contour (plaque) avec la plus grande surface au cas où il y aurait un contour autre que la plaque.
preprocess.py
contour_areas = {}
for i, contour in enumerate(contours):
area = cv2.contourArea(contour)
contour_areas[i] = area
max_area = max(contour_areas.values())
max_area_idx = [i for i, v in contour_areas.items() if v == max_area][0]
max_contour = contours[max_area_idx]
Approcher la forme de la zone avec un petit nombre de points et obtenir les coordonnées des quatre coins de la plaque.
preprocess.py
arc_len = cv2.arcLength(max_contour, True)
approx_contour = cv2.approxPolyDP(max_contour, epsilon=0.1 * arc_len, closed=True)
img = cv2.drawContours(img, approx_contour, -1, (0, 0, 255), 30)
cv2.imwrite(output_path, img)
J'ai pu obtenir les coordonnées des quatre coins avec un bon feeling.
Les coordonnées des quatre coins sont divisées en haut à gauche, en bas à gauche, en haut à droite et en bas à droite, et l'image est dessinée avec une correction trapézoïdale.
preprocess.py
approx = approx_contour.tolist()
left = sorted(approx, key=lambda x: x[0])[:2]
right = sorted(approx, key=lambda x: x[0])[2:]
left_down = sorted(left, key=lambda x: x[0][1])[0]
left_up = sorted(left, key=lambda x: x[0][1])[1]
right_down = sorted(right, key=lambda x: x[0][1])[0]
right_up = sorted(right, key=lambda x: x[0][1])[1]
perspective_base = np.float32([left_down, right_down, right_up, left_up])
perspective = np.float32([[0, 0], [700, 0], [700, 500], [0, 500]])
psp_matrix = cv2.getPerspectiveTransform(perspective_base, perspective)
plate_img = cv2.warpPerspective(org_img, psp_matrix, (700, 500))
cv2.imwrite(output_path, img)
――Au début, une détection de ligne droite était effectuée sur l'image avant correction, mais même si la ligne de la plante était obtenue ou la ligne droite de la plaque était obtenue, elle était coupée, ce qui n'était pas le résultat escompté. Après cela, j'ai essayé de masquer en fonction de la valeur RVB, mais je ne pouvais pas bien détecter le contour de la plaque car la majeure partie de la plaque était ébréchée ou la partie sans rapport avec la plaque ne pouvait pas être masquée.
«Depuis que j'ai commencé par tâtonner complètement, je ne savais pas quelle méthode utiliser, et j'ai pu en conséquence essayer différentes méthodes de traitement d'image. (Bien que la théorie n'ait pas rattrapé son retard.) --Vinarisation (valeur fixe, Otsu, traitement de seuil adaptatif) --Détection linéaire (conversion Huff, conversion Huff probabiliste)
Si la plante chevauche la plaque et que la zone de la plaque est divisée comme indiqué dans l'image ci-dessous, la correction trapézoïdale ne fonctionnera pas. (Je me demande si les plantes ne couvriront pas l'assiette lors de la prise de photos ...)
À propos, dans Google Cloud Vision, le résultat de l'OCR est presque le même avant et après la correction, et l'OCR est presque parfait même avant la correction. Le style de Google! !! !!
Cliquez ici pour le code source https://github.com/ChihiroHozono/Plate-Text-Detector
Recommended Posts