![]() |
Positition eines 3D Objekts aus einem Bild auslesen
Hallo Delphianer
Ich habe ein kleines Problem, und hoffe, dass sich schon mal jemand damit beschäftigt hat: Es geht darum, dass ich im nächsten Semester einem Roboterarm beibringen soll, eine Tasse zu greifen. Dafür habe ich als Sensor eine Web-Cam die auf dem Greifer des Roboters angebracht ist. (wobei man die auch wo anders hinstellen könnte, aber bei einer Kamera wird's wohl bleiben.) Wo mein Arm im Raum ist, weiss ich, wo die Tasse ist oder in welche Richung sie ausgerichtet ist, weiss ich nicht. Am Liebsten würde ich aus einem einzelnen Bild diese Informationen auslesen, um dem Arm dann sagen zu können, wo er sich hinbewegen kann. Dem Arm kann ich dabei einfach eine 3D Position übergeben, die Umrechnung in Gelenksbefehle bekomme ich geschenkt. Das eigentlich Fassen werde ich über Tastsensoren realisieren, die an den Fingern des AEinrms angebracht sind. Die Tasse wird sicher deutlich vom Hintergrund abheben, so dass ich die Kante auslesen müssen könnte. Wie die Tasse aussieht weiss ich im vorraus, da könnte ich Trainingsbilder machen, oder mir ein openGL-Modell anfertigen, oder sonstwie vorverarbeiten. Ein einfacher Ansatz wäre ein openGL Modell, mit dem ich Bilder in Abhängigkeit von den Positions- und Rotationsparametern erzeugen kann, die dann mit meinem KameraBild vergleiche und dann eine Suche nach den passenden Parametern sucht. (steepest ascent,...). Auf dem Rechner läuft Linux, der Aufwand für den ständigen Bildvergleich wäre wohl aber etwas zu hoch und auch die Genauigkeit wäre zu niedrig, was ein größeres Problem darstellt, da ich den Greifer doch recht nah an die Tasse ranfahren muss, damit ich mit dem Tastern arbeiten kann. Ein anderer Ansatz wäre die Extraktion ein paar Interessanter Punkte aus dem Bild, so dass ich versuchen könnte, diese Punkte dann im Modell zu finden und darüber auszurechnen, wo sich die Tasse zu befindet. Für alles andere (auch wenn es nur Papers sind, in denen was in der Richtung behandelt wird) wäre ich sehr dankbar, im nächsten Semester werde ich recht viel Zeit da rein stecken, so dass wirklich die Zeit da ist, mich in ein paar Sachen einzulesen. Nikolas |
Re: Positition eines 3D Objekts aus einem Bild auslesen
Hallo!
Es hat schon ein Grund, weshalb die Evolution (nahezu?) alle Lebewesen mit mindestens 2 visuellen Organen ausgestattet hat - erst die machen nämlich das räumliche Sehen erst möglich! Spontan würde ich sagen, dass Du das, was Du vor hast, nicht mit nur einer Webcam hinkriegen wirst. Edit: ![]() Edit die 2te: ![]() |
Re: Positition eines 3D Objekts aus einem Bild auslesen
Zitat:
Irgendwo gab es einmal ein Video einer Software, die anhand eines Videos solche 2D->3D-Umrechnungen vornahm. Im Video fuhr die Kamera an einem stehenden LKW vorbei. Man musste nur in einem beliebigen Frame die LKW-Seiten skizzieren und das Programm faltete das ganze dann zum LKW-Quader. Jetzt bräuchte man nur noch einen passenden Suchbegriff, um das Video wiederzufinden :gruebel: :( . |
Re: Positition eines 3D Objekts aus einem Bild auslesen
Zitat:
|
Re: Positition eines 3D Objekts aus einem Bild auslesen
Die Bewegung sollte nicht einmal nötig sein, wie mir kurz danach eingefallen ist. Das hier wollte ich gerade reineditieren ;) :
Angenommen, du kennst die Eigenschaften der Kamera und die Größe der Tasse und kannst diese auf dem Bild auch genau genug erfassen. Dann hast du genau den Output der Projektion in der Grafikkarte: Bildschirmkoordinaten und Tiefe (Z-Wert) des Objekts. Also müsstest du nur noch das übliche World-View-Projection umkehren, dann bekommst du die absoluten World-Koordinaten. |
Re: Positition eines 3D Objekts aus einem Bild auslesen
Das haut aber auch wirklich nur dann hin, wenn du die Größe der Tasse sehr genau weisst, und diese in jeder vorkommenden Lage auch genau genug erkennen/umranden kannst. Weil die perspektivische Verzerrung wird wohl gering genug ausfallen, um dafür zu sorgen dass um 1-2 Pixel falsch erkannte Größen zu starken Variationen in der Tiefenschätzung führen werden. Wenn die Kamera relativ nah am Objekt ist, lässt sich das aber u.U. durch Nutzung eines Objektives mit sehr großem FOV zumindest ausreichend beheben.
Am sichersten fährst du eigentlich wenn du noch einen zusätzlichen "Tiefensensor" einbringen kannst. Die Nobelklasse sind da Laser, aber auch ein Ultraschall dürfte für diesen Zweck noch mehr als sehr gute Dienste leisten können. Sogar mit 2 Kameras ist das Erkennen/Umranden und herausrechnen der Tiefeninformation aufgrund der meist nicht allzu großen Auflösung der Kameras noch immer relativ ungenau, vor allem aber vergleichsweise aufwendig. Es gab mal ein Freeware Programm "Icarus", dass von irgend einer Gruppe ich glaube an der Uni Manchaster entwickelt wurde. Das konnte anhand eines Videos ohne weiteres Zutun schon recht gut die Kamerafahrt und die Lage der erkannten Featurepoints in gängige 3D-Formate umsetzen. Hat man die Featurepoints noch von Hand an Objektkanten gesetzt und sie konnten gut getraced werden, konnte man sogar relativ gut zumindest Dinge wie Wände oder Schränke mit einbringen. Auf dieser Basis hatte das Teil auch noch eine Anti-Wackel-Funktion, die das Wackeln von Handkameras erstaunlich gut korrigieren konnte. Das dumme ist nur, dass dieses Programm schon vor Jahren aus dem Netz genommen wurde, und die (proprietäre) Technologie an ein Unternehmen verkauft wurde. An welches weiss ich leider nicht, aber ich hab es seit dem nicht mehr geschafft auch an ältere Versionen zu kommen. Das hat recht gut demonstriert wie weit man so ca. gehen kann, der dahinter stehende Aufwand belief sich aber auf zig Mannjahre - und auch das war aus o.g. Gründen keinesfalls Millimetergenau, oder hätte das anderweitige Erfassen einer Kamerafahrt in Hollywood fürs Composing ersetzen können. |
Re: Positition eines 3D Objekts aus einem Bild auslesen
Mit einer Cam würde ich es so machen:
Da die Position der Cam und die des Robo.-Arms bekannt ist kann man die Position der Tasse berechnen. Vorher muss der Robo den Arbeitsbereich aus verschiedenen Winkeln aufnehmen (x,y und z - achse). Nun hat man die Position und die Ausrichtung der Tasse samt Henkel. Den Arbeitsbereich sollte man mit einem dunklen Material auskleiden um einen guten Kontrast zu erhalten für die Bilderkennung die die Tasse sucht/erkennt. Der Rest sollte einfach sein je nach OS des Robos. |
Re: Positition eines 3D Objekts aus einem Bild auslesen
Ich bin bisher von einem statischen Roboter ausgegangen. Wenn du den präzise genug bewegen kannst, kannst du in der Tat darüber mit einer Cam auskommen, da die Szene an sich ja vermutlich statisch sein wird. Dann kannst du dir ja so gesehen unendlich viele Kameras simulieren.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:49 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz