Ich habe an einer Szene in Unity3D gearbeitet, wo ich die KinectV2-Tiefeninformationen bei 512 x 424 habe und ich wandle das in Echtzeit in Mesh, das auch 512 ist x 424. Es gibt also ein 1: 1-Verhältnis von Pixeldaten (Tiefe) und Scheitelpunkten (Mesh).Microsoft Kinect V2 + Unity 3D Tiefe = Warping
Mein Endziel ist es, die "3D-Ansicht beobachten" -Szene in "Microsoft Kinect Studio v2.0" mit der Tiefe zu finden.
Ich habe es ziemlich funktioniert in Bezug auf die Punktwolke. Allerdings gibt es in meiner Unity-Szene eine Menge Verwerfungen. Ich dachte, es könnte auf meine Mathematik usw. zurückzuführen sein.
Allerdings habe ich festgestellt, dass es sich um den gleichen Fall für das Unity Demo kinect handelt, das in ihrem Development kit enthalten ist.
Ich frage mich nur, ob ich etwas offensichtliches hier vermisse? Jedes meiner Pixel (oder Scheitelpunkte in diesem Fall) wird 1 zu 1 abgebildet.
Ich bin mir nicht sicher, ob es ist, weil ich die Daten aus dem DepthFrame verarbeiten muss, bevor es in die Szene gerendert wird? Oder wenn es einen zusätzlichen Schritt gibt, den ich verpasst habe, um die wahre Darstellung meines Zimmers zu bekommen? Weil es so aussieht, als würde jetzt ein kleiner "sphärischer" Effekt hinzugefügt werden.
Diese beiden Bilder sind von oben nach unten Schuss von meinem Zimmer. Die grüne Linie repräsentiert meine Wände.
Das linke Bild ist die Kinect in einer Unity-Szene, und das Recht ist in Microsoft Kinect Studio. Wenn Sie den Farbunterschied ignorieren, können Sie sehen, dass die linke (Unity) verzerrt ist, während die rechte linear und perfekt ist.
Ich weiß, es ist ziemlich schwer zu erkennen, vor allem, dass Sie nicht wissen, das Layout des Raumes, in dem ich saß:/Seitenansicht. Kannst du das Warping links sehen? Verwenden Sie die grünen Linien als Referenz - diese sind im tatsächlichen Raum gerade, wie auf dem rechten Bild korrekt dargestellt.
Schauen Sie sich mein Video eine bessere Vorstellung zu bekommen: https://www.youtube.com/watch?v=Zh2pAVQpkBM&feature=youtu.be
-Code C#
Ziemlich einfach ehrlich zu sein. Ich nehme die Tiefeninformationen direkt aus dem Kinect SDK und platziere sie in einem Punktwolkennetz auf der Z-Achse.
//called on application start
void Start(){
_Reader = _Sensor.DepthFrameSource.OpenReader();
_Data = new ushort[_lengthInPixels];
_Sensor.Open();
}
//called once per frame
void Update(){
if(_Reader != null){
var dep_frame = _Reader.AcquireLatestFrame();
dep_frame.CopyFrameDataToArray(_Data);
dep_frame.Dispose();
dep_frame = null;
UpdateScene();
}
}
//update point cloud in scene
void UpdateScene(){
for(int y = 0; y < height; y++){
for(int x = 0; x < width; x++){
int index = (y * width) + x;
float depthAdjust = 0.1;
Vector3 new_pos = new Vector3(points[index].x, points[index].y, _Data[index] * depthAdjust;
points[index] = new_pos;
}
}
}
Kinect API finden Sie hier: https://msdn.microsoft.com/en-us/library/windowspreview.kinect.depthframe.aspx
jede Beratung schätzen würde, Dank!
Es wäre hilfreich, um zu sehen, welche Symptome Ihr Sehen und vielleicht den Code zentralisierte um ihn herum. Sie müssen die Rahmendaten in einem Array verarbeiten und sie korrekt auf das Bitmap/Bild anwenden, das Sie anzeigen. – Sean
@Sean Danke, ich habe meinem OP ein Foto hinzugefügt. –