OpenCV 4.11.0
开源计算机视觉库
加载中…
搜索中…
无匹配项
使用Kinect及其他兼容OpenNI的深度传感器

上一教程: 使用OpenCV创建视频
下一教程: 使用Orbbec Astra 3D摄像头

通过VideoCapture类支持兼容OpenNI的深度传感器(Kinect、XtionPRO等)。可以使用VideoCapture熟悉的接口获取深度图、BGR图像和其他一些格式的输出。

为了使用OpenCV中的深度传感器,您应该执行以下初步步骤:

  1. 安装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。
  2. 通过在CMake中设置WITH_OPENNI标志来配置具有OpenNI支持的OpenCV。如果在安装文件夹中找到OpenNI,则OpenCV将使用OpenNI库构建(请参阅CMake日志中的OpenNI状态),而PrimeSensor模块可能找不到(请参阅CMake日志中的OpenNI PrimeSensor模块状态)。没有PrimeSensor模块,OpenCV将成功编译OpenNI库,但是VideoCapture对象将无法从Kinect传感器获取数据。
  3. 构建OpenCV。

VideoCapture可以检索以下数据:

  1. 深度生成器提供的数据:
    • 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)
  2. 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); // 或 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; // 或 == 1

指定所需生成器类型的标志必须与特定生成器属性结合使用。通过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_PROP_OPENNI_REGISTRATION – 通过更改深度生成器的视点(如果标志为“开启”)或将其视点设置为正常视点(如果标志为“关闭”)来将重新映射深度图注册到图像图的标志。注册过程的结果图像是像素对齐的,这意味着图像中的每个像素都与深度图像中的像素对齐。

      以下属性仅用于获取:

    • CAP_PROP_OPENNI_FRAME_MAX_DEPTH – Kinect支持的最大深度,单位毫米。
    • CAP_PROP_OPENNI_BASELINE – 基线值,单位毫米。
    • 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文件夹中的使用示例 videocapture_openni.cpp