【问题标题】:How to get "light-invariant" `capturedImage` in ARKit?如何在 ARKit 中获得“光照不变”的“capturedImage”?
【发布时间】:2020-08-05 17:23:39
【问题描述】:

我想拼接由 ARKit (ARFrame.capturedImage) 提供的多个背景图像。 (我知道有更好的方法来完成这项任务,但我正在使用我的自定义算法。)

问题是直播没有锁定曝光,因此场景中物体的颜色取决于我如何定位我的 iPhone。例如,这会导致墙壁在每一帧中具有非常不同的颜色(从白色到灰色到棕色),这会在将图像拼接在一起时产生可见的条纹。

我注意到 ARKit 为每个 ARFrame 提供了 lightEstimate 以及 ambientIntensityambientColorTemperature 属性。还有ARFrame.camera.exposureOffset 属性。

这些属性能否用于“标准化”捕获的图像,以使场景中对象的颜色在整个时间保持大致相同,并且不会出现严重的条纹?

附:我确实需要使用 ARKit,否则我会根据 AVFoundation API 使用我自己的设置(例如锁定曝光)来设置我自己的会话。

【问题讨论】:

  • 马丁,你找到解决这个问题的方法了吗?
  • 嗨马丁,我也想知道你是否找到了解决这个问题的方法。任何指针将不胜感激。

标签: augmented-reality arkit


【解决方案1】:

由于所有提到的属性都不可设置,因此您不能直接使用它们来修复全景 360 中每个拼接图像的强度。

但您可以计算每帧的强度和曝光度差异,然后将该乘数用于CoreImage 滤镜。比如曝光差异就这么简单:

Frame_02_Exposure / Frame_01_Exposure = 0.37

然后将结果用作CIExposureAdjust 过滤器的输入乘数。

【讨论】:

  • 安迪,你如何计算每一帧的强度和曝光度?
  • 嗨@Gogo123,试试这些——让 session = ARSession();让 expOffset = session.currentFrame?.camera.exposureOffset;让ambientLightExtimate = session.currentFrame?.lightEstimate; ambientLightExtimate?.ambientIntensity;让 dirLightExtimate = session.currentFrame?.lightEstimate 为? ARDirectionalLightEstimate; dirLightExtimate?.primaryLightIntensity;要计算当前帧和下一帧,请使用此方法 - stackoverflow.com/questions/53685090/…
  • 嗨@AndyFedoroff - 如果你在那里,我有一个简单的问题,我邀请你聊天!好心的胖子
  • 感谢@AndyFedoroff。由于我目前正在使用 YCbCr 或 RGB 颜色,您知道我在哪里可以找到一些神奇的公式来调整给定每帧强度和曝光差异的颜色吗?谢谢!
  • @Gogo123,您在与 AVFoundation 合作吗?更好的方法是在 SO 上发布一个单独的问题,其中包含您编写的所有代码。
猜你喜欢
  • 1970-01-01
  • 2021-05-17
  • 2018-04-03
  • 1970-01-01
  • 1970-01-01
  • 2018-02-22
  • 1970-01-01
  • 2012-06-10
  • 2019-04-25
相关资源
最近更新 更多