上一教程: 使用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标志来配置具有OpenNI支持的OpenCV。如果在安装文件夹中找到OpenNI,则OpenCV将使用OpenNI库构建(请参阅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 );
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(图像生成器以VGA分辨率和30 FPS返回图像),CAP_OPENNI_SXGA_15HZ(图像生成器以SXGA分辨率和15 FPS返回图像)和CAP_OPENNI_SXGA_30HZ(图像生成器以SXGA分辨率和30 FPS返回图像,此模式受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。