高效的Kinect深度图像(或大型阵列)过滤

时间:2013-01-03 16:05:08

标签: arrays filtering kinect emgucv kinect-sdk

我正在使用Kinect SDK,我试图以两种方式过滤深度图像数据:

  1. 删除与播放器无关的所有深度
  2. 删除大于给定深度的所有深度(根据玩家手腕的位置计算)
  3. 其结果主要是仅显示玩家身体的某些部分,这些部分距离传感器的深度不到一定深度。

    虽然下面的代码完成了我想要它做的事情,但是当我运行性能分析时它没有证明非常好,所以我正在寻找可以改进它的方法。

    基本问题是数组包含307200个值(深度图像大小为640x480),我试图让这个方法每秒调用30次左右。

    有没有人知道如何更有效地完成这项工作?该代码在其他部分也使用了EmguCV库,我使用cvInvokeThreshold方法进行了修改,但它并没有像这段代码一样工作......

    如果您需要更多信息,请与我们联系。

    非常感谢,

    Dave McB

    public static byte[] GetDepths(byte[] depths, DepthImagePixel[] depthPixels, int width, int height, int threshold)
        {
    
            Parallel.For(0, width, i =>
            {
                for (int j = 0; j < height; j++)
                {
                    //Have to calculate the index we are working on using i and j
                    int rawDepthDataIndex = i * height + j;
    
                    //gets the depth and player values
                    short depth = depthPixels[rawDepthDataIndex].Depth;
                    short player = depthPixels[rawDepthDataIndex].PlayerIndex;
    
                    if (player > 0 && depth < threshold)
                        depths[rawDepthDataIndex] = (byte)depth;
                    else
                        depths[rawDepthDataIndex] = 0;
                }
    
    
            });
            return depths;
        }
    

1 个答案:

答案 0 :(得分:0)

嗨我有深度图像和切割的问题。

我使用此代码

Using depthFrame As DepthImageFrame = e.OpenDepthImageFrame()
            If depthFrame IsNot Nothing Then
                ' Copy the pixel data from the image to a temporary array
                Me.depthPixels = Me.smoothingFilter.CreateFilteredDepthArray(Me.depthPixels, depthFrame.Width, depthFrame.Height)

                depthFrame.CopyDepthImagePixelDataTo(Me.depthPixels)

                depthReceived = True
            End If
End Using