Ich versuche, ein Zeichenerkennungsprogramm mit Python zu erstellen. Ich bin dabei, die Konturen zu sortieren. Ich verwende this page als Referenz.Wie kann ich Konturen von links nach rechts und von oben nach unten sortieren?
ich es geschafft, die Konturen mit dem folgenden Stück Code zu finden:
mo_image = di_image.copy()
contour0 = cv2.findContours(mo_image.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
contours = [cv2.approxPolyDP(cnt,3,True) for cnt in contour0[0]]
Und die Hüllrechtecke hinzugefügt und segmentiert das Bild in diesem Teil des Code verwendet:
maxArea = 0
rect=[]
for ctr in contours:
maxArea = max(maxArea,cv2.contourArea(ctr))
if img == "Food.jpg":
areaRatio = 0.05
elif img == "Plate.jpg":
areaRatio = 0.5
for ctr in contours:
if cv2.contourArea(ctr) > maxArea * areaRatio:
rect.append(cv2.boundingRect(cv2.approxPolyDP(ctr,1,True)))
symbols=[]
for i in rect:
x = i[0]
y = i[1]
w = i[2]
h = i[3]
p1 = (x,y)
p2 = (x+w,y+h)
cv2.rectangle(mo_image,p1,p2,255,2)
image = cv2.resize(mo_image[y:y+h,x:x+w],(32,32))
symbols.append(image.reshape(1024,).astype("uint8"))
testset_data = np.array(symbols)
cv2.imshow("segmented",mo_image)
plt.subplot(2,3,6)
plt.title("Segmented")
plt.imshow(mo_image,'gray')
plt.xticks([]),plt.yticks([]);
jedoch die resultierende Segmente erscheinen in zufälliger Reihenfolge. Hier ist das Originalbild gefolgt von dem verarbeiteten Bild mit erkannten Segmenten.
Das Programm schreitet dann jedes Segment separat ausgibt, jedoch ist es in der Reihenfolge: 4 1 9 8 7 5 3 2 0 6
und nicht 0 1 2 3 4 5 6 7 8 9
. Das einfache Hinzufügen einer Sortieroperation in "rect" behebt dies, aber die gleiche Lösung funktioniert nicht für ein Dokument mit mehreren Zeilen.
Also meine Frage ist: Wie sortiere ich die Konturen von links nach rechts und von oben nach unten?
Könnten Sie ein Beispiel für den Inhalt von 'rect' hinzufügen? –
rect enthält (x, y, w, h) für jede erkannte Kontur [(287, 117, 13, 46), (102, 117, 34, 47), (513, 116, 36, 49), (454 , 116, 32, 49), (395, 116, 28, 48), (334, 116, 31, 49), (168, 116, 26, 49), (43, 116, 30, 48), (224, 115, 33, 50), (211, 33, 34, 47), ( 45, 33, 13, 46), (514, 32, 32, 49), (455, 32, 31, 49), (396, 32, 29, 48), (275, 32, 28, 48), (156, 3 2, 26, 49), (91, 32, 30, 48), (333, 31, 33, 50)] Dies ist für das obige Beispiel. (0-9) – Nissan