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)")
}
}