Webcam, Frage der Machbarkeit

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von n1nja.

    Webcam, Frage der Machbarkeit

    Hallo!

    Ich bin gerade dabei mein nächstes Projekt anzugehen, und wollte mich deshalb mal über ein paar Sachen informieren.

    Also ich will ein Bild mit einer Webcam machen, und das Bild dann auswerten. Auf dem Bild sind 4 Objekte, welche willkürlich irgendwo liegen können. Es sind 4 gleiche Objekte, allerdings mit unterschiedlichen Farben. Der Blick der Webcam erfolgt aus der Vogelperspektive. Es müssen alle 4 Objekte erkannt werden, und dann sollen diese ausgewertet werden, z.B. 2 verschiedene Kantenlängen des Objektes, was auf der Oberseite des Objektes ist, usw. usw.

    Was würdet ihr für eine Auflösung der Webcam empfehlen? Reichen da 1024*768, oder doch eine höhere Auflösung?

    Würdet ihr so was überhaupt mit VB.NET machen? Oder sind da Libs wie OpenCV besser für geeignet?

    Und, bekomme ich als Anfänger so etwas überhaupt in einem Monat hin?
    Die Auflösung reicht auf jeden Fall - 640p sind auch schon längst genug. Für die Implementierung würde ich VB.NET/C# mit EmguCV (OpenCV-Wrapper) empfehlen. Um die Basis zu machen, muss man nur die Tutorials durchgehen und den Code daraus zusammenfassen (und die richtigen Parameter finden!), der Rest ist auch nicht allzu schwer.

    Schwieriger wird es sein, das Programm am Anfang zum Laufen zu kriegen, da es keine Dokumentation darüber gibt, welche OpenCV-Libraries in welchen Situationen gebraucht werden und wie die Projektmappe aufgebaut sein muss. Bei dem Thema konnte ich bisher leider auch nur raten.

    Noch zwei Fragen zur Aufgabenstellung: Gibt es noch andere Objekte (oder Schatten, ...) auf dem Bild? Sind die Formen der Objekte variabel?
    Hi!

    Wusste gar nicht das es EmguCV gibt, ist aber natürlich so viel einfacher.

    Ist das mit der Doku nur bei EmguVC, oder auch bei OpenCV? Ich würde mal sagen, dass mir dann wohl oder übel nichts anderes übrig bleibt, als mich durchzukämpfen.

    Wenn sogar 640p reicht bin ich beruhigt, dachte schon ich müsste mir extra dafür eine neue kaufen.

    Andere Objekte gibt es nicht, und es sind auch immer die gleichen. Es geht hierbei um 4 Würfel (4 unterschiedliche Farben), wo ich "nur" auswerten will, welche Seite oben liegt. Und falls es noch irgendwie geht, die Kantenlänge von 2 Seiten. Dies muss aber nicht wenn es zu kompliziert wird.

    Parmaster schrieb:

    Was würdet ihr für eine Auflösung der Webcam empfehlen?
    Dann ist das völlig unwichtige Problem der Bildverarbeitung wohl schon gelöst?
    Trenne den Bildeinzug vollständig von der Auswertung. Die Auswertung bekommt das Bild und damit dessen Größe und feddich.
    Wenn das Programm iwann mit einer anderen Kamera laufen soll, musst Du lediglich den Bildeinzug anpassen.
    Das sieht sehr nach einer Kamera-Interface-Klasse aus. :D
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Parmaster schrieb:

    Was würdet ihr für eine Auflösung der Webcam empfehlen?
    Dann ist das völlig unwichtige Problem der Bildverarbeitung wohl schon gelöst?


    Wie meinst du das?


    Also mit der Webcam das Bild machen, "umwandeln" in das richtige Format, und dann nur das Bild auswerten anstatt das Bild der Webcam.

    Parmaster schrieb:

    anstatt das Bild der Webcam.
    So isses. :thumbsup:
    Der Auswertung sollte es schön egal sein, wo das Bild herkommt.
    So kannst Du auch offline gespeicherte Bilder auswerten, z.B. um den Algorithmus zu entwickeln / zu testen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Wenn das das Ziel ist, mach ne Funktion, welche ein Image<Bgr, Byte> entgegen nimmt, dann bist du bei EmguCV am flexibelsten. Wegen der Doku: die ist bei EmguCV nicht allzu gut, man findet sich aber mit der Zeit zurecht. Wenn du möchtest, kann ich dir gerne erklären, wie man am einfachsten und zuverlässigsten Quadrate finden kann - wenn man mal nen Code hat, versteht man den auch ganz gut.

    Wegen der Kantenlänge: Das ist kein Problem, die Objekte kriegste von EmguCV als Auflistung von allen Eckpunkten, da kannste die Kantenlänge leicht berechnen.

    Und noch wegen der Erkennung der Seiten: In einem der Beispiele wird beschrieben, wie man ein (2D-) Objekt mithilfe eines Bildes leicht identifizieren kann (nennt sich glaub ich Template Matching).
    @RodFromGermany

    so wollte ich es auch machen. Bin mir nur noch nicht sicher ob ich direkt nach Aufnahme des Bildes die Auswertung mache, oder z.B. erst 10 Bilder mache, diese in einem Ordner speichere, und dann die Auswertung in einem Rutsch mache.
    Da es aber um eine statistische Prozesskontrolle geht, muss es wohl der erste Fall sein, da man somit "Produktionsfehler" direkt erkennt und handeln kann (die Produktion ist hier natürlich nur simuliert).

    @nafets

    das wäre echt super wenn du mir beim Einstieg und Umgang mit OpenCV/EmguCV helfen könntest. :thumbup:

    Jetzt brauch ich nur noch die Webcam, dann kann es losgehen.
    Klar kann ich dir helfen ;)
    Warum aber erst die Bilder speichern? Bei der Auswertung der Daten für meinen Rubiks Cube Scanner dauert der Vorgang (vom Aufnehmen des Bildes, Berechnung der Ergebnisse bis zur Darstellung in 8 verschiedenen Modi gleichzeitig) nur ca. 0,05s. Es ist also sehr gut möglich, alles Live zu verarbeiten. Was ich sogar noch in Ansätzen probiert habe, war alle gefundenen Objekte für 50(!) Frames zu speichern, um Störungen durch Rauschen zu minimieren - ich bekam trotztem noch ca. 5fps. Damit war es dann sehr einfach, alle sich nicht bewegenden Objekte auf weniger als einen Pixel genau zu lokalisieren und alle nicht relevanten Objekte zu ignorieren. Selbst Hände, die sich durch das Bild bewegen können so rausgefiltert werden. Hier kann es aber auch gut mal 5s dauern, um das finale Processing zu erledigen, welches alle Ergebnisse der einzelnen Frames auswertet.
    @Parmaster In jedem Falle trenne die Bildaufnahme von der Bildverarbeitung!
    Online kann eine fertige Aufnahme die Verarbeitung in einem anderen Thread antriggern, das ist kein Problem.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @nafets

    Hört sich echt sehr gut an, hätte ehrlich gesagt nicht geglaubt dass das so schnell geht. Bei mir ist es wohl eher 1 Bild pro Minute oder so. :) Ist aber auch nur ein Versuchsaufbau. Trotzdem gut zu wissen dass dies möglich ist, vielleicht kann ich es in Zukunft noch gebrauchen.

    @RodFromGermany

    werde ich auf jeden Fall machen. :thumbup:

    Parmaster schrieb:

    1 Bild pro Minute oder so.
    Bildverarbeitung ist im Allgemeinen sehr gut parallelisierbar (Parallel.For()).
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich hab vor einigen Wochen damit rum gespielt.
    Schwer ist allemal nicht. Ich verwende es um damit Produkte zu analysieren die wir auf der Arbeit fertigen. Sozusagen Fehlerbilder auf den Teilen erkennen usw. Du kannst dich gerne mal bei mir melden, wenn du Hilfe brauchst.