淘宝iOS拍立淘微距能力探索与实现

news2024/9/23 5:35:05

41c732ef8a7f700d0ba6ff4ec303c04f.gif

画面模糊问题的源头也是来自用户的微距体验不佳,我们对问题深入分析,适当拆解。通过 Apple Development Doc 的查阅及实践,一步步抽丝剥茧,最终完美解决用户的体验痛点,也为我们自身沉淀了展示微距的能力。

25cb89428a74e0bf189912c5665e37c1.png

前言

在最近两年苹果发布的 iPhone13 Pro Max 和 iPhone14 Pro Max 系列的手机上,如果使用三方主流 app 进行近距离对焦,会产生画面模糊的问题。拍立淘是手机淘宝相机能力的主阵地之一,用户会进行近距离拍照识别商品,或者近距离扫物流单二维码、吊牌条码、药品码等行为,类似手机系统相机的微距能力没有释放出来,会影响用户的使用体验。基于上述背景,为了优化用户体验,拍立淘 iOS 端开发团队进行了摄像头切换(微距)问题的分析和解决。

本文从原理开始分析,通过层层拆解,把「微距实现」这个命题划分成为三个主要的解决目标:变焦系数、光照水平、焦点位置的确定。并围绕链路实现、性能、适配三个层面进行可行性验证,完成微距能力的落地。

下图:图1-4为部分 app 镜头页在 iPhone13 Pro Max 的近距离对焦表现,图5为应用了微距能力的拍立淘。

31757cfbf21ed4a4bb3754421f1548cb.png

52c119c3f03b3c8616b4a6d6fd9595fe.png

背景知识


  成像原理

  • 焦距

焦距:焦距是从镜头的中心点到传感器平面上所形成的清晰影像之间的距离。镜头的焦距决定了该镜头拍摄的物体在传感器上所形成影像的大小。焦距的本质是“视角”,焦距越短,视角越大;焦距越长,视角越窄。焦距是以“mm”为单位。如下图所示是常见的焦距和可视范围。

2e25460827833c384f08b05cc9a6a497.png

为什么在我们对准某个物体的时候,有时候会出现画面的模糊,需要手动或自动对焦解决?这就要说到对焦。

对焦:当焦平面落在成像面(感光sensor)上时,图像是最清晰的。如果成像面在焦深范围之外,图像是模糊的。所以有时候为了获取清晰的成像,需要调焦。手动调焦(MF)或者是自动调焦(AF)。

282d0a81494426d8f804a46214181b2d.png

自动调焦有多种方法:测距离法、反差检测法、PDAF相位检测法等等,苹果的Focus Pixels其实就是相位差对焦技术。

33736f44bec2df60e4879268ed63dcae.png

  • 变焦

光学变焦:依靠光学镜头结构来实现变焦。通过镜片移动(焦距发生变化),来放大与缩小需要拍摄的景物,光学变焦倍数越大,能拍摄的景物就越远。光学变焦在单反相机比较常见。在手机相机中,主要是通过切换镜头来实现光学变焦的效果。

数码变焦:纯粹对一张数码照片进行放大操作,比如说,把一张10×10像素大小到图片改成15×15像素,看起来画面就大了,但这种操作是纯粹数码层面的,没有任何光学镜片介入。

下图为iPhone 14 Pro Max具有的光学变焦和数码变焦能力。即当我们使用系统相机进行0.5~3倍焦距调节时候,是光学变焦,从3-15倍焦距调节的时候,是数码变焦。

050d9e5be19a592e3b190bfe76929b63.png

  • 多摄像头

为了在手机上实现更为强大的影像效果,手机厂商走出了多摄像头组合的路线,通过在手机上集成多个不同特性的摄像头,来在手机上实现出多样化的拍摄效果,用户在拍摄界面操作变焦时不同的影像焦段交给对应的摄像头处理,焦段过渡时利用数码+光学变焦结合进行补间,通过这种方式在手机上实现了的长焦+短焦,同时再配置一些广角、大光圈、景深与色彩等特种镜头,让丰富的摄像头组合支撑出强大的多样化的手机拍摄能力。

下图为iPhone 14 Pro Max具有的多摄像头:主摄+超广角+长焦。

08a2ba7e0b76dba44f97658eef4ba7e4.png

  苹果相机

  • iPhone成像系统概览

iPhone在主摄的基础上,在设备迭代中相继加入了多摄:包括长焦镜头与超广角镜头。

其中,有如下几个重要的技术更新点:

  1. 2014年,iPhone 6 Plus摄像头首次加入镜头光学防抖;

  2. 2016年,iPhone 7 Plus首次采用双摄方案(加入长焦镜头);

  3. 2019年,iPhone 11 Pro首次采用三摄方案(加入超广角镜头);

具体图表如下(图引):

19e2ea0597c9a9fd4dec04fbd90f0ece.png

43fdd6de8eb31de7304690c7015582fe.png

  • 无法对焦的的主要原因

从 iPhone 12 Pro 系列开始,后置主摄传感器增大了许多(1.7微米超大底),而大底 Cmos 带来的问题就是,对焦距离无法做到更近。而在 iPhone 13 Pro 系列和 iPhone 14 Pro 系列机型中,苹果加入了广角微距,支持微距控制,因此这些机型理论上是支持近距离拍摄的,并且还能拍摄得非常清晰。

265f33cbd373863e77817498429e730b.png

问题分析

基于上述分析,得知苹果在硬件层面中,在带超广角的iPhone机型当中,是能够带给用户更好的微距体验。但是需要app支持。当前拍立淘业务中拍近距离物体会模糊的问题,拆解出主要有三个层面的问题待确认:

  1. 链路实现层面

    1. 不支持摄像头自动切换的原因是什么?

    2. 摄像头自动切换需要具备哪些条件?

    3. 与业务现有链路如何融合?

  1. 性能层面:

    1. 是否会造成内存的增加?

    2. 是否会造成CPU的增加?

  1. 适配层面

    1. 对于不同机型、不同系统版本,需要什么策略适配?

  链路实现层面

  • 不支持摄像头自动切换的原因是什么?

拍立淘的相机创建链路如下:

db402c5aa72eb2ec599ab84358c830bb.jpeg

其中,涉及到此问题的关键步骤为生成AVCaptureDevice

AVCaptureDevice 在整个视频采集过程中提供实现摄像头和麦克风相关初始化,并可以对摄像头进行一些基本设置,如:闪光灯、手电筒、聚焦、曝光、白平衡等一些基本设置。

原有的生成device逻辑,是调用系统方法devicesWithMediaType:,而这个方法在iOS10之后已经废弃。对于需要利用新设备上的多摄像头自动切换,使用这个接口是不能达到目的。根据API的提示,需要采用新的AVCaptureDeviceDiscoverySession:

  • 支持摄摄像头自动切换需要具备哪些条件?

要实现自动切换,就要调用新的接口。在使用方式上,我们也遇到了一些理解难点,下面是过程记录。

首先从这个新接口入手,他的入参有三个:deviceTypes、mediaType、position。其中:

  1. mediaType是设备的媒体类型。比如音频、文本等,这里自然就选择AVMediaTypeVideo。

  2. position是相机的位置是前置还是后置。根据不同的业务需要,拍立淘主要的流量场景是AVCaptureDevicePositionBack。

  3. deviceTypes是可以获取的相机设备内容。他的可选项比较多,需要根据系统版本区分选择。这次我们要解决的是微距,因此需要增加超广角的获取。我们主要把目光注意到AVCaptureDeviceTypeBuiltInDualWideCamera上,而对于不支持的设备,我们做好适配和兜底即可。

/**


AVCaptureDeviceTypeBuiltInWideAngleCamera 广角(默认设备,28mm左右焦段)


AVCaptureDeviceTypeBuiltInTelephotoCamera 长焦(默认设备的2x或3x,只能使用AVCaptureDeviceDiscoverySession获取)


AVCaptureDeviceTypeBuiltInUltraWideCamera 超广角(默认设备的0.5x,只能使用AVCaptureDeviceDiscoverySession获取)


AVCaptureDeviceTypeBuiltInDualCamera (一个广角一个长焦(如iPhone7P,iPhoneX),可以自动切换摄像头,只能使用AVCaptureDeviceDiscoverySession获取)


AVCaptureDeviceTypeBuiltInDualWideCamera (一个超广一个广角(如iPhone12 iPhone13),可以自动切换摄像头,只能使用AVCaptureDeviceDiscoverySession获取)


AVCaptureDeviceTypeBuiltInTripleCamera (超广,广角,长焦三摄像头(如iPhone11ProMax iPhone12ProMax iPhone13ProMax)可以自动切换摄像头,只能使用AVCaptureDeviceDiscoverySession获取)


AVCaptureDeviceTypeBuiltInTrueDepthCamera (红外和摄像头,能够获取景深数据(如iPhone12ProMax iPhone13ProMax))


*/

根据Apple Doc,我们对AVCaptureDeviceTypeBuiltInDualWideCamera有进一步的了解:

AVCaptureDeviceTypeBuiltInDualWideCamera(地址:https://developer.apple.com/documentation/avfoundation/avcapturedevicetypebuiltindualwidecamera?language=objc)

一种由两个固定焦距组成的设备:一个超广角和一个广角的摄像头组成的设备。

内置双摄像头支持以下功能:

  1. 当变焦系数、光照水平和焦点位置允许时,自动从一台摄像机切换到另一台摄像机。

  2. 通过测量超广角和广角相机拍摄的图像之间的差异来生成深度数据。

  3. 通过单个照片捕获请求从组成的超广角和广角设备传送照片。

这里就引出了本轮问题的解决点:

当变焦系数、光照水平和焦点位置允许时,自动从一台摄像机切换到另一台摄像机。

因此,我们知道摄像头自动切换,需要具备的条件是:变焦系数、光照水平、焦点位置在系统要求的范围内。

那么问题就限定在三个参数的阈值上。拍立淘的场景采用的自动对焦,即焦点位置不需要主动设置,会根据主体位置进行对焦。光照水平在正常环境下使用即可。因此我们只要确定变焦系数(videoZoomFactor)并实验验证。

videoZoomFactor

该属性是一个用于控制AVCaptureDevice的图像的裁剪和放大的值;它是一个乘数:例如,值 2.0 会使图像主体的大小加倍(并使视野减半)。允许的值范围从 1.0(完整视野)到活动格式AVCaptureDeviceFormat的属性videoMaxZoomFactor值。

AVCaptureDevice通过围绕传感器捕获的图像的中心进行裁剪来实现缩放效果。在低缩放系数下,裁剪的图像等于或大于输出大小。在较高的缩放系数下,设备必须将裁剪后的图像缩放到输出尺寸,从而导致图像质量下降。活动格式AVCaptureDeviceFormat的videoZoomFactorUpscaleThreshold属性指示将进行放大的因素。

方案一:

通过使用拍立淘现有变焦工具,我们得以一览在使用了AVCaptureDeviceTypeBuiltInDualWideCamera获取到device后,videoZoomFactor在1-3.5范围内的视频流预览内容情况。实验结论来看,在采用自动设置焦点位置的和变焦在2倍的情况下,会出现镜头画面的切换。视频3秒处(主摄->超广角)和9秒处(超广角->主摄),效果如下:

方案二:

方案一采用的是调参验证的方式,实际上在AVCaptureDevice的API中,就有关于这个zoomFactor准确值的取法。

/*!


@property virtualDeviceSwitchOverVideoZoomFactors


@abstract


   An array of video zoom factors at or above which a virtual device (such as the Dual Camera) may switch to its next constituent device.


@discussion


   This array contains zoom factors at which one of the constituent device's field of view matches the next constituent device's full field of view. The number of switch over video zoom factors is always one less than the count of the constituentDevices property, and the factors progress in the same order as the devices listed in that property. On non-virtual devices this property returns an empty array.


*/


@property(nonatomic, readonly) NSArray<NSNumber *> *virtualDeviceSwitchOverVideoZoomFactors API_AVAILABLE(ios(13.0), macCatalyst(14.0)) API_UNAVAILABLE(macos, tvos) API_UNAVAILABLE(watchos);

此属性包含缩放因子,其中一个组成设备的视野与下一个组成设备的整个视野相匹配。切换的视频缩放因子的个数总是比属性的个数少一个。这些缩放因子的顺序与该属性中列出的设备相同。

通过调试并打出相应的值,和我们方案一的结论相同,但这个方案更具适配性。

56f5168d114c04138596b27926aed127.png

最后,我们将session的videoZoomFactor设置为上述方案二获取的值、并设置好自动对焦、设定合适的对焦时间间隔后,对同一个场景下,使用系统相机和拍立淘镜头进行对比,我们把两个视频中,发生镜头变化的帧截取出来,并把系统相机放大至全屏对比一下:

1373d9d13ea2bb619229a426a5a17795.png

可以看出,图二和图三可以看到基本处于同一个场景下进行的镜头切换,验证了videoZoomFactor的赋值方式可行。


  • 与业务现有链路如何融合?

拍立淘镜头页有扫一扫和淘宝两个场景,增加微距能力之后,会对现有的部分能力有所影响。同时为了保证线上的稳定性。我们需要做好开关配置,整体流程如下:

6a10b9391d86a798946902e2be7632cf.png

  性能层面

打开微距可能会带来CPU和内存小幅上涨,后续我们在镜头场景控制和更精细的内存管理,能够将涨幅继续缩小。

  适配层面

适配主要是考虑不同的机型,即含有单摄、双摄、三摄的设备下,是否能够都启用这种策略,以及系统版本的过滤策略。

首先,系统获取采用哪种device,是根据传入的deviceTypes列表,按顺序依次取device。也就是说,对于设备的适配,在我们传入合适的入参之后,系统就能够帮我们做好了。

其次,OS版本判断的出发点,是因为deviceTypes的部分枚举值,是有OS的限制的,特别地,对于本文我们关注的AVCaptureDeviceTypeBuiltInDualWideCamera,是需要iOS13以上的,因此需要对系统版本做适配。

具体适配策略如图:

e85f0f7bc05e9d4f832d4ddaf9b9bb55.png

7c04151515e4d7c9aac847696b7fb49a.jpeg

效果预览

通过上述链路的开发,可以看下在拍立淘镜头页进行图搜的效果如下,在微距能力具备之前,近距离进行图搜,会因主图模糊而导致主体识别有误。

在微距优化后,因主图的清晰进而其中的各主体图也能够清晰,召回商品准确率有明显提升。

下图:商品识别的前后对比(左:不含微距能力;右:使用了微距能力)

138c98bd77b54576afb1d26840d73700.png

a1cfcf54385a6c7c6513861fc026e54d.jpeg

总结和展望

本次问题的源头也是来自用户的微距体验不佳,我们对问题深入分析,适当拆解。通过 Apple Development Doc 的查阅及实践,一步步抽丝剥茧,最终完美解决用户的体验痛点,也为我们自身沉淀了展示微距的能力。该能力无论是对于用户体验亦或是结果的召回都有着极大的改善。后续我们还会持续观测该改变带来的业务数据的提升。用户体验对于业务可以消极对待,也可以用积极的行动应对。只要有解决用户痛点的决心,相信任何微小的改变都会带来业务新的活力。

a43092e7b4cff07ac1060ca380017c68.jpeg

团队介绍

我们是大淘宝技术搜索推荐移动端团队,负责集团核心电商搜索推荐,图像视频搜索业务研发、技术平台建设、新业务和前沿技术探索等工作,我们负责的业务拥有亿级流量,能为您提供巨大的机遇和成长空间,期待您的加入。
感兴趣的同学可将简历发送到 taozi.ly@taobao.com

¤ 拓展阅读 ¤

3DXR技术 | 终端技术 | 音视频技术

服务端技术 | 技术质量 | 数据算法

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

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

相关文章

Unix和Linux

UNIX 诞生于 20 世纪 60 年代末 Windows 诞生于 20 世纪 80 年代中期 Linux 诞生于 20 世纪 90 年代初 1965 年&#xff0c;贝尔实验室、美国麻省理工学院和通用电气公司联合发起了Multics 工程计划&#xff0c;目标是开发一种交互式的、具有多道程序处理能力的分时操作系统&a…

NTP服务与SSH服务

NTP&#xff1a;时间同步服务&#xff0c;采用UDP协议&#xff0c;端口号为123。 配置NTP时间服务器&#xff0c;确保客户端主机能和服务主机同步时间 首先&#xff0c;我们必须确保服务端与客户端在同一时区。 更改时区&#xff1a;timedatectl set-timezone asia/shanghai …

隋唐洛阳“西宫”:上阳宫的GIS视角

隋唐洛阳城简介 营建 隋大业元年&#xff08;605年&#xff09;&#xff0c;在隋炀帝的授意下&#xff0c;隋代著名城市设计师宇文恺&#xff0c;在汉魏故城以西重新选址&#xff0c;历时8个月&#xff0c;日役劳工200万&#xff0c;兴建新都洛阳城。 城和苑 隋唐洛阳城采用…

页面注册案例

效果图&#xff1a; 分析业务模块&#xff1a; 发送验证码模块各个表单验证模块勾选已经阅读同意模块下一步验证全部模块&#xff1a;只要上面有一个input验证不通过就不同意提交 业务 1 &#xff1a;发送验证码 用户点击之后&#xff0c;显示05秒后重新获取时间到了&…

大国护眼学习笔记01

第一天&#xff08;23.4.17&#xff09; 2—11节什么是近视&#xff1f; 1、“近视离焦”是指成像点落在视网膜的哪里&#xff1f; 前面 2、“远视离焦”是指成像点落在视网膜的哪里&#xff1f; 后面 3、眼轴变长时&#xff0c;成像点会往前移还是往后移&#xff1f; 前移 4、…

毛灵栋 : 以兴趣为壤,育能力之实 | 提升之路系列(一)

导读 为了发挥清华大学多学科优势&#xff0c;搭建跨学科交叉融合平台&#xff0c;创新跨学科交叉培养模式&#xff0c;培养具有大数据思维和应用创新的“π”型人才&#xff0c;由清华大学研究生院、清华大学大数据研究中心及相关院系共同设计组织的“清华大学大数据能力提升项…

【RP-RV1126】Ubuntu上配置Buildroot Qt 开发板远程开发调试环境(SSH)

文章目录 一、前提二、基础设置建设Buildroot编译Qt5配置SSHBuildroot文件系统添加账号密码开发板联网Buildroot文件系统构建时打开rsync功能 三、QtCreator配置3.1 配置Qt交叉编译套件(Kits)配置Kits里面的交叉编译器配置Kits里面的qmake工具最后配置Kits 3.2 配置远程部署设备…

VLAN基础实验

实验要求&#xff1a; 1、PC1和PC3所在接口为Access接口 PC2/4/5/6处于同一网段:其中PC2可以访问PC4/5/6 PC4可以访问PC5&#xff0c;但不能访问PC6 PC5不能访问PC6 2、PC1/3与PC2/4/5/6不再同一网段 3、所有PC通过DHCP获取IP地址&#xff0c;且PC1/3可以正常访问PC2/4/5/6 实…

tkinter-TinUI-xml实战(9)crosschat客户端

tkinter-TinUI-xml实战&#xff08;9&#xff09;crosschat客户端 引言声明文件结构核心代码服务端连接登录界面主页面主文件 结语 引言 CrossChat&#xff08;十字街&#xff09;是一个线上匿名群聊平台&#xff0c;类似Hack.Chat。 现在通过websocket简单地构建一个cc的客户…

随机蛙跳算法 (SFLA)简单实现(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 随着计算机科学与技术的迅速发展,人类生存空间的扩大以及认识与改造世界范围的拓宽,人们对科学技术提出了新的和更高的要求,其…

android中线程池的选择

线程池是把一个或多个线程通过统一的方式进行调度和重复使用的技术。 避免了因为线程过多而带来使用上的开销。 在安卓开发中&#xff0c;为了更好的性能体验&#xff0c;我们在选择线程池的时候&#xff0c;需要从具体需求来考虑&#xff0c;主要考虑以下几方面&#xff1a; …

计算机类专业的普通校招生毕业如何“卷”一份好工作?

毕业差不多两年的校招生有感 一、为什么写这篇文章&#xff1f;二、我 → 一名普通的校招生前身三、我 → 一名普通的校招生养成四、校招如何拿到offer&#xff1f;五、总结 一、为什么写这篇文章&#xff1f; 一开始我写CSDN是为了记录自己学习技术的小日记&#xff0c;小总结…

JavaScript运算符与表达式

目录 一、 二、|| 三、??与?. ?? ?. 四、... 五、[] {} [] {} 一、 严格相等运算符&#xff0c;用作逻辑判断 1 1 // 返回 true 1 1 // 返回 true&#xff0c;会先将右侧的字符串转为数字&#xff0c;再做比较 1 1 // 返回 false&#xff0c;类型不等…

每日学术速递4.22

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Reference-based Image Composition with Sketch via Structure-aware Diffusion Model 标题&#xff1a;通过结构感知扩散模型与草图进行基于参考的图像合成 作者&#xff1a;Kang…

PDF转PPT:省时省力的高效方式

PDF和PPT是日常工作和学习中常见的文件格式&#xff0c;但是它们的使用场景不同&#xff0c;很多时候需要将PDF文件转换为PPT文件才能更好地展示内容。本文将介绍如何使用PDF转PPT工具来实现快速转换&#xff0c;省时省力。 一、为什么需要将PDF文件转换为PPT文件 1.PPT文件更…

English Learning - L2-15 英音地道语音语调 语调四步法 2023.04.17 周一

English Learning - L2-15 英音地道语音语调 语调 2023.04.17 周一 语调概念和汉语拼音对比 语音语调四步法语调练习意群划分重音重中之重语调的选择 语调的含义 语调概念 广义&#xff1a;语音技巧&#xff0c;连读&#xff0c;失去爆破&#xff0c;音同化&#xff0c;还有平…

如何利用AI技术实现高品质的文字转语音效果

人们越来越依赖语音技术进行交流和获取信息。语音技术可以提高工作效率和舒适度&#xff0c;减轻眼睛疲劳和阅读负担。在数字化时代&#xff0c;AI技术已经能够帮助我们实现高品质的文字转语音效果。下面我们将介绍一些方法&#xff0c;以帮助您更好地利用AI技术实现高品质的文…

Vue.js过滤器filters

目录 一、局部过滤器 二、全局过滤器 三、过滤器串联 四、过滤器接收多个参数 Vue.js允许自定义过滤器&#xff0c;过滤器的作用可被用于一些常见的文本格式化&#xff08;也就是修饰文本&#xff0c;但是文本内容不会改变&#xff09; 过滤器可以用在两个地方&#xff1a…

微信小程序开发详细步骤是什么?

微信小程序开发只需要三步&#xff0c;分别是注册小程序&#xff0c;编辑设计小程序内容和一键发布小程序zlzwgz0127。 这篇回答不介绍写代码开发小程序&#xff0c;因为更多人是不懂代码的&#xff0c;所以推荐用第三方平台开发小程序zlzwgz0127。 在开始制作小程序之前&#…

Linux基础—深入理解Linux文件系统

Linux基础—深入理解Linux文件系统与日志分析 一、inode 与 block详解1.inode 和 block 概述2.inode的内容3.inode的大小4.inode的特殊作用5.inode 的号码6.查看文件的inode 号码7.inode 耗尽故障处理 二、恢复误删除的文件1.案例&#xff1a;恢复EXT类型的文件2.案例&#xff…