上一个教程: 使用 OpenCV 创建视频
下一个教程: 使用 Orbbec Astra 3D 相机
通过 VideoCapture 类支持与 OpenNI 兼容的深度传感器(Kinect、XtionPRO、...)。深度图、BGR 图像和一些其他输出格式可以使用 VideoCapture 的熟悉界面检索到。
为了将深度传感器与 OpenCV 一起使用,应执行以下准备步骤
- 安装 OpenNI 库(从这里 http://www.openni.org/downloadfiles)和 PrimeSensor 模块(适用于 OpenNI)(从这里 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 标志,采用 OpenNI 支持配置 OpenCV。如果在安装文件夹中找到了 OpenNI,将利用 OpenNI 库构建 OpenCV(请参阅 CMake 日志中的 OpenNI 状态),而无法找到 PrimeSensor 模块(请参阅 CMake 日志中的 OpenNI PrimeSensor 模块状态)。即使没有 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 );
针对(;;)
{
Mat depthMap;
capture >> depthMap;
if( waitKey( 30 ) >= 0 )
break;
}
为了获得多个数据图,可使用 VideoCapture::grab 和 VideoCapture::retrieve,例如
VideoCapture capture(0);
针对(;;)
{
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 使用示例。