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/libIncludes into: /usr/include/niWindows:Libs into: c:/Program Files/OpenNI/LibIncludes into: c:/Program Files/OpenNI/Include
    PrimeSensor Module:Linux & MacOSX:Bins into: /usr/binWindows: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》

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Soviet Kitchen

苏联厨房-具有道具和带有碰撞器的模块化建筑部件的游戏环境资产 内部资产包: 网格-253 前言-98 材料-26 纹理-116 网格格式-(FBX) 纹理格式-(PNG) 资产列表: _BigShelf 多边形计数-1986 文本大小-2048x2048 可以 多边形计数-277 结构尺寸-512x512 _Celling 多边形计数-1 …

STL——queue容器【队列】

queue的基本概念&#xff1a; 概念&#xff1a;queue是一种先进先出的数据结构&#xff0c;它有两个出口 queue的构造函数&#xff1a; 构造函数&#xff1a; queue<T>que:采用模板类实现&#xff0c;queue对象的默认构造形式 queue(const queue &que):拷贝构造函…

番外篇 | YOLOv8改进之利用SCINet解决黑夜目标检测问题 | 低照度图像增强网络

前言:Hello大家好,我是小哥谈。自校正照明网络(Self-Calibrating Illumination Network, SCINet)是一种基于深度学习的图像照明算法,可以自动分析图像的内容并根据图像内容自动优化照明。SCINet是一种专为低光照图像增强设计的框架。它通过级联照明学习过程和权重共享机制…

聊聊ChatGPT:智能语言模型背后的原理

目录 1. ChatGPT的基础&#xff1a;GPT模型 2. 预训练与微调&#xff1a;让模型更加智能 2.1 预训练 2.2 微调 3. 多样化的应用场景 4. 未来的展望 5. 结语 在当今的人工智能领域&#xff0c;OpenAI的ChatGPT无疑是一个炙手可热的话题。它不仅能流畅地进行对话&#xff…

CentOS 7安装配置docker

CentOS 7、8安装、配置docker 这里宿主机的型号选择是centos7.9.2009的版本 1.宿主机关闭防火墙和selinux&#xff0c;配置ipv4 #设置SELinuxdisabled vim /etc/selinux/config SELinuxdisabled 查看防火墙状态&#xff1a;firewall-cmd --state 关闭防火墙&#xff1a;syst…

66-USB 3.0 HUB电路设计

视频链接 USB3.0 HUB电路设计 第34课------USB电路设计基础 第36课------USB 2.0 HUB电路设计 第38课------USB 3.0电路设计 第40课------Type-C电路设计 1、USB HUB基本介绍 USB Hub&#xff0c;指的是一种可以将一个USB接口扩展为多个&#xff0c;并可以使这些接口同时…

每日算法之二叉树的最近公共祖先

题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个节点也可以是…

「TypeScript」TypeScript入门练手题

前言 TypeScript 越来越火&#xff0c;现在很多前端团队都使用它&#xff0c;因此咱们前端码农要想胜任以后的前端工作&#xff0c;就要更加熟悉它。 入门练手题 interface A {x: number;y: number; }type T Partial<A>;const a: T { x: 0, y: 0 }; const b: T { …

无人播剧项目怎么做,快手无人播剧全攻略,版权难题一招破解!

相信大家比较关注的问题就是快手无人直播无人播剧到底是不是真的&#xff1f;是不是骗人的&#xff1f;靠不靠谱&#xff1f;是不是真的能赚钱&#xff1f;会不会涉及到版权问题&#xff1f;等等。接下来我就给大家一一做解答&#xff01; 首先关于快手无人播剧是不是骗人的&a…

「网络流 24 题」负载平衡 【费用流】

「网络流 24 题」负载平衡 思路 首先我们从源点向每个仓库连边&#xff0c;容量为 a i a_i ai​&#xff0c;费用为 0 0 0&#xff1b;既然所有仓库物品相同&#xff0c;那么数量一定是总物品的平均值&#xff0c;我们提前算出来 a v g avg avg&#xff0c;然后从每个仓库向…

异常处理/__LINE__ 与 __FILE__ 宏在调试和异常处理中的高级使用

文章目录 概述痛点分析_LINE_ 代码所在行号_LINE_ 直接转为字符串_LINE_ 作为整型数据使用_LINE_标记宏函数的调用位置 _FILE_ 代码所在文件名简单实验不期望 _FILE_ 宏代表全路径 assert 使用了 _FILE_ 和 _LINE_借助TLS技术小结 概述 _LINE_和_FILE_是C/C中的预定义宏&#…

visual studio使用结巴分词

1.安装Jieba.NET的NuGet程序包 2.主程序代码 using JiebaNet.Segmenter; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace JiebaDemo {internal class Program{static void Main(string[] ar…

Qt---窗口系统

一、QMainWindow 1. 菜单栏(最多有一个) QMenuBar *bar MenuBar(); SetMenuBar(bar); QMenu *fileMenu bar->addMenu("文件"); 创建菜单 QAction *newAction fileMenu->addAction("新建"); 创建菜单项 添加分割线fileMenu-…

探索震坤行API:一键解锁高效工业用品采购新纪元!

震坤行是一家专注于工业用品的B2B电商平台&#xff0c;为企业客户提供一站式的工业用品采购服务。虽然震坤行没有直接公开通用的API接口供开发者调用&#xff0c;但通常大型企业或合作伙伴之间可以通过API进行系统集成和数据交互。以下是一个假设性的震坤行API接口调用示例与代…

车辆管理|基于SprinBoot+vue的4S店车辆管理系统(源码+数据库+文档)

4S店车辆管理系统 目录 基于SprinBootvue的4S店车辆管理系统 一、前言 二、系统设计 三、系统功能设计 系统实现 1管理员功能模块 2销售员功能模块 3维修员功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xf…

小猪APP分发:一站式托管服务与高效应用分发解决方案

在当今快节奏的移动应用市场中&#xff0c;开发者不仅要专注于产品的创新与优化&#xff0c;还需面对复杂的应用发布流程与激烈的市场竞争。幸运的是&#xff0c;像小猪APP分发www.ppzhu.net这样的专业平台应运而生&#xff0c;它不仅解决了开发者在应用托管与分发上的诸多痛点…

Visual Studio,第1个hello world,入门C++,分别编译一个可以在Windows和Linux下运行的程序

本人的VxTerm&#xff0c;是在Visual Studio 2022下编写的。 其它的语言工具是不是也可以那么方便的使用&#xff0c;本人并不得而知&#xff0c;至少本人能知道&#xff1a;对于我来说&#xff0c;Visual Studio可以让我觉得C/C语言非常简单&#xff01; 一、安装Visual Stu…

linux性能监控之slabtop

slabtop命令是以实时的方式显示内核slab缓冲区的细节信息&#xff0c;是linux自带的命令 [rootk8s-master ~]# slabtop --helpUsage:slabtop [options]Options:-d, --delay <secs> delay updates-o, --once only display once, then exit-s, --sort <char&…

Maven 插件使用

1.spring-boot-maven-plugin 我们直接使用 maven package &#xff08;maven自带的package打包功能&#xff09;&#xff0c;打包Jar包的时候&#xff0c;不会将该项目所依赖的Jar包一起打进去&#xff0c;在使用java -jar命令启动项目时会报错&#xff0c;项目无法正常启动。…

代码随想录——二叉树的层序遍历Ⅱ(Leetcode107)

题目链接 层序遍历&#xff08;队列&#xff09; /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, Tre…