Hi,
ich arbeite gerade daran aus Bildern meiner WebCam ein 3D-Model in Computer zu erzeugen, erstmal habe ich nur eine WebCam ich hole mir warscheinlich eine zweite. Aber als erstes muss ich in den Bildern die Kanten finden, da das über die CPU zu lange dauern würde wollte ich fragen, ob man das ihrgendwie über die GPU laufen lassen kann.
Wenn du das wirklich über die GPU machen willst, dann schlage ich vor: Schau dir mal CUDA an.
Eigentlich sollte aber eine CPU dafür schnell genug sein. Ich weiß das diese Leute eine solche Kantenerkennung auf auf zwei ARM7 Prozessoren mit gerade mal 60 Mhz in Echtzeit machen, wobei neben her auch noch der Rest des Fahrzeugs gesteuert wird. Auch wenn die da wahrscheinlich kein 3D-Modell erstellen, eine aktuelle CPU sollte das hin bekommen...
Zitat:
Rechenleistung 2xARM7: je 60 MHz Verarbeitete Bilder: 25 pro Sek. Bildformat: 88x72 @ 24bit RGB
Bei CUDA steht, das es erst ab GeForce 8000 läuft, leider habe ich immer noch ein Geforce 6700. Bei der Seite beim Link, bin ich mir nicht sicher, ob die eine 640*480 Kamera haben, denn man muss doch eigendlich jeden Pixel einzeln durchlaufen und muss nochmal die benachbarten Durchschauen also eine Loop mit ca 300000 Durchläufen und das über 30 mal pro Sekunde, ich halte das selbst auf einer schnellen CPU für unrealistisch.
Die Leute auf die ich verlinkt habe arbeiten mit einer Auflösung von 88x72. Sofern du da ein wenig auf Cache-Effizienz und solche Dinge achtest sollte das aber auch mit 640x480 eigentlich kein Problem sein, insbesondere wenn du mehrere CPU-Kerne benutzt. Viel höher darf die Auflösung dann allerdings auch nicht sein.
Eine Geforce 6 hat laut Wikipedia immerhin Shader Modell 3. Damit kannst du schon was anstellen, aber du musst alles von Hand im Shader programmieren.
Ich hatte auch schon an Shader gedacht, es dann aber wieder verworfen, weil ich nicht weis wie ich an die Daten kommen soll, die die Shader errechnen. Die einzige Idee die ich hatte, ist ein VBO erzeugen einen Zeiger vom VBO nehmen und diesen als Textur ausgeben, so das ich die Daten in das VBO schreiben kann, weis aber noch nicht wie das gehen soll.
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Kanten findet man mit Filterkernen.
OpenGL bietet dazu die sogenannten Convolution Filter an.
Die Idee dabei ist, kleine rechreckige Matrizen welche mit "Gewichtungen" gefüllt sind auf jeden Pixel zu legen und einen Kennwert zu berechnen. Das Thema Bilderkennung ist bei Kanten schon recht weit. Eventuell findest du dazu auch das ein oder andere Paper im Netz.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Registriert: Di Mai 18, 2004 16:45 Beiträge: 2623 Wohnort: Berlin
Programmiersprache: Go, C/C++
Ich glaub ich muss dir da erstmal eine Seifenblase platzen lassen.
Die Umwandlung von 2D in 3D ist ein recht komplexes Thema.
Für dich wäre wohl die einfachste Variante folgende.
Einen Lichtstreifen realisieren, durch z.B. eine gleichmässige LED bestückte Leiste und LEDs mit sehr geringen Streuwinkel nehmen.
Diese Lichtleiste wird auf das Objekt fokusiert(eine dünne Linie aus Licht wird von oben bis unten das Objekt beleuchten).
Das Objekt muss auf ein Drehfuß, damit man es ohne es zu bewegen auf Y-Achse zu drehen.
Nun setzt man eine Kamera parallel zur Lichtleiste in Richtung Objekt.
Umgebung abdunkeln und Bilder vom Objekt machen, wärend man es in geringen Winkeländerungen dreht.
Man geht anschliessend alle Bilder durch, erhöht den Kontrast und entfernt alles ausser dem Lichtstrahl, welcher eine Kontrulinie auf der Oberfläche bildet.
Durch Kameraposition, Drehfußposition und der Kontrulinie, kannst du die Pixel in den 3D Raum Transformieren.
Die Qualität ist entsprechend abhängig von Kamera und dem Streuungswinkel der Lichtquelle(normalerweise nimmt man Laser mit einer sehr hohen Bewegungsfrequenz).
Ein weiterer Nachteil ist die beschränkung auf die Objektgröße.
Ein wesentlich komplexere Möglichkeit ist die Stereoskopie.
Hierbei werden 2 oder mehr Kameras verwendet, diese werden konstant zueinander ausgerichtet, damit die Positionen bekannt bleiben.
Man zieht die Bilder aller Kameras, transformiert die Linsenkrümung weg und sucht sogenannte Point of Interest.
Diese sucht man nun in den anderen Bildern und setzt diese in Relation.
Man kann nun anhand der Positionen der Kameras, deren Abstand und der Point of Interest die Projektionsmatrizen für jede Kamera berechnen(thematik triangulierung und Ebenenpunkte)
Durch die Projektionsmatrix kann man nun ein beliebigen Punkt des dazugehörigen Bildes dem 3D Raum zuordnen.
Je mehr Kamerabilder vorhanden sind, des so genauer wird die Tiefenbestimmung, da man mehr Z-Posititionskorrekturen hat.
Für Robotik und Automatisierung werden üblicherweise 2 Kameras verwendet, für die 3D Rekonstruktion von Szenen werden über 2 verwendet.
OpenCV hat zu der Thematik ein paar Basis Algorithmen, wo man anfangen könnte.
Ich arbeite seit kurzer Zeit an der Stereoskopie für die Echtzeit generierung von Tiefenbildern.
Wobei ich viel Zeit durch das finden von einer guten Kamera verbracht habe, die auch Bilder schiesst, die überhaupt lohnen zu verarbeiten.
Die Standard Webcams kann man dafür in die Tonne werfen, da diese eine sehr niedrige Auflösung haben und durch Software nur die kleinen Bilder, die der CCD macht hoch skaliert.
Dies hat zur folge, dass man Bildfehler aller Art mit drin hat, was zu entfernen aufwändiger ist als der restliche Prozess und noch dazu sinkt durch korrekturen die Tiefendatengenauigkeit.
Zur Thematik gibt es bergeweise Lektüre im Netz und in Buchform, vieles überwiegend Wissenschaftlich geschrieben und auch nicht mehr Stand der Technik, bzw. nur als erklärung aber nicht als Implementierung brauchbar.
_________________ "Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren" Benjamin Franklin
Ein wesentlich komplexere Möglichkeit ist die Stereoskopie.
Das hatte ich vor, dabei ist es mir aber nicht wichtig, das ich jeden Pixel zuordnen kann, ich versuche in 2 Bildern die Kanten zu erkennen und vergleiche dann. Je nach Verschiebung der Kanten in den einzelnen Bildern weis ich die Z-Koordinate. Dann nehme ich ein Bild (oder beide weis noch nicht genau), und lege die Pixel aus dem Bild als Textur über die jeweiligen Objekte.
Registriert: Di Mai 18, 2004 16:45 Beiträge: 2623 Wohnort: Berlin
Programmiersprache: Go, C/C++
Wenn du die Stereoskopie wählst, dann sollten es definitiv 2 Baugleiche Kameras sein, am besten sogar 2 nacheinander vom Band gelaufende sein, da sonnst die Wahrscheinlichkeit groß ist, dass diese unterschiedliche Qualitätsmerkmale aufweisen. Der Allererste Schritt bei der Stereoskopie ist die Korrektur der Eingangsbilder, da die Linsenkrümmung das Bild verunstaltet und somit ein Pixelvergleich nur Datenmüll produziert. Man Kalibriert hierzu die Kameras, was bedeutet, Eingabe von Abstand, Winkel, Farbeinstellungen. Nun passt man die Farben aneinander an, dazu kann man die Bilder vom Anfang ohne Probleme benutzen. Haben die Kameras ein Fokuseinstellung, dann Fokussiere so weit wie möglich weg(theoretisch unendlich weit entfernt). Die Kameras werden nie sehr gut ausgerichtet sein, da Gewicht, Wärme und so weiter diese einfach in der Ausrichtung beeinflussen und ein 1/10 millimeter Bewegung machen im Bild schon einige Pixel versatz aus. Des weiterem sind durch die Linsenkrümung die Pixel nochmal verschoben und zum Zentrum hin werden die Punkte überhaupt erst ähnlicher. Man sucht also die Linsenkrümmung und transformiert das Bild, damit die Pixel wirklich auf einer Ebene liegen, dann werden Proben genommen und in beiden Bildern Gesucht und die Positionen gemerkt, um den Z-Achsen Winkel zu korrigieren. Anhand der Positionen lässt sich fest stellen, wie das jeweilige Bild auf dem logischen Z verschoben/gedreht ist und dies fliesst nun auch noch in die Matrix mit ein. Eine Probe sollte von den Rändern Links und Recht, von beiden Bildern gemacht werden und diese im anderem Bild gesucht werden, damit man die verschiebung der Referenzpunkte im anderen Bild findet und diese Transformation auch noch in die Transformationsmatrix einfliessen lässt und das Bild wird entsprechend nochmal Transformiert. Nun hast man ein Bild, wo die gleichen Punkte, in beiden Bildern, auch auf der gleichen Horizontalen und Vertikalen Linie liegen und du kannst endlich anfangen, dass zu machen, was die ganzen Papers zu der Thematik anfangen(gerade mal 1-2 haben diesen gewaltigen Schritt davor überhaupt erwähnt und nur eines hat es erklärt, war eine Diplomarbeit über Roboter Bewegung im Raum). Dieser ist notwendig und lohnenswert, da man nun jedes geschossende Bild einfach mit der Matrix Transformiert und schon alles einen Schritt durch hat. Man kann dann anfangen gemütlich Punkte Triangulieren und die Tiefendaten für jeden Pixel bekommen.
Dein Weg, ist nahezu der gleiche, du würdest bei den Proben, nach der korrektur von Linsenkrümmung ein Canny, Sobel oder ähnliches drüber jagen und dann die Linien zu Vektoren umwandlen und diese im 2. Bild suchen gehen. Durch das finden der Linien im anderem Bild bekommst du durch einfache Linieare Algebra den Winkel und offset zueinander, welche du dann in die Transformationsmatrix hinzu fügst. Damit du beim nächsten mal nur die Matrix durchlaufen lassen musst und am Ende dann über Sobel,Canny und co die Kanten findest, die Tiefenwerte für die dazu gehörigen Pixel findest und in den 3D Raum konstruierst. Die Textur hast du dank der ganzen Vorarbeit schon fertig vorbearbeitet, ein einfaches Texturebaking, wie man es von Radiosity und co kennt läuft dann hier ab und wird der Fläche zugewiesen.
_________________ "Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren" Benjamin Franklin
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.