C# 获取kinect的特定深度值
我目前正在尝试使用XNA中的kinect进行手/手指跟踪。为此,我需要能够指定希望程序渲染的深度范围。我环顾四周,看不出这是怎么做到的。据我所知,kinect的深度值仅适用于深度流中的预设范围 我想做的是将其模块化,以便我可以更改kinect渲染的深度范围。我知道这已经下降了以前,但我找不到任何在线,可以告诉我如何做到这一点 有人能帮我吗 我已经可以用kinect渲染标准的深度视图,转换深度帧的方法如下(我感觉这里需要设置)C# 获取kinect的特定深度值,c#,xna,kinect,depth-buffer,C#,Xna,Kinect,Depth Buffer,我目前正在尝试使用XNA中的kinect进行手/手指跟踪。为此,我需要能够指定希望程序渲染的深度范围。我环顾四周,看不出这是怎么做到的。据我所知,kinect的深度值仅适用于深度流中的预设范围 我想做的是将其模块化,以便我可以更改kinect渲染的深度范围。我知道这已经下降了以前,但我找不到任何在线,可以告诉我如何做到这一点 有人能帮我吗 我已经可以用kinect渲染标准的深度视图,转换深度帧的方法如下(我感觉这里需要设置) private byte[]ConvertDepthFrame(sho
private byte[]ConvertDepthFrame(short[]depthrframe,DepthImageStream depthrstream,int depthrframe32length)
{
int tooNearDepth=depthStream.tooNearDepth;
int tooFarDepth=depthStream.tooFarDepth;
int unknownDepth=深度流。unknownDepth;
byte[]depthFrame32=新字节[depthFrame32Length];
对于(inti16=0,i32=0;i16>DepthImageFrame.PlayerIndexBitmaskWidth;
//将13位深度信息转换为适合的8位强度
//用于显示(我们忽略最高有效位中的信息)
字节强度=(字节)(~(realDepth>>8));
如果(player==0&&realDepth==00)
{
//白色的
深度帧32[i32+RedIndex]=255;
深度框架32[i32+绿色索引]=255;
depthFrame32[i32+BlueIndex]=255;
}
//省略其他if语句。如果像素超出预设深度值,Simple会更改像素的颜色
其他的
{
//通过除以每个玩家的值来着色强度
depthFrame32[i32+RedIndex]=(字节)(强度>>强度移位ByPlayer[player]);
depthFrame32[i32+GreenIndex]=(字节)(强度>>强度移位显示[player]);
depthFrame32[i32+BlueIndex]=(字节)(强度>>IntensityShiftByPlayerB[player]);
}
}
返回深度帧32;
}
我有一种强烈的预感,我需要在int-player和int-realDepth值中更改它,但我不能确定。Kinect for Windows Toolkit 1.8.0中有一个新的示例,名为。它在交互区域查看器部分直接处理这个问题。请看一下调整近边界和远边界的代码。这对你的处境应该有帮助。
. “kinect的深度值仅适用于深度流中的预设范围”,我不确定您想说什么。kinect摄像头可以感应1.2米到3.5米之间的深度(在正常模式下)。深度的灵敏度有11位的分辨率(2048个值)。我认为这太复杂了。kinect为每个像素提供深度。这个范围有硬件限制。你不能调整它。如果你只想在一个较小的范围内观察对象,那么你可以自己限制它。i、 e.如果(depthFrame[i]>minD&&depthFrame[i]
private byte[] ConvertDepthFrame(short[] depthFrame, DepthImageStream depthStream, int depthFrame32Length)
{
int tooNearDepth = depthStream.TooNearDepth;
int tooFarDepth = depthStream.TooFarDepth;
int unknownDepth = depthStream.UnknownDepth;
byte[] depthFrame32 = new byte[depthFrame32Length];
for (int i16 = 0, i32 = 0; i16 < depthFrame.Length && i32 < depthFrame32.Length; i16++, i32 += 4)
{
int player = depthFrame[i16] & DepthImageFrame.PlayerIndexBitmask;
int realDepth = depthFrame[i16] >> DepthImageFrame.PlayerIndexBitmaskWidth;
// transform 13-bit depth information into an 8-bit intensity appropriate
// for display (we disregard information in most significant bit)
byte intensity = (byte)(~(realDepth >> 8));
if (player == 0 && realDepth == 00)
{
// white
depthFrame32[i32 + RedIndex] = 255;
depthFrame32[i32 + GreenIndex] = 255;
depthFrame32[i32 + BlueIndex] = 255;
}
// omitted other if statements. Simple changed the color of the pixels if they went out of the pre=set depth values
else
{
// tint the intensity by dividing by per-player values
depthFrame32[i32 + RedIndex] = (byte)(intensity >> IntensityShiftByPlayerR[player]);
depthFrame32[i32 + GreenIndex] = (byte)(intensity >> IntensityShiftByPlayerG[player]);
depthFrame32[i32 + BlueIndex] = (byte)(intensity >> IntensityShiftByPlayerB[player]);
}
}
return depthFrame32;
}