iPhone SDK - получить / рассчитать поле зрения камеры (FOV) (дополненная реальность)

Есть ли способ узнать или рассчитать поле зрения (FOV) камеры iPhone через вызовы API? Или это то, что вы должны физически и вручную выяснить сами?

Если его нельзя получить или рассчитать с помощью API, а вместо этого нужно жестко запрограммировать его в приложении, то каков наилучший способ выяснить, на каком устройстве работает приложение? Разные устройства имеют разные поля зрения (iPhone 4 имеет большее поле зрения, чем предыдущие версии.) Кроме того, насколько велики поля зрения каждого устройства, точно?

Я спрашиваю, потому что я думаю о создании приложения дополненной реальности, и знание поля зрения является необходимым.

5 ответов

Я сфотографировал кусок бумаги, который я измерил с расстояния, которое я также измерил. Затем я посмотрел на соотношение размера куска бумаги и его изображения на фотографии.

Мои значения были на 56 см, вы можете полностью сфотографировать (то есть, чтобы он занимал точно размер экрана) объект, который составляет около 40 см х 60 см

Пользуясь этим, я сделал несколько простых действий и достиг: Вертикальное поле зрения: 2* атан (58,5/2 / 56,5) -> ~55 градусов Горизонтальное поле зрения: 2* атан (21,5 / 2 /56,5) -> 42 градуса

Этот ответ использует некоторую математику и информацию о камере, чтобы определить значение.

Глядя на ARKit, он жестко кодирует 0,7392 радиана (42,35 градуса). Когда я исследовал AR, я просто поднял телефонную камеру и выровнял края с некоторыми ориентирами, а затем измерил угол. Моя оценка на 3GS была 48 градусов в альбомной и 39 градусов в портретной. Моя оценка на iPhone 4 - 58 в альбомной и 48 градусов в портретной.

Поиски в интернете, кажется, дико разные претензии. Это может объясняться людьми, имеющими разные модели телефона. Я не нашел официального источника информации на эту тему от Apple.

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

Мой метод оценки следующий: встаньте на 10 футов от стены и посмотрите на изображение на экране. Отметьте точки на стене с левой и правой стороны изображения и измерьте расстояние. Затем используйте тригонометрию для расчета угла. Если a - это расстояние от стены, а o - длина, измеренная вдоль стены, то tan(A) = (o/2)/a, что составляет половину угла.

ОБНОВЛЕНИЕ: я исправил некоторые неправильные вычисления и добавил iPhone 4 и то, как я измерил.

Я получаю 47.1539 градусов в длинном измерении на iPhone 3gs.

Вы можете просто спросить:

AVCaptureDevice *device = [...]
NSLog(@"FOV: %lf", device.activeFormat.videoFieldOfView);

Помните, что это горизонтальное поле зрения, и теперь для новичков у вас есть ARKit.

Если я правильно понял ваш вопрос, и вам нужно иметь fov в конфигурации ARKit — вот как вы можете его получить:

(посмотрите на поле GeometryDistortionCorrectedVideoFieldOfView)

      private func getAVCaptureDevice() -> AVCaptureDevice? {
    session.configuration?.videoFormat.value(forKey: "device") as? AVCaptureDevice
}

private func setupAVCaptureDeviceFormatWithHighestFOV() {
    
    guard let avDevice = getAVCaptureDevice() else { return }
    do {
        let activeFormat = avDevice.activeFormat
        
        var formats = avDevice.formats
        formats.sort(by: ({ $0.geometricDistortionCorrectedVideoFieldOfView > $1.geometricDistortionCorrectedVideoFieldOfView }))
        let wantedFormatWithHighestFOV = formats.first(where: ({$0.corresponds(to: activeFormat)}))
        
        // Continue from here
    } catch {
        logger.error("error: \(error)")
    }
}
Другие вопросы по тегам