2013-04-16 11 views
5

Ich verwende OpenCV, um Ellipsen in einem Binärbild zu erkennen, wie unten gezeigt. Im Bild sind acht Ellipsen zu erkennen. Ich kann findContours verwenden, um viele Konturen einschließlich der acht Ellipsen zu erhalten. Das Problem ist: Wie kann ich beurteilen und welche ist Ellipse, die man nicht ist? Wie entfernen Sie alle anderen falschen Erkennungen?Wie entfernen Sie falsche Erkennungen?

enter image description here enter image description here

+1

Wenn Sie Kreise haben, können Sie das Achsenverhältnis und die Größe der Achsen überprüfen und Rauschen ausfiltern. – mrgloom

+1

vielleicht ähnlich zu: http://stackoverflow.com/questions/12977300/how-to-check-if-a-contour-is-an-ellipse/12978905#12978905 –

Antwort

6

Eine Option ist ein bisschen hacky: Oben findContours verwenden minEnclosingCircle und Filter Konturen von min. Einschließen von Radius basierend auf einem Schwellenwert (Entfernen kleiner als Radius A (entfernen Sie kleine Blobs) und größer als Radius B (entfernen Sie große Blobs)). Sie können auch minAreaRect ausprobieren und das Breiten-/Höhenverhältnis überprüfen, um nach einheitlichen Blobs statt nach hohen/breiten zu suchen.

Die weniger hacky Lösung ist, Hough-Transformationen zu verwenden. Werfen Sie einen Blick auf die hough circle und das Tutorial

+0

Danke. Ich denke, es ist nützlich, zu große oder zu kleine zu entfernen. In der Tat habe ich eine Idee, die Hus Momente benutzt, um eine falsche Erkennung zu entfernen. Das bedeutet: Berechnen Sie Hu's Momente einer Anzahl von Trainingsellipsen. Berechnen Sie dann für jede Kontur ihre Hu-Momente, wenn sie sich stark von den Trainingsmomenten unterscheiden, dann können wir diese Kontur ausschließen. Denkst du, dass diese Idee nützlich ist? – Shiyu

+0

Ich habe selbst keine Hough-Momente benutzt, daher kann ich aus Erfahrung nicht raten. hough circles klingt wie es tut, was Sie brauchen. Entschuldigung, ich kann nicht viel mehr helfen –

+0

+1 für die Verwendung von 'minEnclosingCircle()'. – karlphillip

6

In diesem speziellen Fall ist die Hough Circle Transform wahrscheinlich die einfachste Lösung.

Kopieren Sie den Code aus dem Tutorial und ändern Sie die Parameter von cv::HoughCircles() zu:

/// Apply the Hough Transform to find the circles 
HoughCircles(src_gray, circles, CV_HOUGH_GRADIENT, 1, 10, 40, 30, 0, 0); 

Ausgang:

enter image description here

Aber ich liebte @ George Idee, mit ihm zu gehen, es ist robuster als das Festschreiben von Konstanten. Mein Ansatz funktioniert gut für dieses Bild, aber wenn Sie Bilder mit verschiedenen Größen von Kreisen und Zeug haben, möchten Sie cv::minEnclosingCircle() verwenden.

1

Jetzt denke ich, dass ich das Problem erfolgreich mit meinem eigenen Algorithmus gelöst habe. Poste es einfach als zukünftige Referenz.

Wie unten gezeigt, können alle Ellipsen genau lokalisiert werden. Und falsche Erkennungen werden erfolgreich entfernt. Auf der anderen Seite ist der Algo sehr zeiteffizient: 0,03s für die gesamte Bildverarbeitung auf meinem normalen Desktop. Bildgröße: 448x336 Pixel

Ordnung der Algo:

  1. erfassen Konturen aus dem Binärbild mit der Funktion findContours
  2. Entfernen zu kleinen durch einen Schwellenwert der minimalen Größe einer Kontureinstellung
  3. Erkennung von Ellipsen mit der Funktion fitEllipse
  4. Vergleichen Sie die Kontur mit der entsprechenden Ellipse. Ersetzen Sie insbesondere alle Konturpunkte durch die allgemeine Ellipsengleichung (siehe http://www.maa.org/joma/volume8/kalman/general.html). Berechnen Sie dann den algebraischen Fehler. Wenn der Fehler kleiner als ein Schwellenwert ist, schließen Sie diese Kontur aus.

enter image description here

EDIT:Kommentare zu George Profenza und Antworten des karlphillip. Danke George Profenza und karlphillip für ihre Antworten. Ihre Antworten können das Problem jedoch nicht gut lösen.Die erste Idee von George Profenza ist es, einen Schwellenwert für die Größe der Konturen festzulegen. In der Tat habe ich das in meinem Algo verwendet. Aber das ist offensichtlich ein vorläufiger Schritt des Algo. Es gibt viele falsche Erkennungen von "guter" Größe. Die zweite Idee von George Profenza ist die Verwendung von HoughCircles, die auch von karlphillip vorgeschlagen wird. Das Problem von HoughCircles ist: (a) es ist langsam, während ich das Algo in Echtzeit in eingebetteten Systemen implementieren muss. (b) es kann nur Kreise, aber keine Ellipsen erkennen. Natürlich, wenn die Ellipse nahe einem Kreis ist, funktioniert es auch. Aber für allgemeine Fälle nicht. Außerdem kann meine obige Methode die "Ziffer 8" nicht erkennen. Es ist ein großes Problem und ich arbeite immer noch daran.

+0

Es scheint, dass Ihr Algorithmus die zwei Ellipsen in der unteren rechten Ecke (die "Abbildung 8") verfehlt hat. Ist das ein Problem? Beachten Sie, dass die Hough-Methode sie gefunden hat. – Throwback1986

+1

Ja. Ich bin gespannt, ob Sie den Hough-Kreis benutzt haben. Dieses Problem scheint das richtige Problem dafür zu sein, wie es von George und Karl oben vorgeschlagen wurde. Im Allgemeinen neigen Verfahren wie die Hough-Transformation dazu, robuster zu sein als nur einfache Heuristiken. – lightalchemist

+0

@ Throwback1986: Danke für Ihre Kommentare. Die Gründe, warum ich HoughCirlces nicht verwende, sind die folgenden: (a) Es ist langsam (richtig?), Während ich Echtzeit-Implementierung in eingebetteten Systemen brauche. (b) es kann nur Kreise, aber keine Ellipse finden (richtig?). Natürlich kann es auch Ellipsen finden, wenn die Ellipse nahe einem Kreis ist. Zweitens ist die "Zahl 8" tatsächlich ein großes Problem. Tatsächlich arbeite ich noch daran. Irgendwelche Ideen dafür? – Shiyu

1

Obwohl bereits eine andere Antwort akzeptiert wurde, gibt es mehrere Möglichkeiten, die untersucht werden müssen. Daher werde ich eine weitere Antwort hinzufügen. Unter der Annahme, dass ein Hough Verfahren schnell genug ist, um für Ihre Anwendung, sind hier einige interessante Alternativen:

  1. Ellipse detection with OpenCV
  2. http://toyhouse.cc/profiles/blogs/modified-hough-ellipse-transform-detecting-ellipse-in-an-accurate
  3. http://www.codeforge.com/article/131943
  4. Und das Papier, das ich in den Kommentaren oben hinzugefügt: http://www.bmva.org/bmvc/1988/avc-88-041.pdf

Ich könnte auch hinzufügen, dass Hough wahrscheinlich die "richtige" Möglichkeit ist, bei der zuverlässigen Erkennung von Ellipsen fortzufahren, aber Sie können int ausführen o zusätzliche Herausforderungen. Sie geben an, dass Hough-Kreise auf Ihrem Desktop schnell genug sind, aber wie gut stimmt die Leistung des Desktops mit diesem eingebetteten System überein? Hat das eingebettete System eine Gleitkommaeinheit? Falls nicht, seien Sie nicht zu alarmiert durch die Leistung, die von Software-emulierten Gleitkomma-Punkten gezeigt wird. Sie können den Hough-Algorithmus immer noch mit Hilfe von Festkommaarithmetik, Nachschlagetabellen usw. zufriedenstellend implementieren.

+0

Vielen Dank .... – Shiyu