¿Cómo calcular el FOV?

Contexto inicial

Estoy desarrollando una ubicación de aplicación de realidad aumentada basada y necesito obtener el campo de visión [FOV] (solo actualizo el valor cuando cambia la orientación, por lo que estoy buscando un método que pueda obtener este valor cuando lo llamo)

El objetivo es hacer una "regla de grado" relevante para la realidad como la siguiente:

Ya estoy usandoAVCaptureSession para mostrar la transmisión de la cámara; y un camino junto con unCAShapeLayer para dibujar la regla Esto funciona bastante bien, pero ahora tengo que usarCampo de visión valor para colocar mi elemento en el lugar correcto (¡elija el espacio correcto entre 160 ° y 170 °, por ejemplo!).

En realidad, estoy codificando estos valores con estas fuentes:https://stackoverflow.com/a/3594424/3198096 (¡Un agradecimiento especial a @ hotpaw2!) Pero no estoy seguro de que sean completamente precisos y esto no maneja el iPhone 5, etc. No pude obtener valores de fuentes oficiales (¡Apple!), Pero hay un enlace que muestra valores para todos iDevice creo que necesito (4, 4S, 5, 5S):AnandTech | Algunas reflexiones sobre las mejoras de la cámara del iphone 5s.

Nota: Después de una prueba personal y algunas otras investigaciones en línea, ¡estoy bastante seguro de que estos valores son inexactos! Además, esto me obliga a usar una biblioteca externa para verificar qué modelo de iPhone estoy usando para inicializar manualmente mi FOV ... Y tengo que verificar mis valores para todos los dispositivos compatibles.

Preferiría un"solución de código" !

Después de leer esta publicación:iPhone: ¿Información de color de video en tiempo real, distancia focal, apertura?Estoy tratando de conseguirexif data de AVCaptureStillImageOutput como se sugiere. Después de lo que pude leer ellongitud focal a partir de los datos exif, y luego calcular el campo de visión horizontal y vertical a través de la fórmula! (O tal vez obtenga directamente el FOV como se muestra aquí:http://www.brianklug.org/2011/11/a-quick-analysis-of-exif-data-from-apples-iphone-4s-camera-samples/ -Nota: después de un cierto número de actualizaciones, ¡parece que no podemos obtener directamente el campo de visión de exif!)

Punto real

Fuentes de : http://iphonedevsdk.com/forum/iphone-sdk-development/112225-camera-app-working-well-on-3gs-but-not-on-4s.html yLos datos EXIF modificados no se guardan correctamente

Aquí está el código que estoy usando:

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);
     }];
}

Aquí está la salida:

{
    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;
}

Creo que tengo todo lo que necesito para calcular el FOV. ¿Pero son los valores correctos? Porque después de leer muchos sitios web diferentes que dan diferenteslongitud focal valores, estoy un poco confundido! ¡También mi PixelDimensions parece estar equivocado!

Víahttp://en.wikipedia.org/wiki/Angle_of_view Esta es la fórmula que planeé usar:

FOV = (IN_DEGREES(   2*atan( (d) / (2  * f) )   ));
// d = sensor dimensions (mm)
// f = focal length (mm)
Mi pregunta

¿Mi método y mi fórmula se ven bien y, en caso afirmativo, qué valores paso a la función?

PrecisionesFOV es lo que creo que necesito usar, si tienes alguna sugerencia de cómo la regla puede coincidir con la realidad; ¡Aceptaría la respuesta!El zoom está deshabilitado en el controlador de vista de realidad aumentada, por lo que mi campo de visión está fijo cuando la cámara se inicializa, ¡y no puede cambiar hasta que el usuario gire el teléfono!

También lamento mis errores en inglés, soy francés ...

Respuestas a la pregunta(5)

Su respuesta a la pregunta