2016-06-21 37 views
2

Ich benutze Python 2.7 und OpenCV 3.0. Ich mache ein Projekt zu Erkennung des Kfz-Kennzeichen.Opencv erkennen Viereck in Python

Ich überprüfe jetzt die Anzahl der Scheitelpunkte der Konturen. Wenn es 4 Ecken gibt (Anzahl der Elemente in etwa), dann ist es wahrscheinlicher, ein Rechteck/Parallelogramm/Viereck zu sein.

(cnts, _) = cv2.findContours(edged.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE) 
cnts=sorted(cnts, key = cv2.contourArea, reverse = True)[:10] 

# loop over our contours 
for c in cnts: 
    peri = cv2.arcLength(c, True) 
    approx = cv2.approxPolyDP(c, 0.02 * peri, True) 
    if len(approx) == 4 and ratio(approx): 
     cv2.drawContours(image, [approx], -1, (0,255,0), 3) 

Und ich habe zwei Vierecke mit Array.

enter image description here

Allerdings können Sie sehen, gibt es eine unregelmäßiges Vieleck. Dies ist das Array:

[[[209 198]] 

[[466 94]] 

[[259 153]] 

[[247 1]]] 

Wen ich frage, wie kann ich das unregelmäßige Viereck weggelassen. Danke

+0

Von ganz oben: Berechnen Sie die [Convex hull] (http://docs.opencv.org/3.1.0/d3/dc0/group__imgproc__shape.html#ga014b28e56cb8854c0de4a211cb2be656&gsctab=0) und vergleichen Sie das ursprüngliche Polygon zu seiner konvexen Hülle. Wenn sie nicht ähnlich sind, ist es wahrscheinlich kein Nummernschild. – user1337

Antwort

1

Wie https://stackoverflow.com/users/4606294/user89161 in seinem Kommentar vorgeschlagen Opencv detect quadrilateral in Python vielleicht können Sie einen Test auf Ihrem approx, so etwas wie hinzufügen:

hull = cv2.convexHull(approx,returnPoints = False) 
defects = cv2.convexityDefects(approx,hull) 

sum_of_defects=0 
for i in range(defects.shape[0]): 
    s,e,f,d = defects[i,0] 
    sum_of_defects=sum_of_defects+d 

if sum_of_defects <= threshold: 
    print "approx is convex" 
else: 
    print "approx is not convex" 

und Sie haben richtig threshold wählen, ich mit threshold=3 starten oder so ähnlich. Theoretisch sollte threshold Null sein.

+0

Danke für Ihre Antwort. Ich habe ein Problem, dass manchmal die 'Defects' NULL zurückgeben – VICTOR

+0

' Defects = cv2.convexityDefects (ca. Rumpf) cv2.error: .. \ .. \ .. \ .. \ opencv \ modules \ imgproc \ src \ contours.cpp: 1969: error: (-215) ptnum> 3 in der Funktion cv :: convexityDefects' – VICTOR

+0

@CLWONG über den Fehler 'ptnum> 3': Es sollte nicht passieren, da du deinen Test ausführst' len (approx) == 4, oder nein? –