OpenCV-Konvertierung von Canny-Kanten in Konturen

Ich habe eine OpenCV-Anwendung, die aus einem Webcam-Stream eines Büroinnenraums gespeist wird (viele Details), in dem ich einen künstlichen Marker finden muss. Die Markierung ist ein schwarzes Quadrat auf weißem Hintergrund. Ich benutze Canny, um Kanten und cvFindContours zum Konturieren zu finden, dann approxPolyDP und co. Verwenden Sie zum Filtern und Finden von Kandidaten das lokale Histogramm, um weiter zu filtern, bla bla bla ...

Das funktioniert mehr oder weniger, aber nicht genau so, wie ich es will. FindContours gibt immer eine geschlossene Schleife zurück, auch wenn Canny eine nicht geschlossene Linie erstellt. Ich bekomme eine Kontur, die auf beiden Seiten der Linie läuft und eine Schleife bildet. Für geschlossene Kanten auf dem Canny-Bild (meinem Marker) erhalte ich zwei Konturen, eine auf der Innenseite und eine andere auf der Außenseite. Ich habe Probleme mit dieser Operation:

Ich bekomme 2 Konturen für jeden Marker (nicht so ernst)

die trivialste Filterung ist nicht verwendbar (nicht geschlossene Konturen ablehnen)

Also meine Frage: ist es möglich, nicht geschlossene Konturen für nicht geschlossene Canny-Kanten zu erhalten? Oder was ist die Standardmethode, um die beiden oben genannten Probleme zu lösen?

Canny ist ein sehr gutes Werkzeug, aber ich brauche eine Möglichkeit, das 2D-S / W-Bild in etwas zu konvertieren, das leicht zu verarbeiten ist. So etwas wie verbundene Komponenten, in denen alle Pixel in der Reihenfolge aufgeführt sind, in der die Komponente angezeigt wird. So kann ich nach Schleifen filtern und diese in approxPolyDP einspeisen.

Update: Ich habe ein wichtiges Detail übersehen: Der Marker kann in einer beliebigen Ausrichtung sein (er zeigt nicht von vorne in die Kamera, keine rechten Winkel). Tatsächlich ist es eine Schätzung der 3D-Ausrichtung, basierend auf der 2D-Projektion des Markers.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage