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

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

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

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

  1. 安装 OpenNI 库(从这里 http://www.openni.org/downloadfiles)和 PrimeSensor Module for 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 Module
    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 标志来配置 OpenCV 对 OpenNI 的支持。如果在安装文件夹中找到 OpenNI,OpenCV 将使用 OpenNI 库构建(请参阅 CMake 日志中的 OpenNI 状态),而 PrimeSensor Modules 可能无法找到(请参阅 CMake 日志中的 OpenNI PrimeSensor Modules 状态)。如果没有 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); // 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 默认使用(图像生成器以 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

有关更多信息,请参阅 videocapture_openni.cpp 在 opencv/samples/cpp 文件夹中的用法示例。