首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

ARKit:增强现实技术在美团到餐业务的实践

ARKit ARKit 的 ARSession 负责管理每一帧的信息。ARSession 做了两件事:拍摄图像并获取传感器数据;对数据进行分析处理后逐帧输出。如下图: ?...从追踪的维度和准确度来看,ARWorldTrackingConfiguration 非常强悍。...不过 Metal 对于当前需求来说,有些大材小用。 SpriteKit 是 2D 渲染引擎,它提供了动画、事件处理、物理碰撞等接口,通常用于制作 2D 游戏。...ARSCNView 是 SCNView 的子类,它做了三件事: 将设备摄像头捕捉的每一帧的图像信息作为 3D 场景的背景 将设备摄像头的位置作为 3D 场景的摄像头(观察点)位置 将 ARKit 追踪的真实世界坐标轴与...借助 UIGraphics 中的一些方法可以将绘制好的 UIView 渲染成一个 UIImage 对象。根据这张图片创建 SCNPlane,以作为 SCNNode 的外观。

2.1K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    ARKit 初探

    几个重要概念 空间定位与方向追踪 这个是通过 ARCamera 获取到视频帧,再经过 VIO 计算出来的。...ARKit 从视频帧中获得某张图片的特征后,就可以从多个帧中追踪这些特征。随着用户在真实世界中的移动,就可以利用相应的特征点来估算 3D 姿态信息。...顾名思意,就是当用户点击屏幕时,ARKit 将点击屏幕的2D空间位置转换为ARKit 通过 ARCamera 捕获到的视频帧的 3D 空间位置。并在这个位置检测是否有平面。...通过 ARSession的属性currentFrame来获取。 ARConfiguration 该类的作用是设置一些 ARSession 相关的配置,如是否使用平面检测就是通过这个参数来设置的。...ARFrame 摄像头视频帧的包装类。从 ARCamera 中获取的每一幅视频帧都被封装成 ARFrame。它包含位置追踪信息、环境参数、视频帧。

    2.4K20

    iOS的GIF动画效果实现

    (2)将NSData作为ImageIO模块的输入。 (3)获取ImageIO的输出数据:UIImage。 (4)将获取到的UIImage数据存储为JPG或者PNG格式保存到本地。...第2行获取当前GIF图片的分帧个数。我们知道GIF图片都是由一帧帧图片组成的,那么这一行就是为了获取构成GIF图片的张数。...如果大家想查看最终写入的效果,可以在最后一行添加print信息,将文件写入路径打印出来,观察图像写入是否成功。...这里将上面分解的67张序列单帧图像作为需要处理的输入源进行讲述。 从功能上来说,GIF图片的合成分为以下三个主要部分。 (1)加载待处理的67张原始数据源。...本代码中将plane.gif的本地文件路径作为参数1传递给这个图片目标对象,参数2描述了图片的类型为GIF图片,参数3表明当前GIF图片构成的帧数,参数4暂时给它一个空值。

    1.3K20

    iOS 客户端动图优化实践

    基于上述的问题, 应该将逐帧加载思路应用到端内, 在动图加载到内存时, 只从二进制数据中解码第一帧; 然后在 CADisplayLink 触发时解析当前需要展示的帧, 同时合理地使用帧缓存, 避免上述...这样实现一个既支持异步加载又能逐帧解码动图组件, 下图是动图解码优化的流程, 红色字是逐帧加载的改造. 4.1.2 首帧耗时 改造完之后, 需要验证逐帧加载方案是否会在首帧加载上有所改善....根据线上统计数据, 对于优化前是否解码, 以及优化后的逐帧解码三个方案, 首帧加载平均数据如下: 相比于预先全部解码, 逐帧解码的首帧耗时降低了一半; 在灰度期间, 动图首帧加载平均耗时都在 25ms...{ int64_t memoryLimit = 0; // 获取当前内存使用数据 if (@available(iOS 13.0, *)) { task_vm_info_data_t...memoryLimit = deviceMemory * 0.55; } if (memoryLimit 获取物理内存失败, 使用可用内存作为进程可用内存

    5.9K40

    YYImage 源码剖析:图片处理技巧

    1、加载和解压 一般使用imageNamed:或者imageWithData:从内存中加载图片生成UIImage的实例,此刻图片并不会解压,当 RunLoop 准备处理图片显示的事务(CATransaction...值得注意的是,这些缓存都是全局的,并不会因为当前UIImage实例的释放而清除,在收到内存警告或者 APP 第一次进入后台才有可能会清除,而这个清除的时机和内容是系统决定的,我们无法干涉。...众多初始化方法的落脚点都是initWithData:scale:,在该方法中初始化了信号量 (作为锁)、图片解码器 (YYImageDecoder),以及通过解码器获取第一帧解压过后的图像等。...//省略判断是否是 SpriteSheet 类型来源 /*1、若上一次是 SpriteSheet 类型而当前显示的图片不是, 归位 self.layer.contentsRect */...计时任务 计时器回调方法- (void)step:(CADisplayLink *)link {...}就是调用动画的核心代码,实际上代码比较容易看懂,主要是显示当前帧图像、发起下一帧的解压任务等。

    1.4K41

    FLAnimatedImage -ios gif图片加载框架介绍

    其中一个线程负责渲染 GIF 的每一帧的图片内容(所谓的渲染,大体上就是加载 GIF 文件数据,然后抽取出来当前需要哪一帧)。这个加载图片的过程是在异步线程进行的。...然后 FLAnimatedImage 会有一个内存区域专门放置这些渲染好的帧。 这时候,在主线程中的 ImageView 会根据当前需要,从这个内存区域中读取相应的帧。...d、从数据中读取图片类型,判断该图片是不是GIF动画类型。 e、读取GIF动画中的动画信息,包括动画循环次数,有几帧图片等。.../GIF动画当前显示的帧图片索引 // The animation runloop mode....,一致就不需要继续操作了 b、设置GIF动画的封面帧图片,当前帧索引,GIF动画的循环播放次数,播放时间累加器 c、更新是否发起动画的标志位,判断是否启动GIF动画 d、刷新View的layer 参考:

    1.7K70

    SDWebImage源码阅读-第三篇

    2 sd_setAnimationImagesWithURLs 给UIImage设置animationImages,用来做帧动画。...UIImage+GIF 在介绍这个分类之前,我们要弄清一个问题,iOS展示gif图的原理: 1.将gif图的每一帧导出为一个UIImage,将所有导出的UIImage放置到一个数组 2.用上面的数组作为构造参数...sd_frameDurationAtIndex:(NSUInteger)index source:(CGImageSourceRef)source { float frameDuration = 0.1f; // 获取这一帧的属性字典...NSDictionary *gifProperties = frameProperties[(NSString *)kCGImagePropertyGIFDictionary]; // 从字典中获取这一帧持续的时间...这个方法内部会根据当前屏幕的scale决定时候添加@"2x",然后添加文件后缀,在mainBundle中找到这个文件读取出二进制然后调用方法+ (UIImage *)sd_animatedGIFWithData

    1.3K50

    FLAnimatedImage -ios gif图片加载框架介绍

    其中一个线程负责渲染 GIF 的每一帧的图片内容(所谓的渲染,大体上就是加载 GIF 文件数据,然后抽取出来当前需要哪一帧)。这个加载图片的过程是在异步线程进行的。...然后 FLAnimatedImage 会有一个内存区域专门放置这些渲染好的帧。 这时候,在主线程中的 ImageView 会根据当前需要,从这个内存区域中读取相应的帧。...d、从数据中读取图片类型,判断该图片是不是GIF动画类型。 e、读取GIF动画中的动画信息,包括动画循环次数,有几帧图片等。.../GIF动画当前显示的帧图片索引 // The animation runloop mode....,一致就不需要继续操作了 b、设置GIF动画的封面帧图片,当前帧索引,GIF动画的循环播放次数,播放时间累加器 c、更新是否发起动画的标志位,判断是否启动GIF动画 d、刷新View的layer

    3.9K90

    屏幕成像原理以及FPS优化Tips

    帧缓冲区只有一个,GPU向帧缓冲区提交渲染好的数据,视频控制器从帧缓冲区读取数据显示到屏幕上(典型的生产者—消费者模型)。这时帧缓冲区的读取和刷新都都会有比较大的效率问题。 ?...离屏渲染消耗性能的原因: GPU需要创建新的缓冲区 离屏渲染的整个过程,需要多次切换上下文环境,先是从当前屏幕缓冲区(On-Screen)切换到离屏状态(Off-Screen),等到离屏渲染结束后(即在屏幕外缓冲区把内容渲染好了...)需要将离屏缓冲区渲染的结果显示到屏幕上,又需要将上下文环境从离屏屏幕外缓冲区切换到当前屏幕(当前屏幕的缓冲区)。...这里有一个背景:屏幕视频控制器只会从屏幕对应的帧缓存中一帧一帧的取数据,而不会从其他的缓冲区中取数据,所以我们想把其他缓冲区(也就是屏幕外缓冲区)中的内容显示到屏幕上,需要把屏幕外缓冲区渲染的结果提交到屏幕的缓冲区...task.didDisplay(self, NO); }); return; } // 从当前上下文获取图片

    9.6K73

    GPUImage详细解析(十一)美颜+人脸识别

    //头部贴图 @property (nonatomic,strong) UIImage * headMap; //眼睛贴图 @property (nonatomic,strong) UIImage *...UIImage * mouthMap; //面部贴图 @property (nonatomic,strong) UIImage * facialTextureMap; GPUImage相关 GPUImageAddBlendFilter...else { r = overlay.r + base.r; } GPUImageUIElement GPUImageUIElement继承GPUImageOutput类,作为响应链的源头...但不知道是否为[self.viewCanvas setNeedsDisplay];造成的影响。 总结 demo在这里,代码较短。 因为是每帧识别,所以CPU的消耗较高。...如果是实际应用,可以考虑3~5帧左右做一次人脸识别。 还有另外一个简单的思路:把输入从摄像头变成视频,对视频进行逐帧人脸识别并吧贴图合并到视频中。

    2.2K50

    探讨iOS 图片解压缩到渲染过程

    iOS设备双缓冲机制:显示系统通常会引入两个帧缓冲区,双缓冲机制 图片显示到屏幕上是CPU与GPU的协作完成 对应应用来说,图片是最占用手机内存的资源,将一张图片从磁盘中加载出来,并最终显示到屏幕上,中间其实经过了一系列复杂的处理过程...二.图片加载的工作流程 假设我们使用 +imageWithContentsOfFile: 方法从磁盘中加载一张图片,这个时候的图片并没有解压缩; 然后将生成的 UIImage 赋值给 UIImageView...CPU计算好图片的Frame,对图片解压之后.就会交给GPU来做图片渲染 渲染流程 GPU获取获取图片的坐标 将坐标交给顶点着色器(顶点计算) 将图片光栅化(获取图片对应屏幕上的像素点) 片元着色器计算...(计算每个像素点的最终显示的颜色值) 从帧缓存区中渲染到屏幕上 我们提到了图片的解压缩是一个非常耗时的 CPU 操作,并且它默认是在主线程中执行的。...是否可以不经过解压缩,而直接将图片显示到屏幕上呢?答案是否定的。要想弄明白这个问题,我们首先需要知道什么是位图 其实,位图就是一个像素数组,数组中的每个像素就代表着图片中的一个点。

    1.7K40

    iOS开发 - 图片的解压缩到渲染过程

    iOS设备双缓冲机制:显示系统通常会引入两个帧缓冲区,双缓冲机制 图片显示到屏幕上是CPU与GPU的协作完成 对应应用来说,图片是最占用手机内存的资源,将一张图片从磁盘中加载出来,并最终显示到屏幕上,中间其实经过了一系列复杂的处理过程...二.图片加载的工作流程 假设我们使用 +imageWithContentsOfFile: 方法从磁盘中加载一张图片,这个时候的图片并没有解压缩; 然后将生成的 UIImage 赋值给 UIImageView...* CPU计算好图片的Frame,对图片解压之后.就会交给GPU来做图片渲染渲染流程 * GPU获取获取图片的坐标 * 将坐标交给顶点着色器(顶点计算) * 将图片光栅化(获取图片对应屏幕上的像素点...) * 片元着色器计算(计算每个像素点的最终显示的颜色值) * 从帧缓存区中渲染到屏幕上 我们提到了图片的解压缩是一个非常耗时的 CPU 操作,并且它默认是在主线程中执行的。...是否可以不经过解压缩,而直接将图片显示到屏幕上呢?答案是否定的。要想弄明白这个问题,我们首先需要知道什么是位图 其实,位图就是一个像素数组,数组中的每个像素就代表着图片中的一个点。

    1.7K00

    使用 iOS OpenGL ES 实现长腿功能

    一、效果展示 最终的效果,这个功能简单来说,就是实现了图片的局部拉伸,从逻辑上来说并不复杂。...因此,在每一步我们都需要拿到上一步的结果,作为原始图,进行再次调整。 这里的「原始图」就是一个纹理。换句话说,我们需要将每一次的调整结果,都重新生成一个纹理,供下次调整的时候使用。...出于对结果分辨率的考虑,我们不会直接读取当前屏幕渲染结果对应的帧缓存,而是采取「渲染到纹理」的方式,重新生成一个宽度与原图一致的纹理。 这是为什么呢?...第二步主要通过 glReadPixels 方法来实现,它可以从当前的帧缓存中读取出纹理数据。...直接上代码: // 返回某个纹理对应的 UIImage,调用前先绑定对应的帧缓存 - (UIImage *)imageFromTextureWithWidth:(int)width height:(int

    80260
    领券