【问题标题】:How can I convert color stream (1920x1080) into depth stream(512x424) in Kinect V2 using matlab or C#如何使用 matlab 或 C# 在 Kinect V2 中将颜色流(1920x1080)转换为深度流(512x424)
【发布时间】:2017-07-01 16:52:01
【问题描述】:

Kinect V2 色流支持格式为:1920x1080。但 kinect V2 深度流格式为:512x424。现在,当我为两个传感器启动实时蒸汽时,由于分辨率不同,它们的尺寸也不同。我无法调整它们的大小,因为我需要坐标。所以当我使用 Imresize() 调整大小时,坐标不匹配。我已经阅读了matlab文档。他们说硬件分别只支持这两种格式。现在我怎样才能在代码中做到这一点,以便两个流具有相同的分辨率。我尝试了两天但失败了。此外,我想通过任何过程来做到这一点,以便我拍摄第一张深度图像,并根据这个深度分辨率拍摄 RGB 或彩色图像。

我的项目是从深度图像中提取线条并将它们映射到 kinect v2 的 RGB 图像上。但分辨率不一样。所以 [x,y] 坐标改变了。所以当我将它映射到 RGB 上时,它与深度图像的坐标不匹配。我该如何解决?我以为我会改变分辨率,但在 kinect V2 分辨率中无法改变。现在我该如何在编码中做到这一点。

Here is link who did like this.i want to do it in matlab or c#

【问题讨论】:

  • 你能发布一些你尝试过的例子以及失败的原因吗?
  • 添加了一些信息。但我不明白我该如何为它编写代码
  • 您无法调整 RGB 图像的大小以匹配深度图像的大小。唯一的方法是使用坐标映射。对于matlab实现,可以查看[ToF-Calibration Toolbox] (github.com/kapibara/ToF-Calibration)

标签: c# matlab visual-studio kinect resolution


【解决方案1】:

对于工作示例,您可以查看VRInteraction。我将深度图像映射到 RGB 图像以构建 3D 点云。

您想要实现的目标称为注册

  1. 校准深度相机以找到深度相机投影矩阵(使用 opencv)
  2. 校准RGB相机以找到RGB相机投影矩阵(使用opencv)

    - 您可以将深度图像注册为 RGB 图像:

这是映射给定深度图像的相应RGB像素。这将以 1920x1080 RGB 深度图像的分辨率结束。并非所有 RGB 像素都有深度值,因为深度像素较少。为此,您需要

  • 使用深度相机投影矩阵计算每个深度像素的真实世界坐标()
  • 计算先前计算的真实世界坐标的 RGB 像素坐标
  • 使用先前计算的 RGB 像素坐标在 RGB 图像中查找匹配像素

    - 您可以将 RGB 图像图像注册到深度图像:

映射给定 RGB 图像的相应深度像素。这将最终得到分辨率为 512x424 RGB-Depth 的图像。为此,您需要

  • 使用深度相机投影矩阵计算每个 RGB 像素的真实世界坐标()
  • 计算先前计算的真实世界坐标的深度像素坐标
  • 使用先前计算的 RGB 像素坐标在深度图像中查找匹配像素

如果您想实时实现这一目标,则需要考虑使用 GPU 加速。特别是如果您的深度图像包含超过 30000 个深度点。

我就这个问题写了我的硕士论文。如果您还有其他问题,我很乐意为您提供帮助。

【讨论】:

  • 感谢您的建议。我已经这样做了。但现在我面临一个问题,有时我的深度图像像素值为零。我怎样才能摆脱这个问题?你有什么想法吗?
  • kinect v2 的深度范围在 0.5m 到 4m 之间,FOV 为 70.6 x 60 度。如果您得到零深度值意味着传感器无法读取该特定点。换句话说,该点不在传感器的范围内,或者传感器无法清楚地读取它。因此,您可以放心地忽略这些点或指定一个默认值作为您的要求。
  • 谢谢先生……先生,如果我使用 VR 将深度映射到 RGB……那么两个图像在特定点的坐标将完全相同??我怎样才能映射它...只需运行 VR ?但先生,我没有运行它。
【解决方案2】:

在 c# 中,您可以使用 CoordinateMapper 将点从一个空间映射到另一个空间。 因此,要从深度空间映射到颜色空间,您连接到 MultiSourceFrameArrived 事件以获取颜色和深度源并创建这样的处理程序

  private void MultiFrameReader_MultiSourceFrameArrived(object sender, MultiSourceFrameArrivedEventArgs e)
  {
        MultiSourceFrame multiSourceFrame = e.FrameReference.AcquireFrame();
        if (multiSourceFrame == null)
        {
            return;
        }


        using (ColorFrame colorFrame = multiSourceFrame.ColorFrameReference.AcquireFrame())
        {
            if (colorFrame == null) return;

            using (DepthFrame depthFrame = multiSourceFrame.DepthFrameReference.AcquireFrame())
            {
                if (colorFrame == null) return;

                using (KinectBuffer buffer = depthFrame.LockImageBuffer())
                {
                    ColorSpacePoint[] colorspacePoints = new ColorSpacePoint[depthFrame.FrameDescription.Width * depthFrame.FrameDescription.Height];
                    kinectSensor.CoordinateMapper.MapDepthFrameToColorSpaceUsingIntPtr(buffer.UnderlyingBuffer, buffer.Size, colorspacePoints);
                    //A depth point that we want the corresponding color point
                    DepthSpacePoint depthPoint = new DepthSpacePoint() { X=250, Y=250};

                    //The corrseponding color point
                    ColorSpacePoint targetPoint = colorspacePoints[(int)(depthPoint.Y * depthFrame.FrameDescription.Height + depthPoint.X)];

                }
            }
        }  
    }

colorspacePoints 数组包含对于 depthFrame 中的每个像素,colorFrame 中的对应点 您还应该检查targetPoint是否有X或Y无穷大,这意味着目标空间中没有对应的像素

【讨论】:

    【解决方案3】:

    如果您想覆盖两个数组(例如创建 RGBD 图像),您需要重新采样(Matlab 中的imresize)。注意,视场在深度和颜色上是不同的,即彩色图像的最右边和最左边不是深度图像的一部分,深度图像的顶部和底部不是彩色图像的一部分。

    因此,你应该

    1. 从宽度到深度图像中裁剪彩色图像
    2. 裁剪深度图像 高度到彩色图像
    3. 使用重新采样颜色或深度图像 imresize

    【讨论】:

    • @MohammadYakub:不幸的是,我不能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-15
    • 1970-01-01
    • 1970-01-01
    • 2017-01-16
    • 2013-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多