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

news2024/11/27 14:26:54

目录

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");

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

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

相关文章

关于POE供电你必须知道的13个问题

你们好&#xff0c;我的网工朋友。 近年来&#xff0c;PoE供电技术的发展势头越来越强劲。 凭借简化用电设备的安装和部署、节能&#xff0c;安全等一系列优势&#xff0c;PoE供电成为无线覆盖、安防监控、以及智能电网等场景的新宠。 在技术交流中&#xff0c;工程商困惑最…

Dijkstra堆优化之蓝桥王国

Dijkstra堆优化 Dijkstra算法是一种用于解决单源最短路径问题的算法&#xff0c;即从图中的一个顶点出发到所有其他顶点的最短路径。然而&#xff0c;处理大图时&#xff0c;常规的Dijkstra算法可能会遇到性能问题。这就是Dijkstra的堆优化算法派上用场的地方。在堆优化版本中…

【小黑送书—第十八期】>>让工作自动化起来!无所不能的Python(文末送书)

随着我国企业数字化和信息化的深入&#xff0c;企业对办公自动化的效率和灵活性要求越来越高。Python作为一种开源的软件应用开发方式&#xff0c;通过提供强大丰富的库文件包&#xff0c;极大地简化了应用开发过程&#xff0c;降低了技术门槛。Python开发有哪些优势、挑战以及…

如何查找合适自己的EI期刊和会议?

大家都知道EI工程索引包含期刊和会议&#xff0c;两者含金量都是比较高的&#xff0c;那么如何才能找到适合自己的EI期刊和会议?ei期刊数量众多&#xff0c;ei国际会议举办次数也是很多的&#xff0c;下面分享几种查找的渠道仅供参考&#xff1a; 渠道一、通过搜索引擎查找&am…

【蓝桥杯第十三届省赛B组】(详解)

九进制转十进制 #include <iostream> #include<math.h> using namespace std; int main() {cout << 2*pow(9,3)0*pow(9,2)2*pow(9,1)2*pow(9,0) << endl;return 0; }顺子日期 #include <iostream> using namespace std; int main() {// 请在此…

【Emgu CV教程】10.11、MatchShapes()比较轮廓的相似度

文章目录 一、函数介绍二、演示1.原始素材2.代码3.运行结果 一、函数介绍 MatchShapes()函数&#xff0c;可以比较两个轮廓的相似度&#xff0c;而且对于旋转、放大、缩小的轮廓都能适用&#xff0c;利用这个函数就能实现最简单的物体检测。函数官方定义如下 public static d…

【机器学习】代价函数

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;机器学习 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

Web应急响应

2024年护网将至&#xff0c;最近我将分享一些红蓝对抗的一些技巧&#xff0c;应急响应、信息收集相关的知识概念以及相关技巧。 目录 1. 黑客攻击流程 2. webshell流量特征 1.1.菜刀特征 1.2.冰蝎3.0 &#xff1a; 1.3.冰蝎2.0&#xff1a; 1.4.冰蝎3.11流量特征 1.5.蚁…

申请小程序https证书

背景&#xff1a;目前小程序在开发阶段是必须要使用SSL证书实现服务器https访问&#xff0c;在2017年12月30后http将无法调用微信公众平台接口&#xff0c;需要上线微信小程序的个人或企业&#xff0c;需要办理SSL证书&#xff0c;才能实现网站HTTPS化&#xff0c;让小程序顺利…

用python做一个终身免费的听书工具,一文搞定!!!

你好&#xff0c;小编有多年大厂经验&#xff0c;努力构建通俗易懂的、好玩的编程语言教程。 欢迎关注&#xff01;你会有如下收益&#xff1a; 了解大厂经验拥有和大厂相匹配的技术等 希望看什么&#xff0c;评论或者私信告诉我&#xff01; 一、前言 话说某天&#xff0c…

SCTNet 项目排坑

SCTNet 项目排坑 任务过程记录在旧环境下运行重配环境训练测试速度测试 任务 想跑一下最新的实时分割代码。由于这个项目也是基于mmsegmentation的&#xff0c;所以我想先看看之前那个环境是否能直接适配。不行&#xff0c;我再新建环境。 过程记录 在旧环境下运行 必要工作…

16-代码检查:如何进行静态代码检查?

在做Go项目开发的过程中&#xff0c;我们肯定需要对Go代码做静态代码检查。虽然Go命令提供了go vet和go tool vet&#xff0c; 今天我想给你介绍的golangci-lint&#xff0c;是目前使用最多&#xff0c;也最受欢迎的静态代码检查工具 接下来&#xff0c;我就从golangci-lint…

【数据结构】——树和二叉树相关概念(全网超级详解)

创作不易&#xff0c;家人们来一波三连吧&#xff1f;&#xff01; 前言 世界上最大的树--雪曼将军树&#xff0c;这棵参天大树不是最长也不是最宽&#xff0c;是不是很奇怪&#xff0c;大只是他的体积是最大的&#xff0c;看图片肯定是感触不深&#xff0c;大家可以自己去看…

go入门到精通

初识Go语言 Go语言介绍 Go语言是什么 2009年11月10日&#xff0c;Go语言正式成为开源编程语言家庭的一员。 Go语言&#xff08;或称Golang&#xff09;是云计算时代的C语言。Go语言的诞生是为了让程序员有更高的生产效率&#xff0c;Go语言专门针对多处理器系统应用程序的编…

vue2项目安装(使用vue-cli脚手架)

使用npm安装 安装镜像&#xff08;使npm创建项目更快&#xff09;&#xff1a;镜像可更换 npm config set registry https://registry.npmmirror.com1.全局安装vue-cli&#xff08;一次&#xff09; npm install -g vue/cli 2. 查看vue-cli 版本 vue --version 3. 创建项目…

【Pytorch学习笔记(二)】张量的创建(补充)

一、知识回顾 我们在博客《张量的创建与访问》中已经讨论了一些张量的创建方法如torch.CharTensor()、torch.FloatTensor()以及torch.zeros()等张量创建方法&#xff0c;但由于其仅仅介绍了cpu版本torch下张量的创建方法和只有具体数据类型张量&#xff0c;本节内容旨在补充gp…

数字示波器

数字示波器 综述&#xff1a;本文讲述了数字示波器的电路组成。 一&#xff0e;定义 显示电信号波形的仪器 二&#xff0e;组成 由模拟前端处理电路、电源电路、单片机电路、控制电路、触发电路、校准电路组成。 1&#xff09;模拟前端处理电路 将输入的模拟信号处理后传…

2024中国医药企业项目管理大会将于7月在京召开

“创新是企业之魂”&#xff0c;对于医药企业来说药品创新研发能力很大程度上决定了公司核心竞争力和可持续发展能力。新药研发具有高投入、高成本、高风险、高收益、长周期等特点&#xff0c;从药物的发现研发到临床试验到获批生产上市销售是一个充满风险挑战的较为漫长历程&a…

判断点在多边形内的算法

在计算几何中&#xff0c;判定点是否在多边形内&#xff0c;是个非常有趣的问题。通常有两种方法&#xff1a; 一、Crossing Number&#xff08;交叉数&#xff09; 它计算从点P开始的射线穿过多边形边界的次数。当“交叉数”是偶数时&#xff0c;点在外面;当它是奇数时&…