Objekterkennung mit Arduino Kamera?
Hallo,
Ich möchte für ein Schulprojekt das bekannte Spiel Bierpong optimieren, mittels Sensoren, LED's und einem Arduino.
Bei Bierpong gibt es Regeln und eine sehr wichtige Regel ist, dass dein Ellenbogen beim Wurf des Tischtennisballs nicht hinter der Tischkante sein darf. Dies möchte ich mittels einer Kamera überprüfen.
Ich habe schon sehr viel zeit investiert, um zu recherchieren, wie die realisierbar ist und landete bei allem in einer Sackgasse. Das größte Problem ist nämlich, dass der Sensor oder die Kamera erst reagieren soll, wenn der Ellenbogen hinter der Kante ist und nicht schon bei der Hand oder beim Arm (der darf ja über der Kante sein). Deshalb ist mir die Idee gekommen ein Armband um den Ellenbogen zu tragen und die Sonsoren / Kamera so einzustellen, dass diese nur auf das Armband reagieren. Mit Sensoren ist dies aber meines Wissens nach nicht möglich, da es keinen Sensor gibt der auf ein bestimmtes Material reagiert ader Farben über weite Distanz erkennt, also sind für mich Sensoren aus dem Spiel.
Mit einer Kamera sollte es aber gehen und an dem arbeite ich gerade auch.
Nun deshalb meine Frage: Wie würdet ihr so einen "Ellenbogen Prüfer" realisieren und falls ihr auch zu dem entschluss mit der Kamera kommt welche Kamera würdet ihr nehmen / könnt ihr empfehlen, die folgende Kriterien erfüllt:
-Die Kamera sollte mehr als 5 fps liefern, da der Wurf recht schnell ausgeführt wird und mit nur einem bild pro Sekunde die Kamera den Wurf meist garnicht mitbekommt
-Die Kamera sollte Objekte z.B. ein rotes Armband auf 0,5 - 1m gut erkennen
-Die Kamera soll direkt mit dem Arduino verbunden sein, keine IP oder Bluetooth Kamera.
-Die Kamera soll falls möglich leicht zu bedienen sein d.h. wenn es eine fertige Arduino Library für die Kamera gibt wäre dies toll.
-Die Kamera sollte nicht mehr als 25 Euro kosten ALSO EINE PIXY oder PIXY2 IST ZU TEUER.
Außerdem möchte ich wirklich gerne einen Arduino verwenden, also kommt ein Rapberry Pi nur dann in Frage wenn es wirklich garnicht anders geht.
Ich bedanke mich schonmal im Voraus und bin gespannt was ihr für lösungen habt.
2 Antworten
Ich habe einige Erfahrung mit dem Arduino. Eine Kamera da anzuschließen ist zu krass für das Gerät. Man müsste bei 720p und 5 fps 6 Mio Pixel auswerten.
Lässt man den Arduino zählen und gibt sich das im Serialmonitor aus, dann kommt man auf 0,1 bis 0,2 Mio Durchläufe pro Sekunde. Da fehlt also Geschwindigkeit.
Ich habe auch etwas Erfahrung mit OpenCV mit einem Laptop, da ich mal einen Fahrspurassistent programmiert habe. Der lief mit 30 fps so gerade eben flüssig. Mit einem Raspi würde das Programm auch laufen, aber da habe ich keine Erfahrung.
Eine Kamera kannst du beim Arduino vergessen. Ob deine betrunkenen Teilnehmer sich auch noch verkabeln lassen, bejahe ich jetzt mal.
Mach mal ein Experiment. Nimm deine Fernbedienung (Dort ist eine Infrarot LED drinnen.) und schalte den Fernseher ein. Fernseher empfängt das Signal und schaltet sich ein. Nun lege da ein Hindernis zwischen, eine scharfe Kante. Fernbedienung, Kante und TV Sensor sollen auf einer Höhe sein. Variiere die Höhe der Fernbedienung. Bekommt man eine scharfe Abgrenzung hin, also etwas zu tief, kein direkter Sichtkontakt, Fernseher reagiert nicht?
Wenn das geht, dann soll das Armband am Ellenbogen mit IR Licht leuchten. Dann kommt die Tischkante und am Boden ist der Arduino mit Sensor in einer vertikalen Flucht. So könnte es funktionieren (wenn vermutlich auch nicht komplett zuverlässig...)
Was für einen Arduino würdest du verwenden wollen?
Solch einen ATmega328P kannst du dafür erst mal nicht nehmen, der ist dafür viel zu rechenschwach!
Selbst mit einem ARM Controller von ST würde ich das nicht machen.
An deiner Stelle würde ich es mit einem RaspBerry Pi oder sogar mit einem Laptop machen.
Beim RaspBerryPi gibt es ja diese 8Mpixel Kamera die man da direkt ran machen kann. Ob der RPiZeroW dafür ausreichen sollte, das kann ich nicht sagen.
Ich hatte mit C# ein Programm für Windows geschrieben, habe die Bilder einer Webcam genommen und dann just in time bearbeitet. Manchmal reicht es einfach das Bild in größere Kästchen aufzuteilen, damit man erst mal ein grobes Bild hat um einzelne Bereiche zu erkennen zu können die sich verändert haben.
Du musst ja wissen wo sich da etwas verändert und dann auch in welche Richtung sich dieses Objekt wie schnell bewegt. Bei meiner Objekterkennung hatte ich eine maximale Geschwindigkeit von 1fps erreicht. Danach habe ich mir eine Grafikkarte besorgt um die Berechnungen auf der Grafikkarte (OpenCL) parallel ausführen zu lassen und das ging dann schon bedeutend schneller.
Elon Musk nutzt für seine Autos richtige spezialisierte Rechenmonster.
Selbst wenn du nicht so viel wissen möchtest, allein das Bild zu holen, dann in den Arbeitsspeicher zu laden und es dann in deinem Programm verfügbar zu halten um es leicht bearbeiten zu können (unkomprimiert) ist schon ein Rechenakt für den du weitaus mehr als nur einen Arduino brauchst.
Es gibt mit OpenCV eine gute Möglichkeit das recht schnell und einfach realisieren zu können, da sind viele Funktionen schon enthalten und du musst dir nur ein paar Beispiele anschauen und es verstehen wie man da ran geht.