――In dem Einkaufszentrum in der Nachbarschaft werden viele Pflanzen in den äußeren Durchgang gepflanzt, und es gibt einen Teller mit einer Beschreibung der Pflanzen zusammen. Ich habe mich gefragt, welche Art von Pflanzen es gibt (es scheint, dass es mehr als 100 Arten gibt), also habe ich beschlossen, die Informationen auf dem Teller zusammenzufassen. ―― Es ist jedoch schwierig, die Informationen auf der Platte in das Smartphone einzugeben und zu sammeln. .. .. Der Einfachheit halber habe ich beschlossen, ein Bild aufzunehmen, es zu korrigieren und dann eine OCR durchzuführen.
Das Bild wird in das HSV-Format konvertiert, und das Bild, dessen Farbton (Farbton) im Bereich der Platte enthalten ist, wird als Weiß ausgegeben, und die anderen werden als Schwarz ausgegeben, und Maskierung und Binarisierung werden durchgeführt.
preprocess.py
cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
Die Maske sieht gut aus.
HSV ist eine Methode, um Farbe mit drei Elementen auszudrücken
--Farbton
Nach dem Schließen öffnen Schließen Sie zuerst, da möglicherweise die Pixel der Platte fehlen
--Erweiterung
Erkennt und zeichnet die Konturen von Objekten, die im rauschfreien Bild enthalten sind.
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)
Der Umriss wurde dafür gezeichnet.
In diesem Bild gibt es keinen anderen Umriss als die Platte. Erhalten Sie die Kontur (Platte) mit der größten Fläche, falls es eine andere Kontur als die Platte gibt.
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]
Nähern Sie die Form des Bereichs mit einer kleinen Anzahl von Punkten und ermitteln Sie die Koordinaten der vier Ecken der Platte.
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)
Mit einem guten Gefühl konnte ich die Koordinaten der vier Ecken ermitteln.
Die Koordinaten der vier Ecken werden in oben links, unten links, oben rechts und unten rechts unterteilt, und das Bild wird mit Trapezkorrektur gezeichnet.
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)
―― Zuerst wurde das Bild vor der Korrektur geradlinig erkannt, aber selbst wenn die Linie der Pflanze oder die gerade Linie der Platte erhalten wurde, wurde sie abgeschnitten, was nicht das beabsichtigte Ergebnis war. ―― Danach habe ich versucht, basierend auf dem RGB-Wert zu maskieren, aber ich konnte den Umriss der Platte nicht gut erkennen, da der größte Teil der Platte abgebrochen war oder der Teil, der nicht mit der Platte zusammenhängt, nicht maskiert werden konnte.
――Da ich anfing, vollständig zu tappen, wusste ich nicht, welche Methode ich verwenden sollte, und als Ergebnis konnte ich verschiedene Bildverarbeitungsmethoden ausprobieren. (Obwohl die Theorie nicht aufgeholt hat.) --Vinarisierung (Festwert, Otsu, adaptive Schwellenwertverarbeitung)
Wenn Pflanzen die Platte überlappen und der Bereich der Platte wie in der Abbildung unten gezeigt geteilt wird, funktioniert die Trapezkorrektur nicht. (Ich frage mich, ob die Pflanzen beim Fotografieren den Teller nicht bedecken ...)
Übrigens ist in Google Cloud Vision das OCR-Ergebnis vor und nach der Korrektur nahezu gleich, und die OCR ist auch vor der Korrektur nahezu perfekt. Googles Stil! !! !!
Klicken Sie hier für den Quellcode https://github.com/ChihiroHozono/Plate-Text-Detector
Recommended Posts