Kinect 2绿屏效果

时间:2015-10-14 14:40:03

标签: c# kinect

我在C#wpf met de Kinect 2中创建一个简单的应用程序。如果检测到用户,我想创建一个绿屏效果。我正在使用SDK中的CoordinateMappingBasics示例。问题是用户的边缘是"白色"并不那么好看。有没有办法在边缘实现模糊效果?有什么方法可以使用面膜吗?我将不胜感激任何帮助!

// We'll access the body index data directly to avoid a copy
using (KinectBuffer bodyIndexData = bodyIndexFrame.LockImageBuffer())
{
    unsafe
    {
        byte* bodyIndexDataPointer = (byte*)bodyIndexData.UnderlyingBuffer;

        int colorMappedToDepthPointCount = this.colorMappedToDepthPoints.Length;

        fixed (DepthSpacePoint* colorMappedToDepthPointsPointer = this.colorMappedToDepthPoints)
        {
            // Treat the color data as 4-byte pixels
            uint* bitmapPixelsPointer = (uint*)this.bitmap.BackBuffer;

            // Loop over each row and column of the color image
            // Zero out any pixels that don't correspond to a body index
            for (int colorIndex = 0; colorIndex < colorMappedToDepthPointCount; ++colorIndex)
            {
                float colorMappedToDepthX = colorMappedToDepthPointsPointer[colorIndex].X;
                float colorMappedToDepthY = colorMappedToDepthPointsPointer[colorIndex].Y;

                // The sentinel value is -inf, -inf, meaning that no depth pixel corresponds to this color pixel.
                if (!float.IsNegativeInfinity(colorMappedToDepthX) &&
                    !float.IsNegativeInfinity(colorMappedToDepthY))
                {
                    // Make sure the depth pixel maps to a valid point in color space
                    int depthX = (int)(colorMappedToDepthX + 0.5f);
                    int depthY = (int)(colorMappedToDepthY + 0.5f);


                    // If the point is not valid, there is no body index there.
                    if ((depthX >= 0) && (depthX < depthWidth) && (depthY >= 0) && (depthY < depthHeight))
                    {
                        int depthIndex = (depthY * depthWidth) + depthX;


                        // If we are tracking a body for the current pixel, do not zero out the pixel
                        if (bodyIndexDataPointer[depthIndex] != 0xff)
                        {
                            continue;

                        }
                    }
                }

                bitmapPixelsPointer[colorIndex] = 0;
            }
        }

        this.bitmap.AddDirtyRect(new Int32Rect(0, 0, this.bitmap.PixelWidth, this.bitmap.PixelHeight));
    }
}
}

1 个答案:

答案 0 :(得分:0)

这是一个很难解决的问题。我的建议是查看一个对象检测脚本,matlab有几个例子。然后,您可以将Kinects深度数据和对象检测框组合在一起,以更精确地对边缘进行舍入。

我对Kinect的建议是始终为用户提供高度对比的背景。确保您拥有良好的均匀照明,并尽量使人与其背后的任何物体/墙壁之间的距离最大化。