OpenCV 4.13.0
开源计算机视觉库 (Open Source Computer Vision)
正在加载...
正在搜索...
未找到匹配项
使用 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 标志来配置 OpenCV 以支持 OpenNI。如果在安装文件夹中找到 OpenNI,OpenCV 将会生成 OpenNI 库(请参阅 CMake 日志中的 OpenNI 状态),而 PrimeSensor 模块可能找不到(请参阅 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); // 或 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(默认使用,图像生成器以 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 支持的最大深度(单位:毫米)。
    • 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