OpenCV使用 Kinect 和其他兼容 OpenNI 的深度传感器(75)

 返回:OpenCV系列文章目录(持续更新中......)
上一篇:使用 OpenCV 创建视频(74)
下一篇 :OpenCV使用 Orbbec Astra 3D 相机(76)

目的:​

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

为了将深度传感器与 OpenCV 一起使用,您应该执行以下初步步骤:

  1. 安装OpenNI库(从这里 Apple)和PrimeSensor模块(从这里 GitHub - avin2/SensorKinect: PrimeSensor Modules for OpenNI)。安装应对这些产品说明中列出的默认文件夹进行,例如:
  1. 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

  2. 如果一个或两个产品都安装到其他文件夹,则用户应更改相应的 CMake 变量 OPENNI_LIB_DIR、OPENNI_INCLUDE_DIR 或/和 OPENNI_PRIME_SENSOR_MODULE_BIN_DIR。
  3. 通过在 CMake 中设置 WITH_OPENNI 标志来配置支持 OpenNI 的 OpenCV。如果在安装文件夹中找到 OpenNI,则 OpenCV 将使用 OpenNI 库构建(请参阅 CMake 日志中的 OpenNI 状态),而找不到 PrimeSensor 模块(参见 CMake 日志中的 OpenNI PrimeSensor 模块状态)。如果没有PrimeSensor模块,OpenCV将使用OpenNI库成功编译,但VideoCapture对象不会从Kinect传感器抓取数据。
  4. 构建 OpenCV。

VideoCapture 可以检索以下数据:

  1. 深度生成器给出的数据:
    • 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)
  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(图像生成器以 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示例。


参考文献:

1、《Using Kinect and other OpenNI compatible depth sensors》

相关推荐

  1. win10清华源按装OPENCV其他软件

    2024-05-11 13:34:05       16 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-11 13:34:05       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-11 13:34:05       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-11 13:34:05       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-11 13:34:05       20 阅读

热门阅读

  1. 2024届SLAMer秋招算法岗面试题总结

    2024-05-11 13:34:05       11 阅读
  2. 简化 KNN 检索【翻译】Simplifying kNN search

    2024-05-11 13:34:05       11 阅读
  3. Milvus基本概念

    2024-05-11 13:34:05       12 阅读
  4. [排序算法]基数排序

    2024-05-11 13:34:05       10 阅读
  5. ROS——Action学习

    2024-05-11 13:34:05       9 阅读
  6. vue-video-play使用之播放hls格式视频

    2024-05-11 13:34:05       15 阅读
  7. React 学习-6-列表 & keys

    2024-05-11 13:34:05       11 阅读