Markererkennung mit OpenCV

  • Markererkennung mit OpenCV

    Ich möchte mit dem OpenCV-Framework Marker auf Bildern über das iPhone erkennen. Es sollen mehrere Markermuster unterschieden werden können. Über Google habe ich ein Tutorial der TU-München gefunden, was recht gut passt. Allerdings ist es noch etwas zu oberflächlich.

    Könnt Ihr mir Hinweise oder Tipps geben, wie ich sowas umsetzen kann?
    „Meine Komplikation hatte eine Komplikation.“
  • RE: Markererkennung mit OpenCV

    Ob das (die Erkennung) mit OpenCV selber zu machen so viel Spass macht, weiss ich nicht. Es gibt ja ganze Toolkits dafür (ARTag, ARToolkit).
    Ansonsten, im Prinzip Chessboard-Corners erkennen, und dann versuchen, daraus eine Marker-Identifizierung herzuleiten.
    Deine Frage ist etwas unkonkret, darum weiss ich nicht, wie ich da helfen kann.
    C++
  • RE: Markererkennung mit OpenCV

    Original von zermelo
    Es gibt ja ganze Toolkits dafür (ARTag, ARToolkit).

    Momentan soll ich eine Möglichkeit zur Markererkennung evaluieren. ARToolkit ist dabei auch am Start. ARTag schau ich mir mal an.

    Original von zermelo
    Ansonsten, im Prinzip Chessboard-Corners erkennen, und dann versuchen, daraus eine Marker-Identifizierung herzuleiten.
    Deine Frage ist etwas unkonkret, darum weiss ich nicht, wie ich da helfen kann.

    Es geht darum, Objekte in einem Raum anhand von Markern zu erkennen. Über die erkannten Marker sollen den Objekten dann Informationen (via Overlays) zugeordnet werden. Das Ganze soll ein Museumsführer werden. Da die Objekte sehr ähnlich sind, scheidet aber eine Objekterkennung wahrscheinlich aus.

    Das erwähnte Tutorial (uups, ich habe den Link vergessen) beschreibt das technische Prinzip, das ich brauche. Mir fehlt aber der Hintergrund, um das umsetzen zu können.
    „Meine Komplikation hatte eine Komplikation.“
  • RE: Markererkennung mit OpenCV

    Das ganze selber mit OpenCV zu machen erfordert einiges an Geduld und Können, damit es robust genug für einen produktiven Einsatz ist. Ich habe schon Tage verbracht mit Kalibrieren und Parameter-Anpassen für diverse Computer Vision Aufgaben.

    Viele Grundlagen und wie man sie in OpenCV umsetzt sind in dem hervorragenden Buch
    "Learning OpenCV Computer Vision with the OpenCV Library" von G. Bradski und A. Kaehler, erschienen bei O'Reilly
    beschrieben, und kann ich Dir nur empfehlen.

    Ausserdem bin ich grade sehr angetan von
    "Multiple View Geometry in computer vision" von R. Hartley und A. Zisserman, erschienen bei Cambridge University Press,
    was jedoch extrem detailliert und mathematisch ist. Kameramodelle und -Projektionen werden hier aber auch sehr schön hergeleitet, ist aber wahrscheinlich etwas zu weitgehend für Deine Problemstellung. Schön ist aber, wie die numerischen Methoden hergeleitet werden.

    Weiterhin glaube ich mich zu erinner, dass die Verlässlichkeit der Erkennung von verschiedenen Objekten extrem von der Markerkodierung abhängen, da gibt es wohl einige Publikationen zu. Es kann sein, dass einige davon sogar patentiert sind.

    Was AR für Mobile Geräte angeht, ist mir zu Ohren gekommen, dass hier grade die Firmen wie Pilze aus dem Boden schiessen, evtl. findest Du schon fertige Lösungen.

    Wenn Du noch Hilfe brauchst, kannst Du mir auch gerne eine Mail schreiben.
    C++
  • RE: Markererkennung mit OpenCV

    Was mir noch eingefallen ist:

    Willst Du eigentlich die 3D Position/Orientierung der Marker, oder einfach nur wissen, wo sie im Kamerabild sind? Letzteres ist natürlich wesentlich einfacher :)

    Vielleicht interessiert Dich auch, was an unserer Uni in Zusammenhang mit Handy-Museumsführern gemacht wurde: uni-weimar.de/medien/ar/PhoneGuide/

    Noch etwas Prinzipielles: Ich erinner mich, ich glaube es war das MoMA. Da gab es WLAN mit einer Webseite, wo man für jedes Bild einen üblichen Audio-Guide Code eingeben konnte, der an dem Bild angebracht war. Hat perfekt mit meinem iPhone funktioniert. Hat perfekt mit den herkömmlichen Audio-Guides funktioniert. Ich musste keine Software installieren und nur den kurzen Code eingeben. Ich musste nicht andauernd Bilder von Markern machen, was für mich als Besucher kein Vorteil gegenüber der Eingabe von vier Ziffern ist. Wenn Du verstehst, was ich meine.

    EDIT: Vergessen zu flamen: Frag aber lieber mal Amin oder hns. Die wissen alles, und können Dir sicherlich erklären, wie man das ganze in vier Zeilen Objective-C machen kann (Kommentare überflüssig!). Ich mein, so OpenCV Code in C/C++, den versteht ja niemand. Unwartbar!
    C++
  • RE: Markererkennung mit OpenCV

    Danke für Deine umfangreiche Hilfe. Da stecken eine Menge hilfreiche Punkte drin. Die Bücher schau ich mir auf jeden Fall mal an. Auf das PM-Angebot komme ich gerne noch zurück.

    Momentan tendiere ich zu ARToolkit, weil das die Funktionen schon drin hat, die ich brauche. Ich will aber nicht deren Kameraanbindung verwenden, sondern lieber den offiziellen Weg gehen, auch wenn dann meine Marker seeehr langsam erkannt werden.

    Die Konvertierung in ein OpenCV-IplImage ist zumindest sehr langsam (ca. 3Sekunden). Das ist wahrscheinlich zu lahm. Da kommt ja noch die Erkennung hinzu. Ich könnte höchstens feststellen, ob die Kamera zwischen Aufnahme und Erkennung nicht bewegt wurde und nur dann die Infos anzeigen.

    Ich brauche nur 2D-Informationen, weil zu den Markern nur Informationen (Texte und Bilder) angezeigt werden sollen. Im Prinzip ist ja die Markererkennung eine etwas komfortablere Art der Nummerneingabe ;)
    „Meine Komplikation hatte eine Komplikation.“
  • RE: Markererkennung mit OpenCV

    - ARTag ist neuer, aber die kommerzielle Unterstützung scheint eingestellt. Auf der Webseite sind aber viele Informationen zu den Algorithmen zu finden. Bei uns haben, soweit ich das mitbekommen habe, immer alle ARTag den Vorzug gegeben.

    - Warum dauert die Konvertierung so lange? Ich habe schon unter MacOS X (also nicht iPhone) die Erfahrung gemacht, dass das NSImage Interface sehr dämlich ist, wenn man an die Pixel-Daten kommen will, aber so langsam? Du kannst übrigends auch ein IplImage erzeugen, in dem Du für ein schon vorhandenes Pixel-Array nur noch einen Header erzeugst, so fällt immerhin das aufwendige Kopieren weg.

    - Sofern Du nur eine reine Erkennung haben möchtest, solltest Du Dir vielleicht auch mal die diversen Barcode-Libraries anschauen. Soweit ich das mitbekommen habe, existieren da schon welche für das iPhone.
    C++
  • RE: Markererkennung mit OpenCV

    Original von zermelo
    - ARTag ist neuer, aber die kommerzielle Unterstützung scheint eingestellt. Auf der Webseite sind aber viele Informationen zu den Algorithmen zu finden. Bei uns haben, soweit ich das mitbekommen habe, immer alle ARTag den Vorzug gegeben.

    Schau' ich mir auf jeden Fall mal an.

    Original von zermelo
    - Warum dauert die Konvertierung so lange? Ich habe schon unter MacOS X (also nicht iPhone) die Erfahrung gemacht, dass das NSImage Interface sehr dämlich ist, wenn man an die Pixel-Daten kommen will, aber so langsam?

    Ich verwende zur Zeit den ersten Algorithmus auf dieser Seite. Wahrscheinlich ist die zweite Konvertierung am Ende nicht notwendig. Aber das kann ich (noch) nicht beurteilen.

    Original von zermelo
    Du kannst übrigends auch ein IplImage erzeugen, in dem Du für ein schon vorhandenes Pixel-Array nur noch einen Header erzeugst, so fällt immerhin das aufwendige Kopieren weg.

    Hast Du da ein Beispiel für?

    Original von zermelo
    - Sofern Du nur eine reine Erkennung haben möchtest, solltest Du Dir vielleicht auch mal die diversen Barcode-Libraries anschauen. Soweit ich das mitbekommen habe, existieren da schon welche für das iPhone.

    Ich wollte auch mal versuchen, Zxing auf dem Telefon zum Laufen zu bringen. Ist auf jeden Fall auch eine Alternative.
    „Meine Komplikation hatte eine Komplikation.“
  • RE: Markererkennung mit OpenCV

    Meine Güte, so ein Aufwand, um an die Pixel-Daten von so einem bescheuerten UIImage zu kommen. Kein wunder, dass das ewig lahm ist, wenns fünf mal kopiert werden muss. Da hilft dann meine Idee mit dem Image-Header auch nicht viel, man scheint es ja wirklich zeichnen zu müssen.

    Apple schlägt ja selbst ähnliches vor, aber vielleicht sind die Kamerabilder schon in einem vernünftigen Format? Das hab ich auf die Schnelle gefunden, scheint inzwischen u.U. einfacher zu gehen:
    developer.apple.com/mac/library/qa/qa2007/qa1509.html
    C++
  • RE: Markererkennung mit OpenCV

    Original von zermelo
    Meine Güte, so ein Aufwand, um an die Pixel-Daten von so einem bescheuerten UIImage zu kommen. Kein wunder, dass das ewig lahm ist, wenns fünf mal kopiert werden muss. Da hilft dann meine Idee mit dem Image-Header auch nicht viel, man scheint es ja wirklich zeichnen zu müssen.

    "Fünf mal kopieren" ist aber schon ein bisschen übertrieben, oder? In dem verlinkten Code wird 1x Speicher reserviert und das Bild dann 1x in diesen Speicherbereich gezeichnet. Ich kenne mich mit OpenCV nicht aus, aber cvCreateImage in der fünftletzten Zeile dürfte das Bild dann noch mal kopieren, aber da hat macmoonshine ja selber schon gesagt, dass das wohl unnötig ist (stimme zu).

    Es ist richtig, dass immer mindestens eine Kopieroperation nötig ist, um an die Pixeldaten eines UIImage oder CGImage zu kommen.
  • RE: Markererkennung mit OpenCV

    Natürlich war das übertrieben. Dass man es Zeichnen muss um in RGBA-Colorspace zu konvertieren und um an die Pixeldaten zu kommen finde ich aber unnötig aufwändig.

    Auf die zweite Farbkonvertierung, diesmal von OpenCV, am Ende sollte man wahrscheinlich nicht verzichten. OpenCV erwartet in der Regel BGR Bilder.
    C++