// Update / draw the User Map void UpdateUserMap() { // copy over the maps Marshal.Copy(KinectWrapper.GetUsersLabelMap(), usersLabelMap, 0, usersMapSize); Marshal.Copy(KinectWrapper.GetUsersDepthMap(), usersDepthMap, 0, usersMapSize); // Flip the texture as we convert label map to color array int flipIndex, i; int numOfPoints = 0; Array.Clear(usersHistogramMap, 0, usersHistogramMap.Length); // Calculate cumulative histogram for depth for (i = 0; i < usersMapSize; i++) { // Only calculate for depth that contains users if (usersLabelMap[i] != 0) { usersHistogramMap[usersDepthMap[i]]++; numOfPoints++; } } if (numOfPoints > 0) { for (i = 1; i < usersHistogramMap.Length; i++) { usersHistogramMap[i] += usersHistogramMap[i - 1]; } for (i = 0; i < usersHistogramMap.Length; i++) { usersHistogramMap[i] = 1.0f - (usersHistogramMap[i] / numOfPoints); } } // Create the actual users texture based on label map and depth histogram for (i = 0; i < usersMapSize; i++) { flipIndex = usersMapSize - i - 1; if (usersLabelMap[i] == 0) { usersMapColors[flipIndex] = Color.clear; } else { // Create a blending color based on the depth histogram Color c = new Color(usersHistogramMap[usersDepthMap[i]], usersHistogramMap[usersDepthMap[i]], usersHistogramMap[usersDepthMap[i]], 0.9f); switch (usersLabelMap[i] % 4) { case 0: usersMapColors[flipIndex] = Color.red * c; break; case 1: usersMapColors[flipIndex] = Color.green * c; break; case 2: usersMapColors[flipIndex] = Color.blue * c; break; case 3: usersMapColors[flipIndex] = Color.magenta * c; break; } } } // Draw it! usersLblTex.SetPixels(usersMapColors); usersLblTex.Apply(); }