Das Erzeugen der Punktwolke sollte einfach und schnell funktionieren und mit einer Kinect erfolgen.
Aus einem Frame der Kinect, bestehnd aus Farbbilde und Tiefenbild, lässt sich einfach eine Punktwolke relativ zur Tiefenkamera der Kinect errechnen.
Eine Aufnahme beinhaltet aber nur alle Informationen die aus den 2D Bilder zurückgerechnet werden können.
Das heißt man erhält nur eine Seite des Objektes gut aufgelöst und man hat noch einige Artefakte die sich aus dieser Berechnung ergeben.
Für die Darstellung in einer VR Umgebung ist dies nicht ausreichend.
Der Betrachter kann sich frei in der virtuellen Welt bewegen und erkennt schnell die nicht vorhanden Informationen und Fehler.
Ein Problem hierbei ist das Kanten und Flächen die nicht Senkrecht zur Kamera sind, durch unausreichende Informationen in den Ausgangsdaten falsch angenähert werden (siehe ). \todo{Bild}
Pointcloud generation
Setup
lighthouse Tracking (Controller ) + Kinect
Das zweite Problem das es zu lösen galt war das zusammenfügen von mehreren Aufnahmen aus unterschiedlichen Perspektiven zu einer großen zusammenhängenden Punktwolke.
Um 2 Frames miteinander zu verbinden braucht man die relative Transformation zwischen den beiden Aufnahmen, bzw. der beiden Kamerapositionen.
Bei bestehenden Algorithmen wird dies zum Beispiel durch Flankenerkennung oder zurückrechnen der Bewegung der Kamera erreicht \todo{quellen}.
Solche verfahren sind meist rechenaufwändig und zeitintensiv.
Für diese Arbeit war es das Ziel die Kinect mit dem Lighthouse Tracking System zu verbinden.
Die Trackingdaten aus SteamVR, bzw OpenVR geben uns eine globale Position aller Aufnahmen und vereinfachen das Erzeugne einer großen Punktwolke.
\section{Frames aufnehmen und bereinigen}
Als ersten Schritt wird ein Frame mit der Kinect aufgenommen und das Tiefeinbild geglättet.
Anschließend wird das Tiefen und Farbbild in 3D Punkte umgewandelt und unerwünschte Punkte verworfen.
\subsection{Aufnahme und Glättung}
Das Aufnehmen einer kleinen Punktwolke wird das Kinect SDK verwendet.
Sowohl Tiefeinbild auch als auch Farbbild kann man in der API erhalten.
Anschließen wird das Tiefenbild geglättet.
Die Rohdaten sind teilweise sehr verrauscht und man erhält eine Punktwolke mit glatteren Flächen.
Hierfür braucht man einen Filter der zwar die Flächen glättet, aber gleichzeitig Objektkanten erhält.
Ein Bilateral Filter erzielt den gewünschten Effekt ist aber relativ Rechenaufwändig.
Verwendet wurde ein Gaus Filter und ein anschließender Vergleich zwischen Original und geglättetem Bild.\todo{Referenz Manuel Martins fastdepthnoiseremoval}
Nach der Glättung des Tiefenbildes wird dieses ine eine Punktwolke umgewandelt.
Hierfür wurde ebenfalls das Microsoft Kinect SDK verwendet das hierfür alle benötigten Methoden bereitstellt.
Nach der Umwandlung werden noch weiter Punkte verworfen.
Zunächst werden alle Punkte zu denen keine Farbe zugeordnet werden kann verworfen.
Auch alle Punkte die zu nah oder zu weit vom Sensor entfernt sind, werden nicht weiter betrachtet.
Je weiter das Objekt entfernt, desto ungenauer werden die Aufnahmen.
Im folgenden wurde ein Mindestabstand von 30cm und ein Maximalabstand von 90cm verwendet.
Als letztes filtern wir alle Flächen die nicht Senkrecht zur Kamera sind. \todo{bild ref}
Diese Flächen entstehen durch die Umwandlung von einem 2D Tiefenbild in einer 3D Punktwolke.
Die benötigten Informationen fehlen an dieser Stelle und Punkte werden auf die Fläche zwischen Oberflächenobjekt und Hintergrund gesetzt.
Diese Ebene stimmt nicht mit der wirklichen Oberfläche überein und müssen entfernt werden.
Hierfür wird die Oberflächennormale verwendet.
Die Normale wird aus dem Tiefenbild geschätzt.
\begin{equation}
\begin{split}
dzXAxis = depthAt[x+1,y] -depthAt[x-1,y]\\
dzYAxis = depthAt[x,y+1] -depthAt[x,y-1] \\
Normale = Normalize(-dzXAxis,-dzYAxis,1.0f)\\
\end{split}
\end{equation}
Mit dem Skalarprodukt lässt sich der Winkel zwischen dem Kameravektor $(0,0,1)$ und Normale ausrechnen.
Ein maximaler Winkel von 65\textdegree hat in den Tests ein gutes Ergebnis geliefert.
\todo{Quellen auf Kinect und Lighthose}
\section{Zusammenfügen von Frames}
Ein wichtiger Teil beim dem Aufnehmen der Punktwolke ist das zusammenführen von mehreren Frames.
Hierfür wurde die Kinect mit dem Lighthouse Tracking System verbunden und verzichtet damit auf aufwändige Berechnungen.
\newcommand{\mytitle}{\iflanguage{english}{Remote assistance and colaboration with 3D point clouds}{Remote assistance and colaboration with 3D point clouds}}
\newcommand{\mytitle}{\iflanguage{english}{Remote Assistance and Collaboration with 3D Point Clouds}{Fernunterstützung und Zusammenarbeit mit 3D Punktwolken}}