3D-Scan 2.0 - Virtuelle Realität und Multimedia
Transcription
3D-Scan 2.0 - Virtuelle Realität und Multimedia
Technische Universität Bergakademie Freiberg Fakultät für Mathematik und Informatik Institut für Informatik Lehrstuhl für virtuelle Realität und Multimedia Wissenschaftliche Visualisierung 3D-Scan 2.0 Martin Reinhardt Steffen Dach Martin Backasch Christian Schlegel Tobias Schröder 15. September 2011 Betreuer/1. Korrektor: Prof. B. Jung 2. Korrektor: Dr. Ben Amor 2 Die von den Firmen Microsoft und PrimeSense entwickelte Hardware Kinect ist eine Sensorleiste bestehend aus einer Tiefensensor-Kamera, einer Farbkamera und einem 3D-Mikrofon. Sie ist in Deutschland seid dem 10. November erhältlich und wurde weltweit über 10 Millionen mal verkauft. Bereits wenige Tage nach der Veröffentlichung gab es erste Projekte, welche die Nutzung am PC unter Verwendung verschiedener Betriebssysteme ermöglichte. An der TU Bergakademie Freiberg wurde am Institut für Informatik im Sommersemester 2011 das Projekt „3D-Scan 2.0“ gestartet. Ziel ist es dabei, mit Hilfe dieser speziellen Hardware Objekte zu scannen und das Ergebnis als Punktwolke oder als Gittermodel zu speichern. In dieser Dokumentation sollen die Hardware und alle für die Software relevanten Algorithmen vorgestellt und erklärt werden. Reinhardt/Dach/Backasch/Schlegel/Schröder: 3D-Scan 2.0 3 Inhaltsverzeichnis Inhaltsverzeichnis 1. Hardware 1.1. Die Kinect Senorleiste . . . . . . . . . . . . . . . . . . . . . . . . 1.2. Scan-Tablet und Scan-Frame . . . . . . . . . . . . . . . . . . . . 1.3. Netzteil . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 4 5 6 2. Kalibrierung 2.1. Grund der Kalibrierung . . . . . . . . . . . . . . . . . . . . . . . 2.2. praktische Realisierung . . . . . . . . . . . . . . . . . . . . . . . 7 7 7 3. Poisson Surface Reconstruction 3.1. Funktionsweise . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2. Parameter der PSR . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3. Beispiel verschiedener Parameter . . . . . . . . . . . . . . . . . . 9 9 10 11 4. Applikationen für Tests 4.1. Applikationsstarter . . . . . . . . . . . . . . . . 4.2. OpenSceneGraph Testprogramm . . . . . . . . 4.3. Kinect Testprogramm . . . . . . . . . . . . . . 4.4. Standard Testprogramm . . . . . . . . . . . . . 4.5. Benchmark der Poisson-Surface-Reconstruction 4.6. Poisson-Surface-Reconstruction Testprogramm . 4.7. Mesh-Färbung Testprogramm . . . . . . . . . . . . . . . . . 14 14 14 14 15 16 17 19 5. Scannen einer markierten Szene 5.1. Parameter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2. Benutzung und Ansicht . . . . . . . . . . . . . . . . . . . . . . . 5.3. genauer Programmablauf . . . . . . . . . . . . . . . . . . . . . . 20 20 20 21 6. Generierung eines Modells 24 A. genaue Hardwarespezifikationen 28 B. mathematische Beschreibung der Kalibrierung B.1. Das Lochkameramodell . . . . . . . . . . . B.2. Geometrie des Modells . . . . . . . . . . . B.3. Mapping zwischen Farb- und Tiefenwerten B.4. Grenzen und Probleme des Modells . . . . Literatur Reinhardt/Dach/Backasch/Schlegel/Schröder: 3D-Scan 2.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 30 30 32 33 34 4 1. Hardware 1. Hardware Die Grundlage für das gesamte 3D-Scan-Projekt bildet die zur Verfügung gestellte Hardware. Natürlich steht die Microsoft Kinect dabei im Mittelpunkt, jedoch sind auch andere Hilfsmittel sehr wichtig, um einen erfolgreichen qualitativ hochwertigen Scan zu realisieren. 1.1. Die Kinect Senorleiste Die Microsoft Kinect wurde in Zusammenarbeit mit dem Videospiel-Entwickler Rare Ltd. und der israelischen Firma PrimeSense entwickelt. Die Sensorleiste besteht aus einer RGB-Kamera, einem Infarot-Sensor, einem Infarot-Projektor und einem 3D-Mikrofon (multi-microphone-array). Abb. 1: Aufbau der Kinect Sensorleiste Für die Datenübertragung wird ein spezieller proprietärer Microsoft-zertifizierter USB-Port genutzt, welcher neben dem USB 2.0 Standard zusätzlichen Strom (12 Volt bei 1.08 Ampere) liefert. Ein mitgelieferter Adapter mit Netzteil stellt hierbei eine Lösung zum Anschluss an einen standardisierten USB 2.0 Port (Typ-A) bereit. Die Sensorleiste hat einen motorisierten Standfuß, mit welcher die Sensorleiste um jeweils 27◦ auf- und abgeneigt werden kann. Mit Hilfe der originalen Microsoft-Xbox-Software wird eine praktische Nutzweite von 1.2-3.5m erreicht, andererseits wurde bereits erfolgreiche Trackingsoftware im Bereich 0.7-6m getestet. Die in der Kinect verbaute RGB-Kamera nutzt zur Bilderzeugung einen BayerSensor, mit Hilfe dessen verschiedene Streams erzeugt werden. Dabei werden Reinhardt/Dach/Backasch/Schlegel/Schröder: 3D-Scan 2.0 1.2. Scan-Tablet und Scan-Frame 5 Abb. 2: Funktionsweise des Infarot-Systems die Auflösungen 640x480 und 1280x1024 bei jeweils 8, 16 und 24 bit unterstützt. Der Tiefenbildsensor wird bei 640x480, 11 bit betrieben, was 2048 unterschiedliche Tiefenwerte ermöglicht. Diese Infarot-Kamera empfängt die Strahlen, welche von dem Infarot-Projektor ausgestrahlt und an den Oberflächen reflektiert werden. Gemeinsam bilden die Kameras einen VGA-Stream (640x480), welcher neben den Farbwerten nun auch die Tiefeninformationen enthält. Dies nennt man RGBD (D: depth). Durch die Nebeneinanderanordnung der beiden Kameras und der verschiedenen Linsenbreiten und -dicken entstehen jedoch verschiedene Bilder, welche man nicht einfach übereinanderlegen kann. Darum ist eine Kalibrierung der Kinect nötig. Eine genaue Spezifikation der verbauten Hardware ist im Kapitel „genaue Hardwarespezifikationen“ auf Seite 28 aufgelistet. 1.2. Scan-Tablet und Scan-Frame Das Scan-Tablet ist eine Unterlage, mit dessen Hilfe Objekte in ausreichender Genauigkeit gescannt werden können. Dies wird durch die optimale quadratische Marker-Anordnung in den Ecken ermöglicht. Auf der Unterseite ist ein Checkerboard angebracht, mit welchem eine einwandfreie Kalibrierung durchgeführt werden kann. Außerdem gibt es noch eine optionale Drehunterlage. Durch Benutzung dieser verändert sich die Belichtung des Objektes während des Scannens nicht, was ein besseres Ergebnis zur Folge hat. Ein weiteres Hilfsmittel für den Scanvorgang ist der Scan-Frame. Bei fest installierten oder sehr schweren Objekten ist es oft nicht möglich, ein Scan-Tablet zu nutzen. Dennoch werden die Marker für die Kamerafindung innerhalb des 3D- Reinhardt/Dach/Backasch/Schlegel/Schröder: 3D-Scan 2.0 6 1.3. Netzteil Raumes benötigt, welche bestimmten Positionierungsvoraussetzungen unterliegen. Durch die Nutzung des Rahmens kann man diese Marker dennoch perfekt platzieren, um sehr gute Scanergebnisse zu erzielen. Alle Scan-Utensilien sind aus Holz gefertigt, damit beispielsweise schwere Gegenstände auf dem Tablet platziert werden können. Beim Scan-Frame sind die Streben doppelt geschient, was eine hohe Robustheit zur Folge hat. Abb. 3: Scan-Tablet mit Markern Abb. 4: Scan-Frame mit Markern 1.3. Netzteil Aufgrund der besonderen Bedürfnisse an Spannung und Strom, ist die Kinect nicht für den Einsatz im freien geeignet. Ein selbstgebautes modifiziertes Netzteil kann dies jedoch ermöglichen, indem mit Hilfe von 10 Mignon-Akkuzellen wird eine unterbrechungsfreie Spannungsversorgung garantiert wird. Somit ist es möglich, Objekte auch außerhalb der Steckdosenreichweite einzuscannen. Abb. 5: spezieller Kinect-Konnektor Abb. 6: Adapter mit Akku-Paket Reinhardt/Dach/Backasch/Schlegel/Schröder: 3D-Scan 2.0 2. Kalibrierung 7 2. Kalibrierung 2.1. Grund der Kalibrierung Die Microsoft Kinect arbeitet mit zwei Kameras, der Farbkamera und der Infarotkamera, um einen RGBD-Stream aufzubauen. Da die verbauten Linsen nicht perfekt im mathematischen Sinne sind, kommt es zu Verzerrungen, welche es auszugleichen gilt. Zudem sind die Kameras asymmetrisch zueinander angebracht, wodurch zwei verschiedene Sichtfelder entstehen. Um eine hochwertige Punktwolke zu erzeugen, müssen beide Kamerabilder entzerrt und vereint werden. Die theoretischen Hintergründe können im Kapitel „mathematische Beschreibung der Kalibrierung“ auf Seite 30 nachgelesen werden. 2.2. praktische Realisierung Die zur Kalibrierung notwendigen Matrixeinträge können mit Hilfe der Software „RGBDemo“ von Nicolas Burrus ermittelt werden, welche zur Zeit in der Version 0.6 vorliegt. Dazu wird lediglich ein sogenanntes Checkerboard benötigt (siehe Abb. 7), welches sich auf der Rückseite der Scan-Tablets befindet. Die Kalibrierungsdaten werden in <SN>.yml Dateien gespeichert, wobei <SN> für die Seriennummer der benutzten Kinect steht, damit beim Nutzen der Applikation gleich die richtigen Daten benutzt werden können. Das Ergebnis der genutzten Daten ist eine Übereinstimmung der Farbwerte auf die richtigen Punkte in der Wolke (Vergleich der Abbildungen 8 und 9). Nur durch diese Kalibrierung ist es möglich, Farbwerte korrekt auf ein Mesh zu übertragen oder auch nur die Punktwolke an den richtigen Werten zu färben. Reinhardt/Dach/Backasch/Schlegel/Schröder: 3D-Scan 2.0 8 2.2. praktische Realisierung Abb. 7: Checkerboard beim Kalibrierungsvorgang Abb. 8: Punktwolke, unkalibriert Abb. 9: Punktwolke, kalibriert Reinhardt/Dach/Backasch/Schlegel/Schröder: 3D-Scan 2.0 9 3. Poisson Surface Reconstruction 3. Poisson Surface Reconstruction Die Poisson Surface Reconstruction (kurz: PSR) stellt den Mittelpunkt der Meshgenerierung dar, da so ein „wassserdichtes“ und glattes Gitter erzeugt werden kann. Sie wurde erstmals von Michael Kazhdan eingeführt und findet Anwendung in der Punktwolke-Software Meshlab. Mit Hilfe einer wrapper-Klasse kann der Kazhdan-Code direkt auf die Punktwolken der gescannten Objekte angewendet werden. Genaue Beschreibungen und Vorgehensweisen sind in der Literatur bei [Bou], [Kaza], [Kazb], [Kazc] sowie [New06] zu finden. 3.1. Funktionsweise Für den reibungslosen Ablauf der PSR benötigt man neben der Punktwolke auch alle Normalen an den Punkten. Unter Voraussetzung, dass diese Punkte die Fläche des Objektes begrenzen, kann eine isosurface aus dem Normalenfeld bestimmt werden. Diese isosurface steht mit dem Gradienten der Indikatorfunktion in Relation, wodurch die begrenzte Fläche beschrieben werden kann. Dieses Problem der Lösungsfindung nennt man Poisson-Problem. Abbildung 10 gibt dafür einen skizzenartigen Eindruck der Vorgehensweise des PSR an einer zweidimensionalen Fläche. Zuerst wird mit Hilfe des Normalenfeldes der Punktwolke der Gradient der Indikatorfunktion berechnet. Nun kann aus diesem Gradienten die Indikatorfunktion, welche überall innerhalb der Fläche den Wert 1 besitzt, abgeleitet werden, welche die Fläche beschreibt. Diese Extraktion der Fläche wird mit dem marching cubes Algorithmus realisiert, welcher mit der octree Datenstruktur arbeitet (siehe Abbildung 11). Dieser Algorithmus zerlegt die Punktwolke in ein Voxelgitter und entscheidet, welche Punkte die isosurface des Objektes definieren. Die Schnittpunkte der isosurface mit den Kanten der Voxel generieren nun eine Triangulierung, wodurch ein 3D-Gittermodell entsteht. Abb. 10: Ablauf einer PSR Reinhardt/Dach/Backasch/Schlegel/Schröder: 3D-Scan 2.0 10 3.2. Parameter der PSR Abb. 11: marching cubes Algorithmus 3.2. Parameter der PSR Um die Qualität und Geschwindigkeit der PSR zu regulieren, existieren viele einstellbare Parameter: Depth: Tiefe des octree-Baumes, welcher die Genauigkeit steuert. (default:8) SolverDivide: Tiefe des Blockes, in welchem die Laplace-Gleichung gelöst wird. (default:8) IsoDivide: Tiefe des Blockes, in welchem die Triangulierung durchgeführt wird. (default:8) SamplesPerNode: Anzahl der Punkte in einem Endknoten des Octrees, welche zusammenfallen. Damit wird die Anzahl der Vertices im Modell reduziert. (unverrauschte Daten: [1.0, 5.0], verrauschte Daten: [15.0, 20.0]) Scale: Verhältnis zwischen dem Durchmesser des Würfels der für die Rekonstruktion verwendet wird und dem Durchmesser der Bounding Box des Samples. (default: 1.25) Offset: Werte kleiner eins ziehen die rekonstruierte Oberfläche zum Zentrum hin, während Werte größer eins die Oberflächen nach außen drücken. (default: 1) Confidence: bei TRUE wird die Länge der Normalen als Konfidenzinformation genutzt während bei FALSE die Normalen normalisiert werden damit alle die gleiche Länge für die Rekonstruktion haben. Reinhardt/Dach/Backasch/Schlegel/Schröder: 3D-Scan 2.0 11 3.3. Beispiel verschiedener Parameter Abb. 12: ursprüngliche Punktwolke 3.3. Beispiel verschiedener Parameter Am Beispiel der Models des sogenannten „CrokToy“ (Abbildung 12) sollen nun verschiedene Parameterwahlen vorgestellt werden. Zuerst soll „Depth“ auf 6 erniedrigt werden, was ein Modell mit wenig Detailgrad, aber glatten Oberflächen zur Folge hat. Mit dem Wert 6 ist nach vielen Versuchen ein akzeptabler Mittelwert zwischen Rechenzeit und Detailgrad bestimmt wurden (siehe Abbildungen 13 und 14). Abb. 13: Depth: 8, SpN: 1, Offset: 1 – Vertices: 24899 Faces: 49794 Abb. 14: Depth: 6, SpN: 1, Offset: 1 – Vertices: 6275, Faces: 12546 Mit Hilfe des Wertes „SamplesPerNode“ kann das Modell ebenfalls sehr gut ge- Reinhardt/Dach/Backasch/Schlegel/Schröder: 3D-Scan 2.0 12 3.3. Beispiel verschiedener Parameter glättet werden (siehe Abbildungen 15, 16, 17 und 18). Aufgrund der verrauschten Daten der Kinect, ist hier ein Wert zwischen 15 und 20 empfehlenswert. Abb. 15: Depth: 6, SpN: 1, Offset: 1 – Vertices: 6275, Faces: 12546 Abb. 16: Depth: 6, SpN: 5, Offset: 1 – Vertices: 6322, Faces: 12640 Abb. 17: Depth: 6, SpN: 15, Offset: 1 – Vertices: 5833, Faces: 11662 Abb. 18: Depth: 6, SpN: 20, Offset: 1 – Vertices: 5258, Faces: 10512 Mit dem „Offset“-Wert können die Flächen vom Zentrum des Objektes wegbewegt oder angenähert werden (Abbildungen 19, 20 und 21). Der beste Wert wurde hier mit 1 ermittelt. Reinhardt/Dach/Backasch/Schlegel/Schröder: 3D-Scan 2.0 13 3.3. Beispiel verschiedener Parameter Abb. 19: Depth: 6, SpN: 5, Offset: 1 – Vertices: 6322, Faces: 12640 Abb. 20: Depth: 6, SpN: 1, Offset: 1.5 – Vertices: 6268, Faces: 12532 Abb. 21: Depth: 6, SpN: 5, Offset: 0.5 – Vertices: 6684, Faces: 13341 Reinhardt/Dach/Backasch/Schlegel/Schröder: 3D-Scan 2.0 4. Applikationen für Tests 14 4. Applikationen für Tests Das System scivi besitzt neben der Anwendung Scan verschiedene Applikationen zum Testen von OpenSceneGraph (OSG), der Kinect und der Poissonrekonstruktion. Diese sind: • PoissonBench • testColor • testKinect • testOsg • testPoisson • test 4.1. Applikationsstarter Im Grunde handelt es sich bei dem Framework um einen Starter für Anwendungen, welche scivi mit Hilfe der Klasse ArgumentParser als Kommandozeilenargument übergeben wird. Das Interface IApplication stellt die dafür notwendigen Funktionen für den Start und für korrekte Kommandozeilenausgaben bereit. Gültige Anwendungen müssen daher nur das Interface implementieren und in den Starter eingetragen werden. Bei Aufruf ohne Argument werden die möglichen Programme vorgestellt (Kommandozeilenausgabe 1) 4.2. OpenSceneGraph Testprogramm Das Programm testOsg (Abbildung 22) stellt einen Funktionstest für OSG und vor allem für den in Scan verwendeten CompositeViewer mit zwei Views bereit. Es ist damit ein Prototyp für die graphische Oberfläche der Hauptapplikation. 4.3. Kinect Testprogramm Die Anwendung testKinect (Kommandozeilenausgabe 2) ist ein Test zum Auslesen der Seriennummer der angeschlossenen Kinect und zum Anzeigen aller unterstützten Videoformate beider verbauten Kameras. Eine graphische Oberfläche ist zwar nicht vorhanden, aber auch nicht zwangsläufig nötig. Reinhardt/Dach/Backasch/Schlegel/Schröder: 3D-Scan 2.0 4.4. Standard Testprogramm 15 Kommandozeilenausgabe 1 Start ohne spezifische Anwendung $ ./scivi Usage: ./scivi option [suboption] [arguments] Options: -PoissonBench Creating lots of example meshes with different poisson reconstruction parameters. -generate Run the application for generating a model. -ds <duplicate_space> max distance between duplicates -nc <neighbor_count> neighbor countfor normal calculation -nf flip normals after calculation -ptd <tree_depth> octree depth for poisson reconstruction -psd <solver_divide> solver divide for poisson reconstruction -psc <sample_count> sample_count for poisson reconstruction -pid <iso_divide> iso_divide for poisson reconstruction -pcn no confidence for poisson reconstruction -pr <refine> refine for poisson reconstruction -po <offset> offset for poisson reconstruction -cnc <neighbor_count> neighbor count for color mapping -cf fast color mapping -in <file> input point cloud -out <file> output colored mesh -scan Run the application for scanning a marked scene. -tablet bounding box values for scan tablet -frame bounding box values for scan frame -footprint save footprint to .gle-files (experimental) -test Run the standard test application. -testColor Run the mesh colorizing test application. -testKinect Run the Kinect test application. -testOsg Run the OpenSceneGraph test application. -testPoisson Run the Poisson-Surface-Reconstruction test application. 4.4. Standard Testprogramm Die Anwendung test (Abbildung 23) stellt einen professionellen Viewer der Kinect dar. Auf der linken Seite kann der Kinect-Stream mit den Schaltflächen „STILL“ und „LIVE“ gesteuert werden. Direkt darunter befindet sich der Button für die Darstellung im Fenster („VISIBLE“ und „HIDDEN“). Mit den Kontrollschaltern, welche sich am oberen bzw. unterem Rand befinden, kann der Neigungsmotor direkt angesteuert werden. Auf der rechten Seite befinden sich die Buttons für die Farbgebung der dargestellten Punktwolke. Dabei werden entweder die Farben Reinhardt/Dach/Backasch/Schlegel/Schröder: 3D-Scan 2.0 4.5. Benchmark der Poisson-Surface-Reconstruction 16 Abb. 22: Die Anwendung testOsg aus dem RGB Bild auf das Tiefenbild gemappt oder eine Farbcodierung genutzt, welche die Tiefenwerte darstellen (In Abb. 23 wird die Farbcodierung genutzt). Bei dem genutzten Mapping werden natürlich, bei Vorhandensein einer passenden .yml Datei, die Daten kalibriert, was durch Anzeige einer Seriennummer am unteren Rand verdeutlicht wird. Zusätzlich besteht bei dieser Anwendung die Möglichkeit, den aktuellen Frame als .ply oder .pgm zu speichern, um ihn in alternativen Anzeigeprogrammen zu analysieren. Es gibt auch erste Versuche, ein passendes Mesh zu generieren; jedoch werden hier keine speziellen Techniken wie in anderen dafür vorgesehenen Programmen verwendet. Durch diesen gesamten Funktionsumfang wird ein erstes größeres Testprogramm vorgestellt, mit welchem die Kinect sehr professionell gesteuert und ausgelesen werden kann 4.5. Benchmark der Poisson-Surface-Reconstruction Mit Hilfe der Anwendung PoissonBench werden zu einem Modell, welches im Quelltext festgelegt ist, Rekonstruktionen mit vielen verschiedenen Parametereinstellungen durchgeführt. Somit dient sie zum Finden optimaler Poisson-Parameter für bestimmte Modelle. Aufgrund der vielen Möglichkeiten und der vielen Berechnungen kann es bei diesem Aufruf zu einer längeren Rechenzeit führen. Reinhardt/Dach/Backasch/Schlegel/Schröder: 3D-Scan 2.0 4.6. Poisson-Surface-Reconstruction Testprogramm 17 Kommandozeilenausgabe 2 Ausgabe der Anwendung testKinect $ ./scivi -testKinect ###################################################################### # TU BERGAKADEMIE FREIBERG # Scientific Visualization Workshop 2011 # # Serial: <SN> # # Supported Kinect Video Modes # 0: 1280 x 1024 @ 24 + 0 (decompressed) # 1: 640 x 480 @ 24 + 0 (decompressed) # 2: 1280 x 1024 @ 8 + 0 (bayer compressed) # 3: 640 x 480 @ 8 + 0 (bayer compressed) # 4: 1280 x 1024 @ 8 + 0 (8-bit IR) # 5: 640 x 480 @ 8 + 0 (8-bit IR) # 6: 1280 x 1024 @ 10 + 6 (10-bit IR) # 7: 640 x 480 @ 10 + 6 (10-bit IR) # 8: 1280 x 1024 @ 10 + 0 (10-bit packed IR) # 9: 640 x 480 @ 10 + 0 (10-bit packed IR) # 10: 640 x 480 @ 24 + 0 (YUV RGB) # 11: 640 x 480 @ 16 + 0 (YUV RAW) # Supported Kinect Depth Modes # 0: 640 x 480 @ 11 + 5 (11-bit within uint16_t) # 1: 640 x 480 @ 10 + 6 (10-bit within uint16_t) # 2: 640 x 480 @ 11 + 0 (11-bit packed) # 3: 640 x 480 @ 10 + 0 (10-bit packed) # ###################################################################### 4.6. Poisson-Surface-Reconstruction Testprogramm Durch Aufruf der Anwendung testPoisson wird die Poisson-Surface-Reconstruction (PSR) auf eine gegebene Punktwolke angewendet, um ein Modellgitter zu erhalten. Nachdem die Punktwolke geladen und in entsprechende Arrays gespeichert wurden, wird die sogenannte Bounding Box berechnet. Ein Algorithmus, dessen Ziel es ist, Duplikate zu entfernen, gehört zum ersten wichtigen Schritt, um ein qualitativ hochwertiges Gittermodell zu erzeugen. 1. Der erste Originalpunkt aus dem Array wird als Referenzpunkt betrachtet 2. Nun werden alle Originalpunkte betrachtet, welche innerhalb einer festge- Reinhardt/Dach/Backasch/Schlegel/Schröder: 3D-Scan 2.0 4.6. Poisson-Surface-Reconstruction Testprogramm 18 Abb. 23: Die Standard Testanwendung legten Umgebung des Referenzpunktes liegen (- Umgebung). Ein Mittelpunkt wird über alle Positionen der Originalpunkte aus der - Umgebung berechnet und am Ende des Arrays gespeichert. 3. Nun werden die im letzten Schritt betrachteten Originalpunkte aus dem Array gelöscht. 4. Der nächste Originalpunkt wird Referenzpunkt, wodurch ein iterativer Prozess entsteht, bis alle Originalpunkte aus dem Array gelöscht wurden. Nach dieser Ausdünnung der Punktwolke werden die Normalen an jedem Punkt mit dem Voxel-Grid Filter und dem RANSAC-Algorithmus bestimmt. Dazu wird zuerst die Bounding Box in ein Voxelgitter zerlegt. Die resultierenden Voxel werden jetzt mit Hilfe des bekannten RANSAC-Algorithmus mit einer Normalen einer Ebene versehen: 1. es werden zufällig drei Punkte aus dem Voxel herausgegriffen mit denen eine Ebene aufgespannt wird 2. Innerhalb des Voxels werden nun alle Punkte bestimmt, die innerhalb einer Fehlerschranke um die Ebene positioniert sind. Diese bilden das Consensus set, woraus sich eine Fehlersumme berechnen lässt. Reinhardt/Dach/Backasch/Schlegel/Schröder: 3D-Scan 2.0 4.7. Mesh-Färbung Testprogramm 19 3. Evaluiere das Ergebnis und übernehme es, falls: • Das Consensus set enthält mehr Punkte als ein Vorhergehendes • Das Consensus set enthält genauso viele Punkte wie ein Vorhergehendes, aber die Fehlersumme ist geringer Der Algorithmus wird so lange wiederholt, bis entweder ein Modell mit der Fehlersumme 0 gefunden wird, oder eine Iterationsschranke erreicht ist. Nach der Bestimmung der Normalen in jedem Punkt ist es nun möglich, mit den vorgegebenen Parametern eine PSR durchzuführen. Das resultierende Mesh wird im Anschluss im Format .osg gespeichert. 4.7. Mesh-Färbung Testprogramm Mit Hilfe der Anwendung testColor ist es möglich, Farben aus der aufgenommenen Punktwolke auf das generierte Gitter zu projizieren. Dazu ruft man das Programm mit den Argumenten • Pfad zur Punktwolke • Pfad zum zugehörigem Mesh • Pfad zur Ausgabedatei des eingefärbten Mesh auf.Der erste Schritt ist das Speichern der Punktpositionen und Farbwerte aus den Dateien in Arrays. Mit Hilfe des folgenden Algorithmus ist es dann möglich, die Farbwerte auf die richtigen Punkte im Mesh zu mappen: 1. Der erste Punkt aus dem Array der Meshpunkte wird als Referenzpunkt betrachtet. 2. Für diesen Referenzpunkt sucht man nun aus der gefärbten Punktwolke den Punkt mit dem geringsten Abstand. 3. Die Farbinformationen des Punktes mit dem geringsten Abstand wird nun auf den Referenzpunkt übertragen. 4. Der Algorithmus wählt nun den nächsten Punkt aus dem Array der Meshpunkte als Referenzpunkt und fährt iterativ so lange fort, bis das gesamte Mesh eingefärbt ist. Das resultierende gefärbte Mesh wird nun im .osg gespeichert. Reinhardt/Dach/Backasch/Schlegel/Schröder: 3D-Scan 2.0 5. Scannen einer markierten Szene 20 5. Scannen einer markierten Szene Die Applikation scan stellt als Anwendung das Herzstück des Projektes „3D Scan 2.0“ dar. Mit Hilfe dieser Anwendung ist es möglich, Objekte innerhalb einer festgelegten Umgebung dreidimensional einzuscannen. 5.1. Parameter Es gibt zwei verschiedene Arten, einen Bereich einzugrenzen, innerhalb dessen gescannt wird: • ./scivi -scan -tablet Nutzung des Scan-Tablet als markierten Bereich • ./scivi -scan -frame Nutzung des Scan-Frame als markierten Bereich Zusätzlich steht die Option -footprint zur Verfügung, welche eine noch experimentelle Anwendung zur Ermittlung des Grundrisses darstellt. 5.2. Benutzung und Ansicht Bei Start der Applikation erkennt man sogleich eine zweigeteilte Ansicht (Abbildung 24): • Links: Dieser View zeigt eine Kameraansicht der Kinect. Hier werden auf den erkannten Markern rote Kugeln angezeigt. • Rechts: Hier wird die entwickelte Punktwolke angezeigt. Man kann die Ansicht hier beliebig rotieren und transformieren. Falls drei Marker erfolgreich erkannt wurden, wird hier auch der aktuelle Ausschnitt der Boundingbox live angezeigt. Nachdem das Objekt innerhalb der Marker platziert wurde, beginnt man, mit der Kinect das 3D Modell zu fokussieren und, falls 3 Marker gefunden wurden, den aktuellen Ausschnitt der Kamera zur Punktwolke hinzuzufügen. Danach wiederholt man den Vorgang von einer anderen Position aus. Verschiedene Tests mit verschiedenen Objekten ergaben, dass eine sinnvolle Mesh-Rekonstruktion keinesfalls viele Scans benötigt. Es ist eher so, dass schon 4 Aufnahmen reichen. Nachdem man mit dem Ergebnis in der rechten Anzeige zufrieden ist, kann man die aktuelle Punktwolke als .ply-Datei speichern. Sie ist dann unter ./Data/PointClouds/New/ zu finden. Folgende Eingaben sind während des Scannens zulässig: • ’c’ speichert den aktuellen Ausschnitt der Kinect in die Punktwolke, falls 3 Marker erkannt sind. Reinhardt/Dach/Backasch/Schlegel/Schröder: 3D-Scan 2.0 5.3. genauer Programmablauf 21 Abb. 24: Die Scan-Anwendung mit der zweigeteilten Ansicht • ’entf’ löscht die Punktwolke • ’p’ speichert die aktuelle Punktwolke als .ply-Datei unter ./Data/PointClouds/New/. 5.3. genauer Programmablauf 5.3.1. Scanablauf Nach dem Start der Anwendung werden die 3D-Punkte wie schon bei der Testapplikation kalibriert (siehe Kapietel B) und Dargestellt. Die Zuordnung der 3DPunkte auf 2D-Koordinaten werden dabei zwischengespeichert (in der sogenannten Zuordnungsliste). Nach diesem Schritt folgt die Erkennung der Marker mit Hilfe des ARToolKit im RGB-Bild. Mit Hilfe der Zuordnungsliste existiert die Möglichkeit, die Punkte in den 3D-Raum zu interpolieren 1 .Falls drei Marker von der Anwendung korrekt erkannt wurden, ist das Aufnehmen einer Szene möglich. Die beiden Fenster werden nach der Entscheidung aktualisiert, indem der osgViewer der Kameraansicht (WorldView) die Listen übergeben bekommt und die rechte Ansicht (ModelView) alle bisher aufgenommenen Punkte anzeigt. Falls das Aufnehmen einer Szene möglich wäre, wird zusätzlich die aktuelle Punktwolke dargestellt. 1 In der Zuordnungsliste werden alle Nachbarpunkte mit dem Abstand kleiner eins gesucht und mit einem Gewicht gespeichert. So können die 3D-Punkte der Marker durch gewichtete Interpolation bestimmt werden. Reinhardt/Dach/Backasch/Schlegel/Schröder: 3D-Scan 2.0 5.3. genauer Programmablauf 22 Ein korrekte Ausrichtung der Punkte im ModelView bei mindestens 3 Markern ist möglich, indem sie in das Objektkoordinatensystem transformiert werden. Durch Mittlung der diagonalen Strecke zweier Marker wird der Ursprung des Koordinatensystems ermittelt. Nun werden aus den Markerpositionen die aufspannenden Vektoren für das Koordinatensystem berechnet2 . Aufgrund einer eindeutigen Identifizierung der Marker ist es möglich, das Koordinatensystem auch eindeutig auszurichten. Alle rekonstruierten Punkte werden nun mit Hilfe einer Verschiebung mit anschließender senkrechter Projektion in das Objektkoordinatensystem transformiert. Nach einem kurzen Test, ob der Punkt in der Bounding-Box liegt, wird der Punkt je nach Einstellung der Speicherung entweder in die Liste der permanenten Punkte aufgenommen oder in das Live-Bild integriert. Nach diesem Schritt wird das ModellView aktualisiert, um so den aktuellen Stand der Punktwolke darzustellen. Falls die Taste ’p’ gedrückt und somit das speichern aktiviert wurde, kopiert das Programm den aktuellen Stand der permanenten Punktwolke in eine .ply Datei unter ./Data/PointClouds/New/. Diese kann dann mit externer Software (z.B. Meshlab) oder anderen Applikationen (z.B. generate) betrachtet und bearbeitet werden. 5.3.2. Die Option footprint Um einen Grundriss zu erzeugen, sind mehrere aufeinanderfolgende Schritte nötig. Zuerst wird mit einem Schwellwert von 0.002 (2mm) jeder Punkt nahe der Bodenfläche auf eine 2D-Ebene projiziert. Nachdem Punkte mit sehr geringem Abstand zusammengefasst wurden, wird eine Distanzmatrix aufgestellt, welche man für die Implementierung von α-Shapes benötigt. Dabei werden immer zwei Punkte betrachtet, deren Abstand kleiner ist, als ein festgelegter Wert (α-Wert). Im Anschluss wird durch beide Punkte ein Kreis mit dem Radius α2 gelegt, welcher mit Hilfe der Strecke zwischen beiden Punkten zweigeteilt wird. Falls nun im größeren Kreisabschnitt keine weiteren Punkte zu finden sind, handelt es sich um eine Außenkante. Die gefunden Kanten werden jetzt in Cluster sortiert, indem rekursiv nach zusammenhängenden Kanten gesucht wird. Diese Zuordnung zu einem Cluster wird mit Hilfe einer Clusternummer in der Kanten-Datenstruktur angegeben. Alle Punkte, welche zu einem Cluster gehören, werden jetzt in Felder gespeichert. Der nächste Schritt ist es, die konvexe Hülle eines jeden Clusters zu bestimmen. Der dafür verwendete Algorithmus entspricht dem der α-shapes, nur dass in 2 Zuerst werden mit den gegebenen Vektoren die Grundfläche berechnet und danach über das Kreuzprodukt ein dazu senkrechter Vektor. Reinhardt/Dach/Backasch/Schlegel/Schröder: 3D-Scan 2.0 5.3. genauer Programmablauf 23 diesem Fall α als unendlich angenommen wird3 . Dadurch können nur konvexe Fußabdrücke realisiert werden. Durch die Umwandlung der konvexen Hülle in die konkave Hülle können jedoch auch nichtkonvexe Fußabdrücke erkannt werden. Dabei wird eine Kante durch zwei neue zu ersetzten, indem naheliegende, innere Punkte verwendet werden. Im Falle der Option footprint werden beim Drücken der Taste ’p’ die Dateien • alpha_shape.gle zeigt α-Shape des Grundrisses • convex_hull.gle zeigt konvexe Hülle des Grundrisses • concave_hull.gle zeigt konkave Hülle des Grundrisses im Verzeichnis ./Data/Footprints/ gespeichert, welche mit Hilfe der „Graphics Layout Engine“ übersetzt und betrachtet werden können. 3 Das heißt, man sucht Geraden zwischen zwei Punkten, wobei alle restlichen Punkte auf der selben Seite der Gerade befinden sollen. Reinhardt/Dach/Backasch/Schlegel/Schröder: 3D-Scan 2.0 6. Generierung eines Modells 24 6. Generierung eines Modells Die Anwendung generate stellt ein automatisiertes System dar, um aus Punktwolken, welche über den Scanprozess entstanden sind, farbige Gittermodelle im .osg-Format zu erstellen. Der Programmablauf kann dabei in vier wesentliche Schritte zusammengefasst werden: 1. Entfernung von Duplikaten 2. Berechnung der Normalen 3. Poisson Surface Reconstruction 4. Colorierung des Gittermodells Mit Hilfe des Algorithmus, welcher schon in der testPoisson vorgestellt wurde, werden innerhalb dieser Applikation zuerst Duplikate von Punkten gefunden und dann entfernt. Die benutzte -Umgebung arbeitet dabei mit dem Standartwert von 2mm beziehungsweise mit einem Wert, welcher über die Kommandozeile als Argument geliefert wird. Bei dem nun folgenden Schritt der Normalenberechnung bedient man sich der Visual and Computer Graphics Library (VCG Library). Diese ist eine Open Source Bibliothek, welche aus einer Zusammenarbeit zwischen dem Visual Computing Lab der ISTI und dem Italian National Research Council (CNR) enstanden ist. Sie basiert auf C++ Templates und bietet Algorithmen für das Verarbeiten von Dreiecks- bzw. Vierecksmeshes. Unter Anderem bietet diese Bibliothek einen Algorithmus zur Berechnung von Normalen, welcher in diesem Schritt seine Verwendung findet. Er nutzt dabei eine vorzugebende Anzahl von Nachbarn (Standard: 10 Nachbarn) und liefert als Ergebnis ein Array mit geglätteten Normalen. Der wesentliche Vorteil dieser Verbesserung besteht darin, dass die Normalen keine Ausreißer enthalten und somit das Gittermodell wesentlich „runder“ wirkt. Der dritte Schritt, in welchem die Poisson Surface Reconstruction genutzt wird, um ein Mesh zu erzeugen, wurde in seiner Funktionsweise aus Kapitel 3 übernommen. Alle Werte für die Rekonstruktion können über ein Kommandozeilenargument oder aber auch aus den Standartwerten übernommen werden. Somit können die Gittermodelle gezielt auf die gegebene Punktwolke abgestimmt werden. Für die Colorierung des Meshes steht neben dem bekannten Algorithmus aus der Testanwendung testColor, welcher mit der Option -cf genutzt wird, ein weiterer effektiver Algorithmus zur Verfügung. Hierbei erreicht man eine höhere Qualität, indem der Farbwert aus einer Anzahl von Nachbarpunkten berechnet wird (Option -cnc mit dem Standard 10). Somit können gezielt weichere Farbübergänge erzeugt werden. Reinhardt/Dach/Backasch/Schlegel/Schröder: 3D-Scan 2.0 6. Generierung eines Modells 25 In den Kommandozeilenausgaben 3 und 4 kann man die Funktionsweise aller Schritte sehr leicht am Beispiel der Punktwolke Data/PointClouds/FrogToy_2011_07_02_15_11_07_bin.ply nachvollziehen. Das fertige colorierte Modell ist in Abbildung 25 zu sehen. Abb. 25: Die automatisierte Meshgenerierung Reinhardt/Dach/Backasch/Schlegel/Schröder: 3D-Scan 2.0 6. Generierung eines Modells 26 Kommandozeilenausgabe 3 Meshgenerierung Teil 1 ################################################################ # TU BERGAKADEMIE FREIBERG # Scientific Visualization Workshop 2011 # # Loading input point cloud: # Successfully loaded data from file "Data/PointClouds/Frog[...] # Done. # Removing duplicated vertices: # Remaining vertex count: 196000 [...] # Remaining vertex count: 3000 # Remaining vertex count: 0 # Duplicate count: 144417 # Vertex count: 51886 # Done. # Calculating normals for point cloud: # Done. # Generating mesh from point cloud: # Set output filename to tmp ################################################################ # Starting Poisson Surface Reconstruction using Kazhdan’s Code # Saving to file tmp # Parameter Depth: 8 # Parameter SolverDivide: 6 # Parameter SamplesPerNode: 1 # Parameter IsoDivide: 8 # Parameter Refine: 3 # Parameter Scale: 1.25 # Parameter KernelDepth: -1 # Paremeter Offset: 1 # Parameter NoResetSamples: 0 # Parameter NoClipTree: 0 # Parameter Confidence: 1 Reinhardt/Dach/Backasch/Schlegel/Schröder: 3D-Scan 2.0 27 6. Generierung eines Modells Kommandozeilenausgabe 4 Meshgenerierung Teil 2 Samples: 51886 Setting sample weights Adding Points and Normals # Leaves/Nodes: 326775/373457 # Leaves/Nodes: 326915/373617 Depth: 1/8 Matrix entries: 36 / 8^2 = 56.2500% Got / Solved / Updated in: 0.000 / 0.000 / [...] Nodes[59/64]: 2192 Matrix entries: 90895 / 2192^2 = 1.8917% Got / Solved / Updated in: 0.000 / 0.000 / # IsoValue is -1651.069512 # IsoValue is -1651.069458 0.000 0.000 # Poisson Reconstruction done. # Saved to tmp # Done. # Loading generated mesh: # Successfully loaded data from file "tmp.ply" # Done. # Mapping color information: # Remaining vertex count: 52000 [...] # Remaining vertex count: 1000 # Done. Manipulator warning: eventTimeDelta = -4.5e-05 Manipulator warning: eventTimeDelta = -0.000226 # ################################################################ Reinhardt/Dach/Backasch/Schlegel/Schröder: 3D-Scan 2.0 A. genaue Hardwarespezifikationen A. genaue Hardwarespezifikationen Abb. 26: vollständige Hardware der Kinect • elektrischer Motor • 3 Mainboard Platinen • Arbeitsspeicher: Hynix 512Mb DDR2 SDRAM • Aktivkühler • Farbkamera • Infarotkamera • Infarotprojektor • 4 Mikrofone Reinhardt/Dach/Backasch/Schlegel/Schröder: 3D-Scan 2.0 28 A. genaue Hardwarespezifikationen • 4 Arten von Schrauben • 15 spezielle Chips, darunter: Wolfson Stereo ADC with microphone preamp Fairchild N-Channel PowerTrench MOSFET NEC USB 2.0 hub controller Camera interface controller Marvell SoC camera interface controller Analog Devices CMOS Rail-to-Rail Output Operational Amplifier TI 8-bit, 8-channel Sampling A/D converter Allegro low voltage stepper and single/dual motor driver ST 8Mbit NV flash memory PrimeSense image sensor processor Texas Instruments USB audio controller Kionix accelerometer Reinhardt/Dach/Backasch/Schlegel/Schröder: 3D-Scan 2.0 29 B. mathematische Beschreibung der Kalibrierung 30 B. mathematische Beschreibung der Kalibrierung B.1. Das Lochkameramodell Das Lochkamera-Model beschreibt die mathematischen Zusammenhänge zwischen einer 3D-Szene und der 2D-Repräsentation eines aufgenommenen Bildes. Da die Kalibrierung auf eine Transformation zwischen den beiden Räumen reduziert wird, steht die Bestimmung der inneren und äußeren Kameraparameter im Mittelpunkt. Abb. 27: Lochkamera, vereinfacht B.2. Geometrie des Modells Die Lochkamera obliegt einer sehr bestimmten Geometrie, dargestellt in Abb. 28. Die Blende der Kamera ist dabei ein Punkt im Ursprung O des dreidimensionalen orthogonalen Koordinatensystems. Die optische Achse wird mit X3 bezeichnet und die 2D Projektionsfläche (Bildfläche) ist eine Ebene, parallel zur X1 X2 -Ebene. Ihr Mittelpunkt O wird mit dem Abstand f in negativer Richtung der X3 -Achse auf Reinhardt/Dach/Backasch/Schlegel/Schröder: 3D-Scan 2.0 31 B.2. Geometrie des Modells Abb. 28: Lochkamera, Geometrie die Bildfläche verschoben, wo er das Bildzentrum R bildet. Ein Punkt P der 3DSzene wird dabei durch eine Gerade P O auf den Punkt Q abgebildet. Das resultierende Bild ist dabei einer Punktspiegelung unterzogen worden. Als Ausweg wird eine Anschauung einer virtuellen Bildfläche Q0 , aufgespannt durch Y1 und Y2 , betrachtet, in welcher die Bildkoordinaten richtig orientiert vorliegen (Siehe Abb. 29). Man kann den Strahlenverlauf auf zwei Dimensionen projizieren, in denen durch die optischen Strahlen ähnliche Dreiecke aufgebaut werden. Aus dieser Ähnlichkeit folgert f x1 y1 , f > 0, x3 > 0 (1) = y2 x3 x 2 Unter Verwendung homogener Koordinaten ist es möglich, die Gleichung mit Hilfe der Kameramatrix C auszudrücken: y ∼ Cx Reinhardt/Dach/Backasch/Schlegel/Schröder: 3D-Scan 2.0 (2) B.3. Mapping zwischen Farb- und Tiefenwerten 32 Abb. 29: Lochkamera, Geometrie mit y = (y1 , y2 , 1)T x = (x1 , x2 , x3 , 1)T fx1 0 cx1 0 C = 0 fx2 cx2 0 0 0 1 0 Um eine auszudrücken, nutzt man nun eine Transformations Kamerabewegung matrix R t , welche Translationen und Rotationen in sich vereint. Zusätzlich muss die Isometrie durch Multiplikation eines Skalierungsfaktors s ungleich null zur Gleichheit geführt werden, was zur endgültigen Beschreibung unseres Modells führt. x y1 fx1 0 cx1 0 r11 r12 r13 t1 1 x2 s · y2 = 0 fx2 cx2 0 · r21 r22 r23 t2 · (3) x3 1 0 0 1 0 r31 r32 r33 t3 1 Mithilfe der Daten über die Transformationsmatrix (äußere Merkmale) sowie den Daten über die Kameramatrix (innere Merkmale) kann das Modell szenenunabhängig angewendet werden. Diese Daten werden mit Hilfe der vorgestellten Software „RGBDemo“ ermittelt. B.3. Mapping zwischen Farb- und Tiefenwerten Um die Farbwerte korrekt auf die Tiefenwerte abzubilden, wird die reale Entfernung zur Kinect benötigt. Die Infarotkamera besitzt jedoch nicht die Fähigkeit, Reinhardt/Dach/Backasch/Schlegel/Schröder: 3D-Scan 2.0 B.4. Grenzen und Probleme des Modells 33 echte Distanzen (distance) zu ermitteln, sondern kann nur einen umskalierten Wert abgeben. Experimentelle Ausarbeitungen ergaben jedoch eine Möglichkeit, diese Werte (disparity) zurückskalieren zu können. distance = 1.0/(−0.00307110156374373 ∗ disparity + 3.33094951605675) (4) Folgender Algorithmus wird verwendet, um ein erfolgreiches Abbilden der unterschiedlichen Aufnahmen der Kameras auf einen gemeinsamen Raum zu realisieren: 1. rechne alle disparity-Werte in echte distance-Werte um 2. projiziere alle Punkte des 2D-Tiefenbildes in den 3D-Raum, indem die distanceWerte als Skalierungsfaktor s benutzt werden. −1 xdepth = Cdepth ∗ (s ∗ ydepth ) (5) 3. transformiere die 3D-Szene der Tiefenwerte auf die 3D-Szene der RGBWerte und projiziere das Ergebnis wieder in ein 2D-Bild, indem man wieder die distance-Werte als Skalierungsfaktor s benutzt. Crgb ∗ ( R t DepthT oRgb ∗ xdepth ) (6) yrgb = s Das Ergebnis ist ein Bild, in dem die Farbwerte und die Tiefenwerte der originalen Szene korrekt aufeinander gemappt sind und immer so genau sind, wie die Kalibrierung dies ermöglicht. B.4. Grenzen und Probleme des Modells Da die Tiefenbildkamera und die Farbkamera bei gleicher Auflösung verschiedene Sichtbereiche der selben 3D-Szene haben, können einige Punkte am Rand der Bilder nicht aufeinander abgebildet werden. Dadurch hat die resultierende Punktwolke eine geringere Auflösung als die ursprünglichen Bilder. Eine weitere Schwäche des Modells ist die Annahme eines Loches als Blende. Echte Linsen haben jedoch eine Verzerrung, was zur einer Störung im Bild führt, welche durch die Kameramatrix nicht ausgeglichen wird. Gerade bei dieser Modellschwäche können noch entscheidende Verbesserungen durchgeführt werden. Diese erhöhen jedoch den Rechenaufwand und könnten zur Verschlechterung der Performanz führen. Reinhardt/Dach/Backasch/Schlegel/Schröder: 3D-Scan 2.0 34 Literatur Literatur [Kin] Inside The Kinect Hardware. 5. Aug. 2011. URL: http : / / www . trueachievements.com/n2124/inside-the-kinect-hardware.htm. [Wika] Kinect. 5. Aug. 2011. URL : http://de.wikipedia.org/wiki/Kinect. [Wikb] Kinect. 5. Aug. 2011. URL : http://en.wikipedia.org/wiki/Kinect. [Bur] Kinect Calibration. 10. Sep. 2011. URL: http://nicolas.burrus. name/index.php/Research/KinectCalibration. [New06] Newman, T.S. „A survey of the marching cubes algorithm“. In: Computer Graphics 30 (2006). URL: http://www.proxyarch.com/util/ techpapers/papers/survey%20of%20marching%20cubes.pdf. [Pin] Pinhole camera model. 10. Sep. 2011. org/wiki/Pinhole_camera_model. [Kaza] Poisson Surface Reconstruction. 8. Juli 2011. jhu.edu/~misha/MyPapers/SGP06.pdf. [Kazb] Poisson Surface Reconstruction Quelltext. 8. Juli 2011. www.cs.jhu.edu/~misha/Code/PoissonRecon/. [Bou] Polygonising a scalar field. 14. Juli 2011. net/geometry/polygonise/. [Kazc] Unconstrained Isosurface Extraction on Arbitrary Octrees. 8. Juli 2011. URL : http://www.cs.jhu.edu/~misha/MyPapers/SGP07a.pdf. Reinhardt/Dach/Backasch/Schlegel/Schröder: 3D-Scan 2.0 URL : http://en.wikipedia. URL : URL : http://www.cs. URL : http:// http://paulbourke.