Как получить "светоинвариантный" `captureImage` в ARKit? - PullRequest
2 голосов
/ 05 августа 2020

Я хочу сшить несколько фоновых изображений, предоставленных ARKit (ARFrame.capturedImage). (Я знаю, что есть более эффективные способы выполнить эту задачу, но я использую свой собственный алгоритм.)

Проблема в том, что прямой эфир не имеет заблокированной экспозиции, и поэтому цвет объекта в сцене зависит от на то, как я ориентирую свой iPhone. Это, например, приводит к тому, что стена имеет очень разный цвет в каждом кадре (от белого через серый до коричневого-i sh), что создает видимые полосы при сшивании изображений.

Я заметил, что ARKit предоставляет lightEstimate для каждого ARFrame со свойствами ambientIntensity и ambientColorTemperature. Существует также свойство ARFrame.camera.exposureOffset.

Можно ли использовать эти свойства для «нормализации» захваченных изображений, чтобы цвета объектов в сцене оставались примерно одинаковыми на протяжении всего времени, а я не

PS Мне нужно использовать ARKit, иначе я бы настроил свой собственный сеанс на основе AVFoundation API с моими собственными настройками (например, заблокированной экспозицией).

1 Ответ

1 голос
/ 28 августа 2020

Поскольку все упомянутые свойства не настраиваются, вы не можете использовать их напрямую для определения интенсивности каждого сшитого изображения в Panorama-360.

Но вы можете рассчитать разницу в интенсивности и экспозиции каждого кадра и затем используйте эти множители для фильтров CoreImage. Например, разница в экспозиции очень проста:

Frame_02_Exposure / Frame_01_Exposure = 0.37

Затем используйте результат в качестве входного множителя для CIExposureAdjust фильтра.

...