Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取kinect的特定深度值_C#_Xna_Kinect_Depth Buffer - Fatal编程技术网

C# 获取kinect的特定深度值

C# 获取kinect的特定深度值,c#,xna,kinect,depth-buffer,C#,Xna,Kinect,Depth Buffer,我目前正在尝试使用XNA中的kinect进行手/手指跟踪。为此,我需要能够指定希望程序渲染的深度范围。我环顾四周,看不出这是怎么做到的。据我所知,kinect的深度值仅适用于深度流中的预设范围 我想做的是将其模块化,以便我可以更改kinect渲染的深度范围。我知道这已经下降了以前,但我找不到任何在线,可以告诉我如何做到这一点 有人能帮我吗 我已经可以用kinect渲染标准的深度视图,转换深度帧的方法如下(我感觉这里需要设置) private byte[]ConvertDepthFrame(sho

我目前正在尝试使用XNA中的kinect进行手/手指跟踪。为此,我需要能够指定希望程序渲染的深度范围。我环顾四周,看不出这是怎么做到的。据我所知,kinect的深度值仅适用于深度流中的预设范围

我想做的是将其模块化,以便我可以更改kinect渲染的深度范围。我知道这已经下降了以前,但我找不到任何在线,可以告诉我如何做到这一点

有人能帮我吗

我已经可以用kinect渲染标准的深度视图,转换深度帧的方法如下(我感觉这里需要设置)

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; }