Подтвердить что ты не робот

Как рассчитать FOV?

Начальный контекст

Я разрабатываю приложение приложения расширенной реальности, и мне нужно получить поле зрения [FOV] (я просто обновляю значение, когда меняется ориентация, поэтому я ищу метод, который может получить это значение при вызове она)

Цель состоит в том, чтобы сделать "правителя степени" применимым к реальности следующим образом: Degree Ruler - AR App

Я уже использую 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 - это то, что я думаю, что мне нужно использовать, если у вас есть какое-то предположение о том, как правитель может соответствовать реальности; Я бы принял ответ!
  • Масштаб отключен в контроллере расширенной реальности, поэтому мое поле зрения фиксируется при инициализации камеры и не может измениться, пока пользователь не повернет телефон!

Также сожалею о моих английских ошибках, я французский...

4b9b3361

Ответ 1

В iOS 7 и выше вы можете что-то сделать в этих строках:

float FOV = camera.activeFormat.videoFieldOfView;

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

Здесь справочные материалы Apple.

Ответ 2

Из уравнения FOV вам понадобятся фокусное расстояние и размеры датчика. Данные Exif имеют фокусное расстояние, но не размеры датчика. Я нашел только одного поставщика камеры (Canon), который обеспечивает размеры датчиков в метаданных - и это в их исходных файлах CRW. Таким образом, вам придется искать таблицу размеров датчиков на основе камеры или смартфона. Следующая ссылка на Википедию содержит данные о размерах датчиков для многочисленных камер и некоторых новых iPhone. Список находится ближе к концу статьи Wiki. http://en.wikipedia.org/wiki/Image_sensor_format

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

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

Фотографии и веб-сайты, такие как http://www.kenrockwell.com, содержат много информации о размерах сенсора камеры.

Коррекция: на самом деле существуют теги Exif для разрешения X-фокальной плоскости и разрешения Focal плоскости Y (в пикселях) и блоков разрешения фокальной плоскости. Из этих тегов и размеров изображения вы можете вычислить размер датчика. Но не все камеры предоставляют теги Exif. Например, iPhone 4 не предоставляет эти теги.

Ответ 3

Чтобы ответить на ваш вопрос:

Мой метод и моя формула выглядят правильно...?

Возможно, но они также выглядят слишком сложными.

... и если да, то какие значения я передаю функции?

Я не знаю, но если целью является вычисление HFOV и VFOV, вот пример кода, который программно находит горизонтальный угол обзора, который является единственным углом обзора, который можно получить в Swift в настоящее время, а затем вычисляет Вертикальный угол обзора, основанный на соотношении сторон iPhone 6, 16: 9.

    let devices = AVCaptureDevice.devices()
    var captureDevice : AVCaptureDevice?
    for device in devices {
        if (device.hasMediaType(AVMediaTypeVideo)) {
            if(device.position == AVCaptureDevicePosition.Back) {
                captureDevice = device as? AVCaptureDevice
            }
        }
    }
    if let retrievedDevice = captureDevice {
        var HFOV : Float = retrievedDevice.activeFormat.videoFieldOfView
        var VFOV : Float = ((HFOV)/16.0)*9.0
    }

Также не забудьте импортировать AVFoundation, если вы хотите, чтобы это сработало!

Ответ 5

Диаметр поля зрения - это диаметр круга света, который вы можете видеть, когда смотрите в микроскоп.

Если примерно десять круглых ячеек в строке могут соответствовать диаметру поля зрения, и если вы знаете диаметр в миллиметрах, тогда вы можете разделить общий диаметр на количество ячеек, которые будут соответствовать размеру каждого клетка.

общий диаметр, деленный на количество ячеек, которые будут соответствовать размеру (диаметру) каждой ячейки

Пример

Если диаметр поля зрения составляет 1,5 мм, а десять ячеек будут соответствовать, если они были расположены по линии, то каждая ячейка:

1,5 мм /10 = 0,15 мм

0,15 мм

ПОМНИТЕ, что каждый раз, когда вы меняете увеличение, вы изменяете диаметр круга света, который вы видите. Поэтому каждое увеличение будет иметь собственный диаметр.

Если вы поместите линейку под микроскоп, чем больше вы увеличите масштаб, тем меньше количество строк на линейке, которую вы видите.