上一教程: 创建 OpenCV 视频
下一教程: 使用 Orbbec Astra 3D 摄像头
通过 VideoCapture 类支持兼容 OpenNI 的深度传感器(Kinect、XtionPRO 等)。可以使用熟悉的 VideoCapture 接口检索深度图、BGR 图像和其他一些格式的输出。
要将深度传感器与 OpenCV 一起使用,您需要执行以下准备步骤:
- 安装 OpenNI 库(来自这里 http://www.openni.org/downloadfiles)和 OpenNI 的 PrimeSensor 模块(来自这里 https://github.com/avin2/SensorKinect)。安装应在这些产品的说明中列出的默认文件夹中进行,例如:
OpenNI
Linux & MacOSX
库文件位于: /usr/lib
头文件位于: /usr/include/ni
Windows
库文件位于: c:/Program Files/OpenNI/Lib
头文件位于: c:/Program Files/OpenNI/Include
PrimeSensor 模块
Linux & MacOSX
二进制文件位于: /usr/bin
Windows
二进制文件位于: c:/Program Files/Prime Sense/Sensor/Bin
如果一个或两个产品安装在其他文件夹中,用户应更改相应的 CMake 变量 OPENNI_LIB_DIR、OPENNI_INCLUDE_DIR 或/和 OPENNI_PRIME_SENSOR_MODULE_BIN_DIR。
- 通过在 CMake 中设置 WITH_OPENNI 标志来配置 OpenCV 以支持 OpenNI。如果在安装文件夹中找到 OpenNI,OpenCV 将会生成 OpenNI 库(请参阅 CMake 日志中的 OpenNI 状态),而 PrimeSensor 模块可能找不到(请参阅 CMake 日志中的 OpenNI PrimeSensor Modules 状态)。没有 PrimeSensor 模块,OpenCV 将会成功编译 OpenNI 库,但 VideoCapture 对象将无法从 Kinect 传感器捕获数据。
- 构建 OpenCV。
VideoCapture 可以检索以下数据
- 深度生成器提供的数据
- CAP_OPENNI_DEPTH_MAP - 深度值,单位为毫米(CV_16UC1)
- CAP_OPENNI_POINT_CLOUD_MAP - XYZ 坐标,单位为米(CV_32FC3)
- CAP_OPENNI_DISPARITY_MAP - 视差,单位为像素(CV_8UC1)
- CAP_OPENNI_DISPARITY_MAP_32F - 视差,单位为像素(CV_32FC1)
- CAP_OPENNI_VALID_DEPTH_MASK - 有效像素的掩码(未遮挡、未受光照等)(CV_8UC1)
- BGR 图像生成器提供的数据
- CAP_OPENNI_BGR_IMAGE - 彩色图像(CV_8UC3)
- CAP_OPENNI_GRAY_IMAGE - 灰度图像(CV_8UC1)
要从深度传感器获取深度图,请使用 VideoCapture::operator >>,例如:
VideoCapture capture( CAP_OPENNI );
for(;;)
{
Mat depthMap;
capture >> depthMap;
if( waitKey( 30 ) >= 0 )
break;
}
要获取多个数据图,请使用 VideoCapture::grab 和 VideoCapture::retrieve,例如:
VideoCapture capture(0);
for(;;)
{
Mat depthMap;
Mat bgrImage;
capture.grab();
capture.retrieve( depthMap, CAP_OPENNI_DEPTH_MAP );
capture.retrieve( bgrImage, CAP_OPENNI_BGR_IMAGE );
if( waitKey( 30 ) >= 0 )
break;
}
要设置和获取传感器数据生成器的某些属性,请分别使用 VideoCapture::set 和 VideoCapture::get 方法,例如:
VideoCapture capture( CAP_OPENNI );
capture.set( CAP_OPENNI_IMAGE_GENERATOR_OUTPUT_MODE, CAP_OPENNI_VGA_30HZ );
cout << "FPS " << capture.get( CAP_OPENNI_IMAGE_GENERATOR+CAP_PROP_FPS ) << endl;
由于支持两种类型的传感器数据生成器(图像生成器和深度生成器),因此有两个标志应用于设置/获取所需生成器的属性:
- CAP_OPENNI_IMAGE_GENERATOR – 用于访问图像生成器属性的标志。
- CAP_OPENNI_DEPTH_GENERATOR – 用于访问深度生成器属性的标志。如果未设置两个可能的属性值中的任何一个,则假定此标志值为默认值。
某些深度传感器(例如 XtionPRO)没有图像生成器。要检查这一点,您可以获取 CAP_OPENNI_IMAGE_GENERATOR_PRESENT 属性。
bool isImageGeneratorPresent = capture.get( CAP_PROP_OPENNI_IMAGE_GENERATOR_PRESENT ) != 0;
指定所需生成器类型的标志必须与特定的生成器属性结合使用。通过 OpenNI 接口可用的摄像机的以下属性是受支持的:
- 对于图像生成器
- CAP_PROP_OPENNI_OUTPUT_MODE – 支持三种输出模式:CAP_OPENNI_VGA_30HZ(默认使用,图像生成器以 30 FPS 的 VGA 分辨率返回图像)、CAP_OPENNI_SXGA_15HZ(图像生成器以 15 FPS 的 SXGA 分辨率返回图像)和 CAP_OPENNI_SXGA_30HZ(图像生成器以 30 FPS 的 SXGA 分辨率返回图像,XtionPRO Live 支持此模式);深度生成器的地图始终为 VGA 分辨率。
- 对于深度生成器
- 一些典型的“生成器类型 + 属性”组合被定义为单个标志:
- CAP_OPENNI_IMAGE_GENERATOR_OUTPUT_MODE = CAP_OPENNI_IMAGE_GENERATOR + CAP_PROP_OPENNI_OUTPUT_MODE
- CAP_OPENNI_DEPTH_GENERATOR_BASELINE = CAP_OPENNI_DEPTH_GENERATOR + CAP_PROP_OPENNI_BASELINE
- CAP_OPENNI_DEPTH_GENERATOR_FOCAL_LENGTH = CAP_OPENNI_DEPTH_GENERATOR + CAP_PROP_OPENNI_FOCAL_LENGTH
- CAP_OPENNI_DEPTH_GENERATOR_REGISTRATION = CAP_OPENNI_DEPTH_GENERATOR + CAP_PROP_OPENNI_REGISTRATION
有关更多信息,请参阅 opencv/samples/cpp 文件夹中的示例用法 videocapture_openni.cpp。