C# 获取Kinect v2中每个3D点的RGB值

C# 获取Kinect v2中每个3D点的RGB值,c#,kinect-sdk,kinect-v2,C#,Kinect Sdk,Kinect V2,我对Kinect v2 API感到困惑。我想得到Kinect v2中每个3D点的RGB值 请参见下面的代码片段: var depthFrame = multiSourceFrame.DepthFrameReference.AcquireFrame(); var colorFrame = multiSourceFrame.ColorFrameReference.AcquireFrame(); var depthWidth = depthFrame.FrameDescription.Width;

我对Kinect v2 API感到困惑。我想得到Kinect v2中每个3D点的RGB值

请参见下面的代码片段:

var depthFrame = multiSourceFrame.DepthFrameReference.AcquireFrame();
var colorFrame = multiSourceFrame.ColorFrameReference.AcquireFrame();

var depthWidth = depthFrame.FrameDescription.Width;
var depthHeight = depthFrame.FrameDescription.Height;

ushort[] depthData = new ushort[depthWidth * depthHeight];
CameraSpacePoint[] camerapoints = new CameraSpacePoint[depthData.Length];
ColorSpacePoint[] colorpoints = new ColorSpacePoint[depthData.Length];

depthFrame.CopyFrameDataToArray(depthData);
this.coordinateMapper.MapDepthFrameToCameraSpace(depthData, camerapoints);
this.coordinateMapper.MapDepthFrameToColorSpace(depthData, colorpoints);
3D点存储在
camerapoints
变量中。我想查看每个
camerapoints
的RGB值。换言之,请参见以下pesudo代码:

RGBPoint[] rgbpoints = new RGBPoint[depthData.Length];
RGBPoint rgbpoint = rgbpoints[0];
int red   = rgbpoint.r
int green = rgbpoint.g
int blue  = rgbpoint.b

一如既往,非常感谢。非常感谢您的友好回复。

颜色点数组包含(x,y)索引,该索引对应于
深度数据数组中的每个像素。从这里,我们可以在
colorpoints[index]
指示的每个特定(x,y)索引处获得色框数据(从
colorFrame

var colorWidth = colorFrame.FrameDescription.Width;
var colorHeight = colorFrame.FrameDescription.Height;

// Assuming BGRA format here
byte[] pixels = new byte[colorWidth * colorHeight * 4];
colorFrame.CopyFrameDataToArray(pixels);

byte[] bgraPoints = new byte[depthWidth * depthHeight * 4];

for (var index = 0; index < depthData.Length; index++)
{
    var u = colorpoints[index].X;
    var v = colorpoints[index].Y;
    if (u < 0 || u >= colorWidth || v < 0 || v >= colorHeight) continue;
    var pixelsBaseIndex = v * colorWidth + u;
    Array.Copy(pixels, 4 * pixelsBaseIndex, bgraPoints, 4 * index, 4);
}

var index = 0;
var red = bgraPoints[4 * index + 2];
var green = bgraPoints[4 * index + 1];
var blue = bgraPoints[4 * index];
var colorWidth=colorFrame.FrameDescription.Width;
var colorHeight=colorFrame.FrameDescription.Height;
//假设这里是BGRA格式
字节[]像素=新字节[colorWidth*colorHeight*4];
colorFrame.CopyFrameDataToArray(像素);
字节[]bgraPoints=新字节[depthWidth*depthHeight*4];
对于(var index=0;index=颜色宽度| | v<0 | | v>=颜色高度)继续;
var pixelsBaseIndex=v*颜色宽度+u;
复制(像素,4*pixelsBaseIndex,bgraPoints,4*index,4);
}
var指数=0;
风险值红色=bgraPoints[4*指数+2];
var green=bgraPoints[4*指数+1];
var blue=bgraPoints[4*指数];

非常感谢。但是它抛出了以下错误
ArgumentOutOfRangeException:数字小于数组在第一维度的下限。
我添加了一个单独的问题,并提到了有关它的更多信息。请看有趣的,实际上我还没有真正尝试执行代码(现在手头没有Kinect)。然而,我猜这是因为一些深度像素可能在彩色像素帧之外,这是由于两个相机之间的偏移和视场造成的。处理这个问题的一种方法就是忽略这些值。更新了我的答案。非常感谢。我明天试试。还有一个问题
pixelsBaseIndex=v*depthWidth+u
而不是
depthWidth
是否应该是
colorWidth
?不确定,因为我现在不在实验室。再次感谢您更新的答案。有些东西仍然可疑。我做不到。你能退房吗