Каково реальное фокусное расстояние камеры, используемой в RealityKit?

Я делаю этот проект дополненной реальности, начиная с проекта AR по умолчанию Xcode.

Мне нужно знать фокусное расстояние камеры, используемой ARKit.

Эта страница хорошо определяет фокусное расстояние:

Фокусное расстояние, обычно выражаемое в миллиметрах (мм), является основным описанием фотографического объектива. Это не измерение фактической длины объектива, а расчет оптического расстояния от точки, где световые лучи сходятся, чтобы сформировать резкое изображение объекта, до цифрового датчика или 35-мм пленки в фокальной плоскости камеры. Фокусное расстояние объектива определяется, когда объектив сфокусирован на бесконечность.

Сказал, что Apple предлагает эту матрицу камеры, называемую встроенной, определяемой как

введите описание изображения здесь

Согласно Apple,

Значения fx и fy являются фокусным расстоянием пикселя и идентичны для квадратных пикселей. Значения ox и oy - это смещения главной точки от верхнего левого угла кадра изображения. Все значения выражены в пикселях.

Я получаю одинаковый номер для fx и fy, то есть 1515.481.

Чтобы получить реальное фокусное расстояние в миллиметрах,

  1. Это страница говорит, что мне нужно использовать эту формулу: F(mm) = F(pixels) * SensorWidth(mm) / ImageWidth (pixel) но у меня нет размеров датчика.
  2. на этой другой странице написано FC = fx/sx = fy/sy, где sx и sy - ширина и высота изображения, что, как я полагаю, даст мне два числа , потому что fx = _9 _... и это снова квадратный ноль.

На iPhone 11 ARCamera захватывает кадр со следующими размерами: 1920x1440, по крайней мере, это число указано в свойстве camera.imageResolution.

Во имя психического здоровья, есть ли способ получить фокусное расстояние ARCamera, используемое RealityKit?


person Duck    schedule 28.06.2020    source источник


Ответы (1)


ARKit и RealityKit определенно имеют одинаковые значения параметра focal length. Это потому, что эти две структуры должны работать вместе. И хотя на данный момент нет свойства экземпляра focal length для ARView, вы можете легко распечатать в консоли a фокусное расстояние для ARSCNView или SCNView.

@IBOutlet var sceneView: ARSCNView!

sceneView.pointOfView?.camera?.focalLength

Однако примите во внимание, что фреймворки ARKit, RealityKit и SceneKit не используют разрешение экрана, они скорее используют размер области просмотра. Коэффициент увеличения для окон просмотра iPhone обычно составляет 1/2 или 1/3.


Внутренняя матрица камеры

введите описание изображения здесь

Как вы сказали, в ARKit есть матрица камеры 3x3, позволяющая конвертировать между 2D-плоскостью камеры и 3D-пространством мировых координат.

var intrinsics: simd_float3x3 { get }

Используя эту матрицу, вы можете распечатать 4 важных параметра: fx, fy, ox и oy. Распечатаем их все:

DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
                    
    print(" Focal Length: \(self.sceneView.pointOfView?.camera?.focalLength)")
    print("Sensor Height: \(self.sceneView.pointOfView?.camera?.sensorHeight)")
    // SENSOR HEIGHT IN mm
                    
    let frame = self.sceneView.session.currentFrame

    // INTRINSICS MATRIX
    print("Intrinsics fx: \(frame?.camera.intrinsics.columns.0.x)")
    print("Intrinsics fy: \(frame?.camera.intrinsics.columns.1.y)")
    print("Intrinsics ox: \(frame?.camera.intrinsics.columns.2.x)")
    print("Intrinsics oy: \(frame?.camera.intrinsics.columns.2.y)")
}

Для iPhone X печатаются следующие значения:

введите описание изображения здесь

Когда вы примените свои формулы, вы получите невероятный результат (прочтите, чтобы узнать, почему).


О широкоугольном объективе и OIS

В iPhone X есть два датчика изображения, и оба модуля камеры оснащены оптическим стабилизатором изображения (OIS). Широкоугольный объектив имеет фокусное расстояние 28 миллиметров и диафрагму f/1.8, а телеобъектив - 56 мм и f/2.4.

ARKit и RealityKit используют задний модуль широкоугольного объектива. В случае с iPhone X это 28-миллиметровый объектив. Но как насчет напечатанного значения focal length = 20.78 mm, а? Я считаю, что несоответствие значений 28 mm и 20.78 mm связано с тем, что стабилизация видео съедает около 25% всей площади изображения. Это делается для того, чтобы в конечном итоге получить значение фокусного расстояния 28 mm для окончательного изображения.

введите описание изображения здесь

Красная рамка - граница обрезки на этапе стабилизации.


Заключение

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

Все мы знаем факт, что дрожание камеры усиливается с увеличением фокусного расстояния. Таким образом, чем меньше значение фокусного расстояния, тем меньше дрожание камеры. Это очень важно для качественного отслеживания мира без дрожания в приложении AR. Кроме того, я твердо уверен, что оптические стабилизаторы изображения работают намного лучше с меньшими значениями фокусного расстояния. Следовательно, неудивительно, что инженеры ARKit выбрали более низкое значение focal length для опыта AR (захват более широкой области изображения), а затем после стабилизации мы получаем модифицированную версию изображения, как и focal length = 28 mm.

Так что, по моему скромному мнению, нет смысла рассчитывать РЕАЛЬНОЕ focal length для RealityKit и ARKit, потому что есть ФЕЙК focal length, уже реализованный инженерами Apple для надежной работы с дополненной реальностью.

person Andy Fedoroff    schedule 28.06.2020
comment
Привет, @Duck, тебе удалось распечатать параметры? Я попробовал @IBOutlet var sceneView: ARSCNView! sceneView.pointOfView? .camera? .focalLength, но возникла ошибка. Последовательные объявления в строке должны быть разделены символом ';' - person swiftlearneer; 16.07.2020