【问题标题】:Get RGB values of each 3D point in Kinect v2在 Kinect v2 中获取每个 3D 点的 RGB 值
【发布时间】:2017-11-26 19:22:23
【问题描述】:

我对 Kinect v2 CoordinateMapper API 感到困惑。我想在 Kinect v2 中获取每个 3D 点的 RGB 值,也就是 CameraSpacePoint

请看下面的代码sn-p:

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 值。换句话说,请看下面的伪代码:

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

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

【问题讨论】:

    标签: c# kinect-sdk kinect-v2


    【解决方案1】:

    colorpoints 数组包含对应于depthData 数组中每个像素的 (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];
    

    【讨论】:

    • 非常感谢。但它引发了以下错误ArgumentOutOfRangeException: Number was less than the array's lower bound in the first dimension. 我添加了一个单独的问题并提到了有关它的更多信息。请看here
    • 有趣,实际上我还没有真正尝试过执行代码(现在手头没有 Kinect)。但是我猜这是因为由于两个相机之间的偏移和视场,一些深度像素可能在彩色像素的框架之外。处理这个问题的一种方法就是忽略这些值。更新了我的答案。
    • 非常感谢。我明天试试。还有一个问题pixelsBaseIndex = v * depthWidth + u 而不是depthWidth 应该是colorWidth 吗?不过不确定,因为我现在不在实验室。再次感谢您更新的答案。
    • 还是有问题。我无法完成它。你能看看here
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-29
    • 1970-01-01
    • 2016-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-10
    相关资源
    最近更新 更多