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》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/613287.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

力扣HOT100 - 215. 数组中第K个最大元素

解题思路&#xff1a; 快速选择&#xff0c;目标是找出数组中第 k 小&#xff08;或第 k 大&#xff09;的元素&#xff0c;而不是对整个数组进行排序。 &#xff08;需要和快排进行区分&#xff0c;快排的目的是排序&#xff09; 注意&#xff1a; i l - 1, j r 1; 为什…

leetcode刷题指南

本文我将分享给大家一套我自己使用良久并觉得非常高效的 学习论&#xff0c;它可以运用到 Leetcode 上的刷题&#xff0c;也可以 generalize 到生活中涉及到学习以及记忆的方方面面。当然&#xff0c;本文将以 Leetcode 刷题为 case study 去进行讲解。 更具体一点, 我会教大家…

鸿蒙OpenHarmony开发板解析:【系统能力配置规则】

如何按需配置部件的系统能力 SysCap&#xff08;SystemCapability&#xff0c;系统能力&#xff09;是部件向开发者提供的接口的集合。 开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 部件配置系统…

Received Signals.SIGHUP death signal, shutting down workers

单机多卡训练大模型的时候&#xff0c;突然报错&#xff1a; 3%|▎ | 146/4992 [2:08:21<72:57:12, 54.20s/it][2024-05-10 13:27:11,479] torch.distributed.elastic.agent.server.api: [WARNING] Received Signals.SIGHUP death signal, shutting down workers [2…

Java转Kotlin调用JNI方法异常

一、背景 Java调用JNI方法时没有任何问题&#xff0c;但是使用Java转Kotlin以后出现了崩溃异常&#xff1a;A java_vm_ext.cc:597] JNI DETECTED ERROR IN APPLICATION: jclass has wrong type: 校验参数后没有任何变化&#xff0c;经过分析验证找到解决方案 二、原因…

Java入门基础学习笔记16——运算符

package cn.ensource.operator;public class OperatorDemo1 {public static void main(String[] args) {// 目标&#xff1a;掌握基本的算术运算符的使用int a 10;int b 2;System.out.println(a b);System.out.println(a - b);System.out.println(a * b); // 20System.out.…

4步快速配置Java、MySQL、Maven环境(windows)

每次入职一家新公司或者用一台其他的临时电脑或者新电脑时都要重新配置Java开发环境&#xff0c;很麻烦&#xff0c;因此我在这里记录一下快速配置环境的方式&#xff0c;四步搞定&#xff01;此处以win为操作系统进行讲解。 第一步&#xff1a;下载链接 下载链接&#xff1a…

【半夜学习MySQL】数据库中的数据类型(含数值类型、文本二进制类型、时间类型、String类型详谈)

&#x1f3e0;关于专栏&#xff1a;半夜学习MySQL专栏用于记录MySQL数据相关内容。 &#x1f3af;每天努力一点点&#xff0c;技术变化看得见 文章目录 数据类型分类数值类型bit类型tinyint类型int类型float类型decimal类型 文本、二进制类型char类型varchar类型 时间类型Strin…

51单片机入门:串口通信

串行通信的初步认识 通信方式分类 1、按照数据传送方式&#xff1a; 并行通信&#xff1a;通信时数据的各个位同时传送&#xff0c;可以实现字节为单位的通信。 但是通信线多&#xff0c;占用资源多&#xff0c;成本高。 串行通信&#xff1a;一次只能发送一位&#xff0c…

机器学习-Numpy

机器学习-Numpy 如果一个人拒绝提高自己的思想觉悟&#xff0c;那么他只能处在弱小、可怜、凄惨的境地。 目录 机器学习-Numpy 1.Numpy&#xff1a;生成矩阵 做矩阵运算 1&#xff09;创建矩阵 ①使用列表创建 ②使用元组创建 2&#xff09;矩阵取值 3&#xff09;numpy…

【栈】Leetcode 字符串解码

题目讲解 394. 字符串解码 算法讲解 这道题有四种情况&#xff1a;1.遍历的时候遇到数字&#xff0c;我们计算并保存数字&#xff0c;将它加入到数字栈中&#xff1b;2.遍历的时候遇到[&#xff0c;我们就把字符保存&#xff0c;加入到字符栈中&#xff1b;3.当遇到]&#x…

全栈开发之路——前端篇(9)插槽、常用api和全局api

全栈开发一条龙——前端篇 第一篇&#xff1a;框架确定、ide设置与项目创建 第二篇&#xff1a;介绍项目文件意义、组件结构与导入以及setup的引入。 第三篇&#xff1a;setup语法&#xff0c;设置响应式数据。 第四篇&#xff1a;数据绑定、计算属性和watch监视 第五篇 : 组件…

【2024亚马逊云科技峰会】Amazon Bedrock + Llama3 生成式AI实践

在 4 月 18 日&#xff0c;Meta在官网上公布了旗下最新大模型Llama 3。目前&#xff0c;Llama 3已经开放了80亿&#xff08;8B&#xff09;和700亿&#xff08;70B&#xff09;两个小参数版本&#xff0c;上下文窗口为8k&#xff0c;据称&#xff0c;通过使用更高质量的训练数据…

HTML实现3D相册

目录 写在前面 HTML简介 完整代码 代码分析 注意事项 系列推荐 写在最后 写在前面 本期小编给大家推荐一个炫酷的3D相册&#xff0c;可以更换照片哦&#xff0c;一起来看看吧~ HTML简介 HTML&#xff0c;即HyperText Markup Language&#xff0c;是一种广泛应用的超文…

扩展van Emde Boas树以支持卫星数据:设计与实现

扩展van Emde Boas树以支持卫星数据&#xff1a;设计与实现 1. 引言2. vEB树的基本概念3. 支持卫星数据的vEB树设计3.1 数据结构的扩展3.2 操作的修改3.3 卫星数据的存储和检索 4. 详细设计和实现4.1 定义卫星数据结构体4.2 修改vEB树节点结构4.3 插入操作的伪代码4.4 C语言实现…

GPIO输出速度(ARM-GD32)

单片机输出速度对GPIO硬件的影响 如果T为100ns 那么2/3*100ns 67ns 那么tr tf 38 ns &#xff08;也就是不能超过32ns&#xff09; tr 和tf和什么东西有关如何去控制 CL 是一个电容&#xff0c;电容会改变和影响电压变化的速率&#xff0c;输出高低电平也就是对电容进行充电…

【DDR 终端稳压器】Sink and Source DDR Termination Regulator [A]

Sink Source 这两个词被翻译的有点混乱了&#xff0c;有点“输入”“输出”的意思&#xff0c;但是还是不准确&#xff1b; 1 Sink 去到英英词典看看&#xff0c;母语是怎么介绍的吧。 to go down below the surface or towards the bottom of a liquid or soft substances…

uniapp 版本检查更新

总体来说uniapp的跨平台还是很不错的&#xff0c;虽然里面各种坑要去踩&#xff0c;但是踩坑也是开发人员的必修课和成长路。 这不&#xff0c;今天就来研究了一下版本检查更新就踩到坑了。。。先来看看检查更新及下载、安装的实现。 先来看看页面&#xff1a; 从左到右依次为…

了解 条码工具 Dynamsoft 在条码读取器中的形态运算

在图像处理中&#xff0c;术语形态学是指分析形状以填充小孔、去除噪声、提取轮廓等的一组操作。形态学操作很像空间卷积中的过滤过程。有两个部分在起作用&#xff1a;结构元素和预定义的计算规则。 点击下载Dynamsoft最新版https://www.evget.com/product/3691/download 结…

块元素、内联元素、行内块元素

一、介绍&#xff1a; CSS元素划分成块元素、行内元素&#xff08;内联元素&#xff09;、行内块元素等多种常用类型。也就是说&#xff1a;在CSS中&#xff0c;元素根据其在页面上的布局方式被分为不同的显示类型。 背景&#xff1a;HTML负责定义网页的结构和内容&#xff0c…