Kinect:从某个骨架关节点提取颜色(rgb信息)。获得奇怪的结果

时间:2014-01-09 16:40:30

标签: c# kinect

我希望有人可以帮助我。这个代码的最终目标是提取我穿的毛衣的颜色。就像标题所示,我试图从某个Skeleton点(即skeleton.Joint [JointType.Spine] .Position)中提取RBG值。我使用以下映射执行此操作:

所有以下代码都在SensorAllFramesReady事件中:

private void SensorAllFramesReady(object sender, AllFramesReadyEventArgs e)
{
    Skeleton[] skeletons = new Skeleton[0];

    using (SkeletonFrame skeletonFrame = e.OpenSkeletonFrame())
    {
        if (skeletonFrame != null)
        {
            skeletons = new Skeleton[skeletonFrame.SkeletonArrayLength];
            skeletonFrame.CopySkeletonDataTo(skeletons);
        }
    }

    if (skeletons.Length != 0)
    {
        foreach (Skeleton skel in skeletons)
        {
            if (skel.TrackingState == SkeletonTrackingState.Tracked)
            {
                colorPoint = this.SkeletonPointToColor(skel.Joints[JointType.Spine].Position);                       
            }
        }
    }
}

private Point SkeletonPointToColor(SkeletonPoint skelpoint)
{
    ColorImagePoint colorPoint = this.sensor.CoordinateMapper.MapSkeletonPointToColorPoint(skelpoint, ColorImageFormat.RgbResolution640x480Fps30);
    return new Point(colorPoint.X, colorPoint.Y);
}

我将返回的Point分配给变量“ColorPoint”,这是我(有些成功)提取RBG值的方式:

using (ColorImageFrame colorFrame = e.OpenColorImageFrame())
{               
    if (colorFrame != null)
    {
        int arrayLength = colorFrame.PixelDataLength;
        this.colorPixelData = new byte[arrayLength];
        colorFrame.CopyPixelDataTo(this.colorPixelData);
        blue = (int)colorPixelData[(int)(4* (colorPoint.X + (colorPoint.Y * colorFrame.Width)))+0];
        green = (int)colorPixelData[(int)(4 * (colorPoint.X + (colorPoint.Y * colorFrame.Width))) + 1];
        red = (int)colorPixelData[(int)(4 * (colorPoint.X + (colorPoint.Y * colorFrame.Width))) + 2];
    }
}

然后我使用检索到的RBG值在我的Windows窗体窗口上绘制一个椭圆。现在这个有用了。我的颜色与我穿的毛衣颜色相似,但即使我尽力站立,颜色也总是在变化。这几乎就像我在一定范围内得到随机RBG值,只有这个范围是由我的毛衣的颜色决定的。为什么是这样?我还有另一种方法可以解决这个问题吗?

感谢您阅读!

编辑:我为格式化道歉,这是我第一次提交问题,我意识到第一个代码块中的格式有点偏。 SkeletonPointToColor方法自然不在SensorAllFramesReady方法中。道歉

1 个答案:

答案 0 :(得分:0)

首先,我真的建议您查看Coding4Fun Kinect Toolkit,它提供了许多有用的函数来处理Kinect数据。例如,有一个扩展名用于返回一个名为ToBitmapSource()的位图,该位图应该是有用的。

另一个观察结果是,如果不使用某种算法来获得接收到的颜色值的平均值,那么使颜色值跳跃是很正常的。也不能确信您可以期待骨架和图像帧100%同步。