[OpenCV] Einfache Objekte erkennen?
-
Hallo Leute,
folgendes Problem, bei dem ich Hilfe gebrauchen könnte (und dafür unermesslich dankbar wäre):
Mithilfe eines Kinect sollen Objekte auf einem Gebiet definierter Größe erkannt werden. Dabei handelt es sich weitestgehend um kreisrunde Scheiben ebenfalls festgelegter Größe und Farbe. Einige davon sind einfach nur flach, andere können einen Aufbau beliebiger Form haben, der den Rand der Scheibe nicht überschreitet und eine maximale Höhe aufweist. Der Hintergrund hat ebenfalls fest definierte Farben; derer allerdings mehrere, die sich jedoch von der Farbe der Scheiben stark abheben.
Die Kinect Kamera ist in einer festen Höhe angebracht, ist allerdings in der Ebene über dem Scangebiet verfahrbar. Es geht nun darum, aus der bekannten Position der Kinect Kamera die genauen Koordinaten x und y aller Scheibenobjekte von einer festzulegenden Ecke des Scangebiets als Ursprungspunkt zu ermitteln.
Die Position der Scheibenobjekte auf dem Kamerabild habe ich bereits ermittelt, indem ich das Bild erst in den HSV Bereich überführt habe, dann einen Threshold-Filter darüber habe laufen lassen, der mir genau den notwendigen Farbwinkel der Scheiben als weiß zurückgibt (den Rest schwarz). Leider kommt da auch noch etwas Hintergrundrauschen mit rein, von Objekten ähnlicher Farbe außerhalb des Scangebiets.
Der Algorithmus für das Finden der Objekte läuft im Grunde so ab:
Das Bild wird Pixel für Pixel durchlaufen. Wird ein Pixel gefunden, das ungleich schwarz (0) ist, wird an der Stelle ein rekursiver FloodFill durchgeführt. Die minimalen und maximalen x- und y-Koordinaten des FloodFill Algorithmus ergeben dann die Boundary des gefundenen Objektes. Eine einfache Plausibilitätsprüfung (minimale und maximale Höhe/Breite des ermittelten Rechtecks) filtert dann noch eindeutig zu kleine und zu große Objekte heraus. Der Rest ist hauptsächlich die gewünschte Scheibe.Lange Rede, kurzer Sinn: den beschriebenen Algorithmus würde ich gerne optimieren. Da gibt es sicher schnellere Wege, weiße Objekte bestimmter Form (elliptisch, da kreisrunde Scheibe aus spitzem Winkel von der Seite gefilmt) aber unbekannter Größe in einem sonst schwarzen Bild zu finden, oder?
Zur Info: wir nutzen Ubuntu, OpenCV und Freenect.
Ich wäre für jeden Tipp äußerst dankbar.
Viele Grüße,
Hendrik
-
Was du suchst ist der mcluster8 Algorithmus.
//edit seh gerade, dass meine Implementation nur so heißt, die gibts aber so im Netz. Das Ding ist aber ziemlich schnell.
-
Hmm, okay. Gibt es dafür auch einen offiziellen Bezeichner?
-
Keine Ahnung. Der Algorithmus wurde uns damals als Eigenentwicklung unseres Instituts verkauft. Er ist schnell(in der Tat gibt es einige echtzeitfähige Produktivsysteme die den einsetzen) und maximal hässlich zu lesen. Das war alles was wir damals wissen mussten ;).
//Edit hab den internal report dazu gefunden:
ftp://ftp.neuroinformatik.ruhr-uni-bochum.de/pub/manuscripts/IRINI//irini95-02/irini95-02.ps.gz
-
Huh, okay, klingt kompliziert. Aber ich werd's mir mal in Verbindung mit unserem Problem anschauen. Wir haben nämlich noch das Problem, dass zu große "Objekte" (also auch Bereiche, die den gleichen Farbraum wie die zu erkennenden Objekte abdecken; Holzbretter zum Beispiel) zu einem Stackoverflow führen, weil der Floodfill Algorithmus zu tief in die Rekursion hinabsteigt. Das kommt allerdings selten vor.
Bei dem von dir genannten Algorithmus gibt es keine Rekursion, wenn ich das richtig gesehen habe, oder?
Danke dir schonmal!
// edit 27.04. - 18:38
Kann es sein, dass CvBlob diesen Algorithmus implementiert? Ich hab's installiert, aber noch nicht testen können, da die Zeit nicht mehr reichte. Morgen kann ich da mehr zu sagen.