OpenCV  4.10.0
开放源码计算机视觉
正在加载...
正在搜索...
无匹配项
使用 Kinect 和其他 OpenNI 兼容深度传感器

上一个教程: 使用 OpenCV 创建视频
下一个教程: 使用 Orbbec Astra 3D 相机

通过 VideoCapture 类支持与 OpenNI 兼容的深度传感器(Kinect、XtionPRO、...)。深度图、BGR 图像和一些其他输出格式可以使用 VideoCapture 的熟悉界面检索到。

为了将深度传感器与 OpenCV 一起使用,应执行以下准备步骤

  1. 安装 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。
  2. 通过设置 CMake 中的 WITH_OPENNI 标志,采用 OpenNI 支持配置 OpenCV。如果在安装文件夹中找到了 OpenNI,将利用 OpenNI 库构建 OpenCV(请参阅 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 );
针对(;;)
{
Mat depthMap;
capture >> depthMap;
if( waitKey( 30 ) >= 0 )
break;
}

为了获得多个数据图,可使用 VideoCapture::grab 和 VideoCapture::retrieve,例如

VideoCapture capture(0); // 或 CAP_OPENNI
针对(;;)
{
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(图像生成器以 30 FPS 的 VGA 分辨率返回图像)、CAP_OPENNI_SXGA_15HZ(图像生成器以 15 FPS 的 SXGA 分辨率返回图像)和 CAP_OPENNI_SXGA_30HZ(图像生成器以 30 FPS 的 SXGA 分辨率返回图像,此模式受 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 文件夹中的 videocapture_openni.cpp 使用示例。