我正在尝试将单个ColorSpacePoint映射到Kinect SDK 2.0中的DepthSpacePoint。
如果了解Kinect提供的三种坐标系统类型,这应该是一个非常简单的映射。 ColorSpace和DepthSpace都是二维空间,它们具有不同的分辨率和宽高比。
但是,我无法弄清楚CoordinateMapper中的哪个函数将接收特定的ColorSpacePoint并返回关联的DepthSpacePoint。
任何人都可以阐明这件事吗?
谢谢!
最佳答案
SDK中没有将单个ColorSpacePoint
映射到DepthSpace
(或CameraSpace
)的方法。而且不可能!为了获得正确的映射,您不仅需要像素坐标,还需要该特定像素处的深度。而且在RGB图像中,您没有该信息。
为了实现从颜色空间到深度或相机空间的正确映射,首先必须将完整的深度图像映射到彩色图像,以获得每个颜色像素的深度值。这样就很容易将单个像素从颜色映射到深度空间。但是到那时,您将拥有完整的映射。
因此,如果您确实需要朝这个方向前进,则需要使用 CoordinateMapper.MapColorFrameToCameraSpace
映射整个图像。
另一方面,当您处于景深或摄影空间中时,每个像素已经拥有了所需的所有信息,因此映射单个像素很容易。这就是为什么这些方法存在的原因(例如 CoordinateMapper.MapDepthPointToCameraSpace
)。
编辑:
我希望可以通过绘制一些图形来解释为什么需要深度才能在颜色和深度空间之间获得正确的映射:
彩色相机的像素之一注视着蓝色物体(蓝色实心箭头)。该像素映射到深度相机的特定像素(红色实心箭头)。
如果对象不存在,则彩色相机的相同像素将注视背景(蓝色虚线箭头),该背景将被映射到深度相机中的不同像素(红色虚线箭头-箭头的不同方向意味着不同的像素)。
但是彩色相机不知道它是在看物体还是背景。它只知道那里是哪种颜色。颜色没有多远。这就是为什么仅彩色相机无法确定深度相机中哪个像素正确的原因。
另一方面,深度相机知道每个像素的距离,因此可以找出彩色相机中的相应像素。