阅读(4301)
赞(11)
使用Kinect和其他OpenNI兼容的深度传感器
2017-09-29 11:11:37 更新
通过VideoCapture类支持与OpenNI(Kinect,XtionPRO,...)兼容的深度传感器。深度图,BGR图像和其他一些格式的输出可以通过使用熟悉的VideoCapture界面来检索。
为了在OpenCV中使用深度传感器,您应该执行以下初步步骤:
- 安装OpenNI库(从这里http://www.openni.org/downloadfiles)和用于OpenNI的PrimeSensor模块(从这里https://github.com/avin2/SensorKinect)。应对这些产品说明中列出的默认文件夹进行安装,例如:
OpenNI:
Linux & MacOSX:
Libs into: /usr/lib
Includes into: /usr/include/ni
Windows:
Libs into: c:/Program Files/OpenNI/Lib
Includes into: c:/Program Files/OpenNI/Include
PrimeSensor Module:
Linux & MacOSX:
Bins into: /usr/bin
Windows:
Bins into: 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 - 以mm为单位的深度值(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); // or CAP_OPENNI
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; // or == 1
指定所需发电机类型的标志必须与特定发电机属性结合使用。支持通过OpenNI接口提供的以下相机属性:
- 对于图像发生器:
- CAP_PROP_OPENNI_OUTPUT_MODE - 支持三种输出模式:默认使用CAP_OPENNI_VGA_30HZ(图像生成器以30 FPS的VGA分辨率返回图像),CAP_OPENNI_SXGA_15HZ(图像生成器以15 FPS的SXGA分辨率返回图像)和CAP_OPENNI_SXGA_30HZ(图像生成器以SXGA分辨率返回图像30 FPS,该模式由XtionPRO Live支持); 深度发生器的地图总是在VGA分辨率。
- 对于深度发生器:
- CAP_PROP_OPENNI_REGISTRATION - 通过更改深度生成器的视点(如果标志为“开”)将重映射深度图注册到图像映射的标志,或将此视图点设置为其正常点(如果标志为“关闭”)。注册过程的结果图像是像素对齐的,这意味着图像中的每个像素都与深度图像中的像素对齐。下一个属性可用于获取:
- CAP_PROP_OPENNI_FRAME_MAX_DEPTH - Kinect的最大支持深度(mm)。
- CAP_PROP_OPENNI_BASELINE - 基准值,单位为mm。
- CAP_PROP_OPENNI_FOCAL_LENGTH - 以像素为单位的焦距。
- CAP_PROP_FRAME_WIDTH - 帧宽度(以像素为单位)。
- CAP_PROP_FRAME_HEIGHT - 帧高度(以像素为单位)。
- CAP_PROP_FPS - FPS中的帧速率。
一些典型的标志组合“生成器类型+属性”被定义为单个标志:
- 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文件夹中openni_capture.cpp的使用示例。