上个月,客户帮我租了一台 2020 款 11寸 iPad Pro,为了在 iPad 上实现一个室内三维重建的APP。以我的方式,我需要先离线在主机上实现一个三维重建的程序。

为了给客户节约成本,我找到了一种简单的方式。使用来自于 Github 上的一个开源代码,可以仅通过 USB-C 连接线,在主机上就可以做到 保存 / 可视化 实时的 RGB-D 帧。毕竟租或者买一台 iMac 或者 Mac mini 挺贵的,所以我用的还是 Windows 10 系统主机。

Record3D – Point Cloud Animation and Streaming: the accompanying library

https://github.com/marek-simonik/record3d

需要先在主机安装 iTunes,iPad 上安装 Record3D APP。然后将 iPad 和主机通过 USB-C 线连接起来。

在 Record3D APP 中,需要设置 USB Streaming Mode Enabled,帧率设置为 30 帧/秒 也没问题。

打开 Record3D。

点击红色录像键。出现下面这样的状态。

就可以运行主机上的代码了。

先看一下我自己写的程序的效果。这里打开的是 FaceID 那个摄像头。

石膏像和 iPad 之间的位置大概如下。

接下来,我们看如何用 C++ 代码可视化 RGBD Stream / Cloud。

我的代码主要借鉴于上面提到的 Github 上的代码。其中使用的数据结构基本类似。Github 上的代码稍显复杂。我按照之前 Azure Kinect 系列的代码把 Record3D 的 Github 代码重新实现了一遍。

我基本没有接触过 iOS 的开发,也没有查询过关于 iPad Pro  2020 款的 Depth Sensor 的一系列硬件参数,以及相关 API。所以,下面的代码完全基于 Record3D APP 的相关输出。我在这篇文章里,默认其输出的是 iPad Pro 的原始数据。

先简单说明一下,这里使用的几个第三方库。

LZFSE: This is a reference C implementation of the LZFSE compressor introduced in the Compression library with OS X 10.11 and iOS 9

https://github.com/lzfse/lzfse

LZFSE 是一个压缩/解压库,专门用于 OSX 输出的数据。这里处理的是 iPad Pro 输出的压缩的 Depth Frame

stb_image.h         image loading/decoding from file/memory: JPG, PNG, TGA, BMP, PSD, GIF, HDR, PIC

https://github.com/nothings/stb

STB 是一系列只用一个头文件处理一类事情的第三方库。这里我们用的是 stb_image.h,用于读取 Color Frame。iPad Pro 输出的 Color Frame 也是压缩过的,我们使用 stb_image 从 Buffer 中读取 Color Frame Buffer,并解压。

libimobiledevice-vs: includes libplist, libusbmuxd.

https://github.com/libimobiledevice-win32/libimobiledevice-vs

libimobiledevice 用来主机和 iPad Pro 之间传输数据。可以识别 iPad Pro 型号,实时传输 iPad Pro 输出的 Buffer 到主机。主要使用了 libusbmuxd

首先,我们先准备一系列数据以及数据结构。

几个结构体。

IntrinsicMatrixCoeffs 表示每一 RGB-D 帧对应的内参数。

DeviceInfo 表示该 iPad Pro 的连接信息。

PeerTalkHeader 是 Record3D APP 特有的数据结构,大概是 PeerTalk 的数据头结构体。

Record3DHeader 是 Record3D APP 特有的数据结构,用于表示 RGB-D Buffer 中 Color 和 Depth Buffer 的尺寸信息。

几个常量。

DEVICE_PORT: 1337。USB - TCP 端口号。

MAXIMUM_FRAME_WIDTH: 480MAXIMUM_FRAME_HEIGHT: 640。iPad Pro 输出的 RGB-D 帧的尺寸最大:宽 480 * 高 640。我这里的测试结果是前置摄像头 FaceID 的 RGB-D 帧尺寸为 480 * 640,后置 Lidar 摄像头的 RGB-D 帧尺寸为 192 * 256

iPad Pro 输出的 Depth 帧的每个像素存储的数据为 float 型的距离值,单位为 米m。Color 帧的每个像素存储的数据为三个 uint8_t 型的颜色向量。如代码中的 depthBufferSizecolorBufferSize,以及 currentFrameRGBcurrentFrameDepth。

几个函数。

定义了一个函数 NTOHL_(n)。将一个无符号长整形数从网络字节顺序转换为主机字节顺序。因为我们使用的主机和 iPad 交互方式为 USB 转 TCP,按照网络字节的传输方式。

ReceiveWholeBuffer 函数。根据 socket,接收当前 USB 传输过来的 Buffer。

DecompressDepthBuffer 函数。把压缩过的 depth buffer 解压为正常尺寸的 depth buffer。

  • 使用 OpenCV 保存/可视化 RGBD Stream

我们一点点解释。

使用 usbmuxd 通过 USB 接口读取 iPad 硬件信息。

这段代码逻辑其实非常简单。

while(1) 无限循环输出实时 RGB-D 帧中的 Color + Depth。

每一段 RGB-D Buffer 都包含五段内容:

PeerTalkHeader + Record3DHeader + IntrinsicMatrixCoeffs + Color Buffer + Depth Buffer

一段一段的从 RGB-D Buffer 中截取下来保存到相应的变量中。

使用 stbi_load_from_memory 函数读取 Color Buffer 并解压。

使用 DecompressDepthBuffer 函数读取 Depth Buffer 并解压。

需要注意的是,前置 FaceID 和 后置 Lidar 的帧是左右相反的。在 FaceID 和 Lidar 之间进行切换时,需要把 cv::Mat 左右翻转一下。

我们看一下 Color Frame 和 Depth Frame 效果吧。

前置 FaceID 效果。

后置 Lidar 效果。

注意到,前后摄像头的帧大小不同。前置 480 * 640,后置 192 * 256

  • 使用 PCL 可视化点云

这部分代码主要基于前一篇文章。这里就不完全列出所有代码了。

使用 PCL 实时显示点云。

无雨森,公众号:无雨森的技术分享使用 PCL 的简易 Azure Kinect 点云 Viewer

声明一些变量,基本和上述文章介绍的一样。

frameRetriever 函数

这里的 while(1) 循环里面的代码大部分和刚才 OpenCV 中的代码一样。

visualize 函数。

这里的 visualize 函数里面的代码逻辑完全和上面说到的文章中的代码一样。

主要的不同在于 convertRGBDepthToPointXYZRGB 函数。

这里的原理在于使用内参把 Depth Frame 转为 点云。

公式为

在这个函数中,我针对 FaceID 或者 Lidar 使用了不同的距离范围。

经过我的测试,FaceID 在 1m 范围内比较准确。也就是对于 FaceID 面前的人脸比较准确。如下面的动图。

在这里提醒一下,FaceID 的 RGB-D 视频流中每一帧的内参都是一样的,但是 Lidar 的 RGB-D 视频流中每一帧的内参都有一定的区别,所以每一帧的点云都要重新设置内参,输出点云。

我在之前的文章中实现过实时的从两个 Azure Kinect 的视频流中提取平面并融合的效果。

两台 Azure Kinect 实时 RGB-D 视频流中提取平面并融合。

无雨森,公众号:无雨森的技术分享使用 PCL 的简易 Azure Kinect 点云 Viewer

如下动图。

我们可以看到目之所及的所有平面结构都被识别出来了。

但是,后置 Lidar 的深度精度并没有那么好。

同样的区域,大概只能识别 1 ~ 2 个平面结构。

如果能跟客户继续合作,或者各位富有大佬提供我设备。那么后续使用 iPad Pro 实现实时三维重建系统的系列应该还会继续更新。

如果有进一步商业合作,请联系我。

opencv读取usb摄像头_2020 款 11寸 iPad Pro 深度摄像头 RGBD 视频流可视化相关推荐

  1. 大疆妙算Manifold刷机换源,cuda,opencv,qt配置以及实现opencv读取usb摄像头,qmake nvcc交叉编译

    大疆妙算Manifold刷机换源,cuda,opencv,qt配置以及实现opencv读取usb摄像头,qmake nvcc交叉编译 一.刷机 1.解压安装包 2.制作镜像 3.然后按照妙算说明书进入 ...

  2. 2010款15寸Macbook Pro GPU panic崩溃问题解决方案

    本人拥有一台2010款15寸Macbook Pro笔记本电脑,自己动手升级了内存(8G),SSD硬盘(128G).赶着最新的潮流升级为最新版的MacOS 10.13,确实如广告宣称的:操作流畅.然而好 ...

  3. Orbbec astra pro深度摄像头通过python读取深度值

    Orbbec astra pro深度摄像头通过python读取深度值 Orbbec OpenNi SDK下载 安装对应python包 对应代码 Orbbec OpenNi SDK下载  要使用OPen ...

  4. 20款13寸MacBook Pro GB5跑分已有,13寸MacBook Pro 2020版是否值得入手!

    在GB网站上的零星跑分已经出来,想知道20款13寸MacBook Pro GB5跑分多少吗?13寸MacBook Pro 2020版是否值得入手吗? 2020款13" MacBook Pro ...

  5. 乐视体感astra pro深度摄像头在ros系统获取 深度图像 彩色图像 无色彩点云数据 彩色点云数据

    1.astra pro深度摄像头介绍 2.astra pro驱动安装 3.astra pro获取深度图像   无色彩pointCloud2 4.astra pro获取彩色图像  带彩色的pointCl ...

  6. 苹果平板可以用html么,9.7寸ipad pro能用pencil吗?ipad pro全面支持Apple Pencil

    Apple Pencil是专为iPad Pro设计的一款电容笔,看似一支普通的铅笔,但可以根据压力度进行不同程度的绘画和涂色.目前,9.7英寸的iPad Pro上市后,是否支持Pencil呢? 9.7 ...

  7. ipad9.7 能搭建php,9.7寸ipad pro能用pencil吗?ipad pro全面支持Apple Pencil

    Apple Pencil是专为iPad Pro设计的一款电容笔,看似一支普通的铅笔,但可以根据压力度进行不同程度的绘画和涂色.目前,9.7英寸的iPad Pro上市后,是否支持Pencil呢? 9.7 ...

  8. tof摄像头手势识别_揭秘国内独家TOF深度摄像头,助力机器人避障与室内导航

    揭秘国内独家TOF深度摄像头,助力机器人避障与室内导航 2018-09-11 TOF深度摄像头利用光的飞行时间测量距离,能够实时快速的计算深度信息,进行准确的三维探测,是实现机器人避障和室内定位与导航 ...

  9. Python OpenCV 读取USB摄像头报错问题解决

    报错信息: Traceback (most recent call last):   File "G:\Python图像识别相关学习视频\人体姿势检测.py", line 32, ...

最新文章

  1. 高可用的Spring FTP上传下载工具类(已解决上传过程常见问题)
  2. ubuntu配置ipv6
  3. 《网站分析师实战指南》一1.4 进入实战之路
  4. ERROR 1222 (21000): The used SELECT statements have a different number of columns :
  5. ABAP事务码SAT里的Gross time and net time
  6. oAuth2.0 登录新浪微博 发送新浪微博 代码
  7. 4.4)深度卷积网络:人脸识别和神经风格转换
  8. iframe跨域通信的通用解决方案-第二弹!(终极解决方案)
  9. 重磅!普惠AI--华为云语音语义万次调用1元购,有奖问答@评论区等你来!
  10. Spark DataSource API
  11. ARM 架构演进对未来计算意味着什么?
  12. Optical Flow related Tutorials
  13. 将Go的main包拆分为多个文件
  14. 迈普路由器访问控制列表配置命令_迈普路由器配置命令集合
  15. 什么是IDS和IPS
  16. 万年历/节假日/日历API
  17. CDH安装过程中出现:主机 cdh04 上的内存被调拨过度。总内存分配额是 4.0 艾字节 个字节,但是 RAM 只有 62.8 吉字节 个字节(其中的 12.6 吉字节 个字节是保留给系统使用的)。
  18. FlinkSql系列5之 Regular Join
  19. 巨蟒django之CRM1 需求分析表结构设计注册登录验证
  20. php pdo 与对比mysql,php使用mysqli和pdo扩展,测试对比连接mysql数据库的效率完整示例...

热门文章

  1. 【Java】Java调用shell脚本
  2. 【Spring】Spring 父子容器
  3. 【Flink】Flink 使用 ParameterTool 进行传参
  4. 【Java】java代理 静态代理 动态代理 proxy
  5. 免责协议怎么写_离婚后房产过户协议怎么写?需要公证吗?
  6. 字符串拼接,什么时候会走StringBuilder?
  7. Oracle数据字典全解 (1)
  8. hbase里面命令行删除_HBase实践 | HBase疑难杂症诊治
  9. linux网络IO模型
  10. 面向对象2(待补充)