奥比中光Astra SDK相机SDK openni相机成像原理

目录

1.1 成像原理简介

1.1.1 结构光

1.1.2 双目视觉

1.1.3 光飞行时间TOF​

2.使用手册

参考网址

2.1 产品集成设计

2.2 SDK介绍与使用

2.3 常用API介绍

OPENNI API

2 OpenNI类(OpenNI.h)


1.1 成像原理简介

1.1.1 结构光

结构光,英文叫做 Structured light,通常采用特定波长的不可见的红外激光作为光源,它发射出来的光经过

一定的编码投影在物体上,通过一定算法来计算返回的编码图案的畸变来得到物体的位置和深度信息。根

据编码图案不同一般有条纹结构光---enshape ,编码结构光---Mantis Vision, Realsense(F200), 散斑结构光

---apple(primesense), 奥比中光。下图是一个典型的结构光相机的示意图:

结构光(散斑)的优点主要有:

1)方案成熟,相机基线可以做的比较小,方便小型化。

2)资源消耗较低,单帧 IR 图就可计算出深度图,功耗低。

3)主动光源,夜晚也可使用。

4)在一定范围内精度高,分辨率高,分辨率可达 1280x1024,帧率可达 60FPS。

散斑结构光的缺点与结构光类似:

1)容易受环境光干扰,室外体验差。

2)随检测距离增加,精度会变差。

1.1.2 双目视觉

双目相机的主要优点有:

1)硬件要求低,成本也低。普通 CMOS 相机即可。

2)室内外都适用。只要光线合适,不要太昏暗。

但是双目的缺点也是非常明显:

1)对环境光照非常敏感。光线变化导致图像偏差大,进而会导致匹配失败或精度低

2)不适用单调缺乏纹理的场景。双目视觉根据视觉特征进行图像匹配,没有特征会导致匹配失败。

3)计算复杂度高。该方法是纯视觉的方法,对算法要求高,计算量较大。

4)基线限制了测量范围。测量范围和基线(两个摄像头间距)成正比,导致无法小型化。

1.1.3 光飞行时间TOF

TOF 的优点主要有:

1)检测距离远。在激光能量够的情况下可达几十米。

2)受环境光干扰比较小。

但是 TOF 也有一些显而易见的问题:

1)对设备要求高,特别是时间测量模块。

2)资源消耗大。 该方案在检测相位偏移时需要多次采样积分,运算量大。

3)边缘精度低。

4)限于资源消耗和滤波,帧率和分辨率都没办法做到较高。目前消费类最大也就 VGA。

双目具有良好的户外表现,但不适用纹理变化不明显的场合,如白墙;

TOF在远距离的精度更佳,但目前受限于图像分辨率低、功耗大;

结构光综合表现目前来看,在三种3D传感技术中最优,但是户外强光干扰明显和远距离处精度差

奥比中光推出了940nm波段的二代产品P1、Deeyea和双目结构光结合的产品苍龙一 号,尽可能改善结构光的固有缺陷。

2.使用手册

参考网址

https://developer.orbbec.com.cn/develop_details.html?id=1 很全

https://developer.orbbec.com.cn/technical_library.html?id=68 代码实例

https://developer.orbbec.com.cn/technical_library.html?id=70 API

SDK支持

https://developer.orbbec.com.cn/download.html?id=75&menushow=1

官网教程

https://developer.orbbec.com.cn/technical_library.html?id=22

应用例程

https://developer.orbbec.com.cn/develop_details.html?id=3

2.1 产品集成设计

深度图

不同于RGB图像,深度图中每个像素点保存的是视场范围内物体距离相机平面的深度值数据。深

度原始数据通常为16-bit unsigned int类型,单位可通过SDK指定,通常为1mm,即深度图中每个

像素点保存着16-bit无符号整型数据,单位为1mm。

为了将深度数据可视化的显示出来,通常将其转换为灰度图显示,如下图所示,不同灰度级表示

不同的深度值大小。

2.2 SDK介绍与使用

奥比中光提供的OpenNI2.3系列SDK基于OpenNI2开发,OpenNI2(开放自然交互)是一个多

语言、跨平台的框架,它定义了应用程序、中间件和3D传感设备之间的接口。

windows上位机使用前需先安装对应的驱动,具体步骤为:

1.双击【SensorDriver_V4.3.0.17.exe】进行驱动安装

2.解压OrbbecViewer上位机安装包

3.进入解压后文件夹,双击【OrbbecViewer.exe】运行上位机

Windows工程环境配置

1)适用范围

本公司SDK适用X86/X64 Windows7及以上平台

2)开发平台搭建

推荐的Windows开发平台为Visual Studio 2013或以上版本。对于Visual Studio平台,可通过以

下步骤搭建开发环境:

 新建或打开C++工程

 选择“项目——属性”,将\SDK\windows\Include目录添加到头文件依赖路径下,注意属性

配置(x86/x64)与运行时一致

在“链接器——输入”目录下新增OpenNI.lib项,完成环境配置,可以开始编辑自己的代码

了。

 注意编译运行工程时,把x64-release或者x86-release文件夹里面OpenNI文件夹以及ini和dll

文件拷贝到exe文件所在目录下,否则会闪退或报错。

2.3 常用API介绍

https://zhuanlan.zhihu.com/p/608879068

  1. OPENNI API

主要包含4个大类:

(1)openni::OpenNI

提供了一个静态的API进入点。提供访问设备,设备相关事件,版本和错误信息。首先确保连接了设备。

(2)openni::Device

提供与连接到系统的单个传感器设备的接口。需要在创建OpenNI之前先初始化它。提供了对流的访问权限。

(3)openni::VideoStream

从一个设备(Device)里提取一个视频流,需要获取视频帧引用(VideoFrameRefs)。

(4)openni::VideoFrameRef

从相关元数据中提取单个视频。从特定流获取。

除了这些主要类之外,还提供了各种支持类和结构来保存特定类型的数据。提供了一个用于将OpenNI视频流存储到文件中的记录器类。还有一些为OpenNI和Stream类可以生成的事件提供的监听器类。视频流可以使用两种基本方法之一来读取:基于循环的和基于事件的。这两种方法将在本指南的后面详细介绍

(5) PlaybackControl 类

有些操作只有在处理已记录的文件时才可能执行。这些操作包括在流中查找、确定录音的长度、循环录音以及改变播放速度。这个功能已经被播放控制类封装了。

2 OpenNI类(OpenNI.h)

  • 2.1 对设备的基本访问

(1)OpenNI::initialize() 初始化所有可用的传感器驱动程序,并扫描系统中可用的设备

(2)OpenNI::enumerateDevices() 返回已连接到系统的所有可用设备的列表

(3) OpenNI::shutdown() 关闭所有驱动程序并正确地清理

 //1.初始化
    Status rc = OpenNI::initialize();
    if (rc != STATUS_OK)
    {
        printf("Initialize failed\n%s\n", OpenNI::getExtendedError());
        return 1;
    }
    // 2.设备对象
    Device device;
    rc = device.open(ANY_DEVICE);
    if (rc != STATUS_OK)
    {
        printf("Couldn't open device\n%s\n", OpenNI::getExtendedError());
        return 2;
    }
    // 3.视频流对象
    VideoStream depth;

    if (device.getSensorInfo(SENSOR_DEPTH) != NULL)
    {
        rc = depth.create(device, SENSOR_DEPTH);
        if (rc != STATUS_OK)
        {
            printf("Couldn't create depth stream\n%s\n", OpenNI::getExtendedError());
            return 3;
        }
    }

    rc = depth.start();
    if (rc != STATUS_OK)
    {
        printf("Couldn't start the depth stream\n%s\n", OpenNI::getExtendedError());
        return 4;
    }
    // 4.循环读取一帧,getData
    int changedStreamDummy;
    VideoStream* pStream = &depth;
    VideoFrameRef frame;                  // 先定义再声明,最后使用
    const int maxFramesToProcess = 100;
    //Sentinel to count the number of frames that we've processed
    int count = 0;

    //The frame processing loop
    do {
        rc = OpenNI::waitForAnyStream(&pStream, 1, &changedStreamDummy, TIMEOUT_FOREVER);
        if (rc != STATUS_OK)
        {
            printf("Wait failed! (timeout is %d ms)\n%s\n", TIMEOUT_FOREVER, OpenNI::getExtendedError());
            continue;
        }

        rc = depth.readFrame(&frame);
        if (rc != STATUS_OK)
        {
            printf("Read failed!\n%s\n", OpenNI::getExtendedError());
            continue;
        }

        if (frame.getVideoMode().getPixelFormat() != PIXEL_FORMAT_DEPTH_1_MM && frame.getVideoMode().getPixelFormat() != PIXEL_FORMAT_DEPTH_100_UM)
        {
            printf("Unexpected frame format\n");
            continue;
        }

        DepthPixel* pDepth = (DepthPixel*)frame.getData();   //转换帧数据为DepthPixel类型的指针

        printf("[%08llu] %8d\n ", (long long)frame.getTimestamp(), pDepth[0]);

        int middleIndex = (frame.getHeight() + 1) * frame.getWidth() / 2;
        printf("[%08llu] %8d\n %8d\n %8d\n", (long long)frame.getTimestamp(), pDepth[middleIndex], frame.getHeight(), frame.getWidth());

        count++;
    } while (count < maxFramesToProcess);

    // 释放资源
    depth.stop();
    depth.destroy();
    device.close();
    OpenNI::shutdown();

    std::cout << "hit enter to exit program" << std::endl;
    system("pause");

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

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

相关文章

Elastic 8.13:Elastic AI 助手中 Amazon Bedrock 的正式发布 (GA) 用于可观测性

作者&#xff1a;来自 Elastic Brian Bergholm 今天&#xff0c;我们很高兴地宣布 Elastic 8.13 的正式发布。 有什么新特性&#xff1f; 8.13 版本的三个最重要的组件包括 Elastic AI 助手中 Amazon Bedrock 支持的正式发布 (general availability - GA)&#xff0c;新的向量…

小狐狸JSON-RPC:钱包连接,断开连接,监听地址改变

detect-metamask 创建连接&#xff0c;并监听钱包切换 一、连接钱包&#xff0c;切换地址&#xff08;监听地址切换&#xff09;&#xff0c;断开连接 使用npm安装 metamask/detect-provider在您的项目目录中&#xff1a; npm i metamask/detect-providerimport detectEthereu…

【MySQL】5.2MySQL高级语句与sql语句

模板 test、class、class0 mysql> select * from test; -------------------------------- | idcard | name | age | hobbid | -------------------------------- | 01 | lizi | 18 | guangjie | | 02 | monor | 22 | zhaijia | | 03 | sansan | …

对form表单对象中数组中的字段进行校验的方法

当对form表单中&#xff0c;数组readings中的字段进行校验时&#xff0c;prop和rules绑定要写成动态的&#xff0c;如下代码 <div v-for"(item,index) in form.readings"><el-form-item label"上次读数" > <!--prop"scds"-->…

Pytorch入门实战 P4-猴痘图片,精确度提升

目录 一、前言&#xff1a; 二、前期准备&#xff1a; 1、设备查看 2、导入收集到的数据集 3、数据预处理 4、划分数据集&#xff08;8:2&#xff09; 5、加载数据集 三、搭建神经网络 四、训练模型 1、设置超参数 2、编写训练函数 3、编写测试函数 4、正式训练 …

LabVIEW智能降噪系统

LabVIEW智能降噪系统 随着噪声污染问题的日益严重&#xff0c;寻找有效的降噪技术变得尤为关键。介绍了一种基于LabVIEW平台开发的智能降噪系统&#xff0c;该系统能够实时采集环境噪声&#xff0c;并通过先进的信号处理技术实现主动降噪&#xff0c;从而有效改善生活和工作环…

kubernetes(K8S)学习(五):K8S进阶(Lifecycle......偏理论)

K8S进阶&#xff08;Lifecycle......偏理论&#xff09; 一、Pod进阶学习之路1.1 Lifecycle1.2 重启策略1.3 静态Pod1.4 健康检查1.5 ConfigMap1.6 Secret1.7 指定Pod所运行的Node 二、Controller进阶学习之路2.1 Job & CronJob2.2 StatefulSet2.3 DaemonSet2.4 Horizontal…

vue3 渲染一个后端返回的图片字段渲染、table表格内放置图片

一、后端直接返回图片url 当图片字段接口直接返回的是图片url&#xff0c;可以直接放到img标签上 <img v-if"thumbLoader" class"r-image-loader-thumb" :src"resUrl" /> 二、当图片字段接口直接返回的是图片Id 那么就需要去拼一下图片…

改Jenkins版本号

旧服务器迁移到新&#xff0c;打包版本号更新 Jenkins.instance.getItemByFullName("双机热备").updateNextBuildNumber(65)

知识蒸馏到底怎么蒸?

1知识蒸馏简介 定义&#xff1a;知识蒸馏代表将知识从大模型向小模型传输的过程。 作用&#xff1a;可以用于模型压缩和训练加速 手段。 2基于响应的知识&#xff08;Response-Based Knowledge&#xff09; 基于响应的知识一般指的是神经元的响应&#xff0c;即教师模型的最…

前端学习<二>CSS基础——09-CSS案例讲解:博雅互动

前言 CSS已经学了一些基础内容了&#xff0c;我们来讲解一个小案例吧。以博雅互动的官网首页举例。 版心 首页的版心如下&#xff1a; 这里我们要普及一个概念&#xff0c;叫“版心”。版心是页面中主要内容所在的区域。 比如说&#xff0c;网站左上角的logo&#xff0c;设计…

IDEA2021.1.2破解无限试用30天破解IDEA

安装包下载 IDEA安装包&#xff1a;Other Versions - IntelliJ IDEA破解包下载&#xff1a;文件 密码:c033 开始激活 IDEA 2021.1.3 运行, 中间会先弹出一个注册框&#xff0c;我们勾选 Evaluate for free, 点击 Evaluate&#xff0c; 先试用30天: 注意&#xff0c;如果没有…

Tomcat项目创建 以及 在IDEA当中集成Tomcat

一: 有关Tomcat的WEB项目创建 TOMCAT项目的创建有两种方式, 第一种是利用骨架进行创建, 第二种是利用填补进行相应的创建, 不适用骨架进行创建 ,在这里主要聊第二种 (使用IDEA版本为2023) 1. 创建MAVEN项目, 非骨架形式 2.在相应的pom文件当中设置打包方式 为 war包的打包形…

LeetCode:70爬楼梯 C语言

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1a;有两种方法可以爬到楼顶。 1. 1 阶 1 阶 2. 2 阶 示例 2&#x…

敏捷教练CSM认证考了有没有用,谁说了算?

敏捷教练CSM证书是近年来备受关注的一项证书&#xff0c;它被认为可以提升敏捷开发团队的管理能力和项目执行效率。然而&#xff0c;对于这个证书的价值和含金量&#xff0c;人们的观点却不尽相同。那么&#xff0c;CSM证书到底有没有用&#xff0c;谁来说了算呢&#xff1f; 首…

java调用百度AI识别身份证照片获取信息

java调用百度AI识别身份证照片获取信息 一、前期准备1、创建账号2、获得API Key 和Secret Key 二、使用步骤1、依赖2、代码 一、前期准备 1、创建账号 2、获得API Key 和Secret Key 二、使用步骤 http调用工具用了hutool工具库 1、依赖 <!--百度身份证识别AI依赖-->&l…

论文阅读-Policy Optimization for Continuous Reinforcement Learning

摘要 我们研究了连续时间和空间环境下的强化学习( RL )&#xff0c;其目标是一个具有折扣的无限时域&#xff0c;其动力学由一个随机微分方程驱动。基于连续RL方法的最新进展&#xff0c;我们提出了占用时间(专门针对一个折现目标)的概念&#xff0c;并展示了如何有效地利用它…

qt学习第三天,qt设计师的第一个简单案例

3月25&#xff0c;应用qt设计师&#xff0c;手动设计界面形状 ​ 如何启动qt设计师&#xff0c;找到对应的安装地点&#xff0c;对应你自己安装的pyside6或其他qt的安装路径来找 ​ 应用qt设计师的优点是不用敲代码然后慢慢调节框框大小&#xff0c;位置等、可以直接修改…

知识图谱构建三要素:实体、关系与属性技术与实战全解析

目录 一、知识图谱三要素简介实体&#xff08;Entity&#xff09;的重要性关系&#xff08;Relationship&#xff09;的作用属性&#xff08;Attribute&#xff09;的应用 二、实体&#xff08;Entity&#xff09;理论介绍实体的概念细节实体的分类实体识别的技术细节实体识别的…

1.Mysql基础入门—MySQL-mysql 8.0.11安装教程

1.Mysql基础入门—MySQL-mysql 8.0.11安装教程 摘要个人简介下载Mysql安装Mysql配置环境变量 摘要 MySQL 8.0.11的安装过程涉及几个关键步骤&#xff0c;首先访问MySQL官方网站下载页面&#xff0c;选择操作系统相对应的MySQL版本进行下载。对于Windows用户&#xff0c;启动下…