我希望有人可以帮助我。这个代码的最终目标是提取我穿的毛衣的颜色。就像标题所示,我试图从某个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方法中。道歉答案 0 :(得分:0)
首先,我真的建议您查看Coding4Fun Kinect Toolkit,它提供了许多有用的函数来处理Kinect数据。例如,有一个扩展名用于返回一个名为ToBitmapSource()的位图,该位图应该是有用的。
另一个观察结果是,如果不使用某种算法来获得接收到的颜色值的平均值,那么使颜色值跳跃是很正常的。也不能确信您可以期待骨架和图像帧100%同步。