繁体   English   中英

如何使用Matlab或C#在Kinect V2中将颜色流(1920x1080)转换为深度流(512x424)

[英]How can I convert color stream (1920x1080) into depth stream(512x424) in Kinect V2 using matlab or C#

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

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

这是做过这样的链接。我想在Matlab或C#中做到这一点

在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无穷大,这意味着目标空间中没有对应的像素

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

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

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

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

它映射给定深度图像的相应RGB像素。 最终将获得1920x1080 RGB深度图像的分辨率。 由于深度像素较少,因此并非所有RGB像素都具有深度值。 为此,您需要

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

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

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

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

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

我就此事写了硕士论文。 如果您还有其他问题,我们非常乐意为您提供帮助。

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

因此,您应该

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM