|||
深度相机Kinect可以输出640×480和320×240两种分辨率的深度图像,同时也能输出红外图像或者RGB图像(两种图像无法同时获取)。
Kinect的规格说明提到,设备自带的RGB摄像头也可以支持1280×1024的图像输出,至少维基百科是这样说的:
...the hardware is capable of resolutions up to 1280x1024 (at a lower frame rate) and other colour formats such as UYVY. The monochrome depth sensing video stream is in VGA resolution (640 × 480 pixels) with 11-bit depth, which provides 2,048 levels of sensitivity. The Kinect can also stream the view from its IR camera directly (i.e.: before it has been converting into a depth map) as 640x480 video, or 1280x1024 at a lower frame rate.
但是在OpenNI里简单地把分辨率直接改成 nXRes=1280,nYRes=1024,nFPS=15,并调用下面的语句,却无法输出想要的结果。
XnMapOutputModeMyMapMode = { nXRes,nYRes,nFPS };
//显示RGB图像时设置输出分辨率
xn::ImageGeneratorG_RGB;
G_RGB.SetMapOutputMode(MyMapMode );
后来发现在程序里注释掉深度图像的获取和输出步骤,就可以显示了。也就是说,设备无法输出1280×1024的深度图,这样的设置会导致无法二者都无法获取。
下面例子是一个场景的深度图,分辨率为640×480,并且用
G_Depth.GetAlternativeViewPointCap().SetViewPoint(G_RGB );
把深度图warp到对应的RGB图像上了。 图中的红点和数字表示该点的深度值,单位是毫米,0表示这个点没有深度数据。
下面图像显示的是对应的640×480的RGB图像
下面图像显示的是对应的1280×1024的RGB图像,可以看出图像的上下边比上图多几行内容,(博客在上传图像时改变了图像尺寸,所有图像都可以在这里下载jpg.rar):
切换到显示红外图像,重新编译程序,也可以输出1280×1024的红外图像。
//在显示红外图像时对应的语句
xn::IRGeneratorG_Ir;
G_Ir.SetMapOutputMode(MyMapMode );
下面是这个场景的红外图像(尺寸1280×1024):
图像里的散乱分布的亮点,就是Kinect用来恢复深度的结构光(Structure Light),这些光斑是由设备上的红外激光发射器发出的。这些古怪的pattern用肉眼是看不到的,只能借助红外相机观察。利用红外结构光实时恢复深度,是Kinect的技术核心,来自于一家叫Prime Sense的以色列公司。但微软最近推出的Kinect2.0抛弃了这种技术,取而代之的是Time Of Flight,来自于他们前几年收购的另一家以色列公司。深度相机是基于摄影测量学中的三角测距法,根据亮点在图像中移动的位置就可以算出这点到相机的距离(即深度),具体原理大家可以在网上自行搜索。
下面是分辨率切换到640×480的输出,由于Kinect输出的时候做了简单的隔点降采样,所以可以看到墙面上出现了红外激光pattern的走样(Aliasing)条纹,研究光学的人和摄影爱好者喜欢把它称为摩尔(Morie)纹。为了解释这个现象,有的人还会搬出“奈奎斯特(Nyquist)”的大名。
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-11-25 07:37
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社