Начальный контекст
Я разрабатываю приложение приложения расширенной реальности, и мне нужно получить поле зрения [FOV] (я просто обновляю значение, когда меняется ориентация, поэтому я ищу метод, который может получить это значение при вызове она)
Цель состоит в том, чтобы сделать "правителя степени" применимым к реальности следующим образом:
Я уже использую AVCaptureSession
для отображения потока камеры; и путь, связанный с a CAShapeLayer
, чтобы нарисовать линейку. Это работает очень хорошо, но теперь я должен использовать значение поля поля для размещения моего элемента в нужном месте (например, выберите подходящее пространство между 160 и 170 °!).
На самом деле, я жестко кодирую эти значения с помощью этих источников: qaru.site/info/191081/... (Особая благодарность @hotpaw2!) Но я не уверен, что они полностью точны, и это не обрабатывает iPhone 5 и т.д. Мне не удалось получить значения из официальных источников (Apple!), но есть ссылка, показывающая значения для всех iDevice, которые мне кажутся мне (4, 4S, 5, 5S): AnandTech | Некоторые мысли о улучшениях камеры iphone 5s.
Примечание. После личного тестирования и некоторых других исследований в Интернете, я уверен, что эти значения неточны! Кроме того, это заставляет меня использовать внешнюю библиотеку, чтобы проверить, какую модель iPhone я использую для ручной инициализации моего FOV... И мне нужно проверить мои значения для всех поддерживаемых устройств.
Я бы предпочел "решение для кода"!
После прочтения этого сообщения: iPhone: информация о цвете видео в реальном времени, фокусное расстояние, диафрагма?, я пытаюсь получить exif data
из AVCaptureStillImageOutput, как это было предложено. После чего я смог бы прочитать фокусное расстояние из данных exif, а затем вычислить горизонтальное и вертикальное поле зрения по формуле! (Или, возможно, непосредственно получить FOV, как показано здесь: http://www.brianklug.org/2011/11/a-quick-analysis-of-exif-data-from-apples-iphone-4s-camera-samples/ -
note: после определенного количества обновлений, кажется, что мы не можем получить прямое поле зрения из exif!)
Фактическая точка
Источники: http://iphonedevsdk.com/forum/iphone-sdk-development/112225-camera-app-working-well-on-3gs-but-not-on-4s.html и Измененные данные EXIF не сохраняется должным образом
Вот код, который я использую:
AVCaptureDevice* camera = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
if (camera != nil)
{
captureSession = [[AVCaptureSession alloc] init];
AVCaptureDeviceInput *newVideoInput = [[AVCaptureDeviceInput alloc] initWithDevice:camera error:nil];
[captureSession addInput:newVideoInput];
captureLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:captureSession];
captureLayer.frame = overlayCamera.bounds;
[captureLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill];
previewLayerConnection=captureLayer.connection;
[self setCameraOrientation:[[UIApplication sharedApplication] statusBarOrientation]];
[overlayCamera.layer addSublayer:captureLayer];
[captureSession startRunning];
AVCaptureStillImageOutput *stillImageOutput = [[AVCaptureStillImageOutput alloc] init];
NSDictionary *outputSettings = [[NSDictionary alloc] initWithObjectsAndKeys: AVVideoCodecJPEG, AVVideoCodecKey, nil];
[stillImageOutput setOutputSettings:outputSettings];
[captureSession addOutput:stillImageOutput];
AVCaptureConnection *videoConnection = nil;
for (AVCaptureConnection *connection in stillImageOutput.connections)
{
for (AVCaptureInputPort *port in [connection inputPorts])
{
if ([[port mediaType] isEqual:AVMediaTypeVideo] )
{
videoConnection = connection;
break;
}
}
if (videoConnection) { break; }
}
[stillImageOutput captureStillImageAsynchronouslyFromConnection:videoConnection
completionHandler:^(CMSampleBufferRef imageSampleBuffer, NSError *error)
{
NSData *imageNSData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageSampleBuffer];
CGImageSourceRef imgSource = CGImageSourceCreateWithData((__bridge_retained CFDataRef)imageNSData, NULL);
NSDictionary *metadata = (__bridge NSDictionary *)CGImageSourceCopyPropertiesAtIndex(imgSource, 0, NULL);
NSMutableDictionary *metadataAsMutable = [metadata mutableCopy];
NSMutableDictionary *EXIFDictionary = [[metadataAsMutable objectForKey:(NSString *)kCGImagePropertyExifDictionary]mutableCopy];
if(!EXIFDictionary)
EXIFDictionary = [[NSMutableDictionary dictionary] init];
[metadataAsMutable setObject:EXIFDictionary forKey:(NSString *)kCGImagePropertyExifDictionary];
NSLog(@"%@",EXIFDictionary);
}];
}
Вот результат:
{
ApertureValue = "2.52606882168926";
BrightnessValue = "0.5019629837352776";
ColorSpace = 1;
ComponentsConfiguration = (
1,
2,
3,
0
);
ExifVersion = (
2,
2,
1
);
ExposureMode = 0;
ExposureProgram = 2;
ExposureTime = "0.008333333333333333";
FNumber = "2.4";
Flash = 16;
FlashPixVersion = (
1,
0
);
FocalLenIn35mmFilm = 40;
FocalLength = "4.28";
ISOSpeedRatings = (
50
);
LensMake = Apple;
LensModel = "iPhone 4S back camera 4.28mm f/2.4";
LensSpecification = (
"4.28",
"4.28",
"2.4",
"2.4"
);
MeteringMode = 5;
PixelXDimension = 1920;
PixelYDimension = 1080;
SceneCaptureType = 0;
SceneType = 1;
SensingMethod = 2;
ShutterSpeedValue = "6.906947890818858";
SubjectDistance = "69.999";
UserComment = "[S.D.] kCGImagePropertyExifUserComment";
WhiteBalance = 0;
}
Думаю, у меня есть все, что мне нужно для вычисления FOV. Но являются ли они правильными ценностями? Потому что, прочитав много разных сайтов, дающих разные значения фокусного расстояния, я немного смущен! Также мои PixelDimensions кажутся неправильными!
Через http://en.wikipedia.org/wiki/Angle_of_view это формула, которую я планировал использовать:
FOV = (IN_DEGREES( 2*atan( (d) / (2 * f) ) ));
// d = sensor dimensions (mm)
// f = focal length (mm)
Мой вопрос
Мой метод и моя формула выглядят правильно, и если да, то какие значения я передаю функции?
Precisions
- FOV - это то, что я думаю, что мне нужно использовать, если у вас есть какое-то предположение о том, как правитель может соответствовать реальности; Я бы принял ответ!
- Масштаб отключен в контроллере расширенной реальности, поэтому мое поле зрения фиксируется при инициализации камеры и не может измениться, пока пользователь не повернет телефон!
Также сожалею о моих английских ошибках, я французский...