Как получить AVCameraCalibrationData из вывода фотографий на iOS? - PullRequest
0 голосов
/ 24 февраля 2019

Я пытаюсь получить коэффициенты искажения объектива (примечание: не фокусное расстояние и не главная точка), связанные с фотографией, которую я делаю на устройстве iOS.Насколько я понимаю, единственный способ сделать это на устройстве iOS - это использовать AVCameraCalibrationData.Официальная документация содержит только информацию о том, как извлечь данные калибровки камеры из AVDepthData, но как документация, так и этот ответ StackOverflow подразумевают, что AVCameraCalibrationData можно использовать с изображениями,не только с данными глубины.

Возможно ли получить AVCameraCalibrationData информацию при съемке изображения?Если да, есть ли документация по этой функции?

Ответы [ 2 ]

0 голосов
/ 09 августа 2019

Справочная информация. Многие из этих ответов о переполнении стека ссылаются на внутренние данные, когда их спрашивают о калибровке камеры, но данные калибровки обычно включают в себя внутренние данные, внешние данные, искажения объектива и т. Д. Все это перечислено здесь, в документации iOSВы связались с .

Я предполагаю, что у вас есть общий код приложения камеры.В этом коде, когда снимок сделан, вы, вероятно, собираетесь вызвать функцию photoOutput, которая выглядит примерно так:

func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {...

Выходной параметр будет иметь значение, на которое вы можете ссылатьсячтобы проверить, поддерживается ли калибровка камеры, называется isCameraCalibrationDataDeliverySupported , поэтому, например, чтобы распечатать это, используйте что-то вроде этого:

print("isCameraCalibrationDataDeliverySupported: \(output.isCameraCalibrationDataDeliverySupported)")

Обратите внимание, что в документации, на которую я ссылался, это толькоподдерживается в определенных сценариях:

"Значение этого свойства может быть истинным, только если свойство isDualCameraDualPhotoDeliveryEnabled имеет значение true. Чтобы включить доставку калибровки камеры, задайте свойство isCameraCalibrationDataDeliveryEnabled в объекте параметров фотографии."

Это важно, обратите на это внимание, чтобы избежать ненужного стресса.Используйте фактическое значение для отладки и убедитесь, что у вас включена соответствующая среда.

Имея все это на месте, вы должны получить фактические данные калибровки камеры из:

photo.cameraCalibrationData

Просто вытащитеэтого объекта, чтобы получить конкретные значения, которые вы ищете, например:

photo.cameraCalibrationData?.extrinsicMatrix
photo.cameraCalibrationData?.intrinsicMatrix
photo.cameraCalibrationData?.lensDistortionCenter
etc.

В основном все, что перечислено в документации, на которую вы ссылались, и на которую я снова ссылался.

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

0 голосов
/ 24 февраля 2019

Вы можете получить AVCameraCalibrationData только из вывода данных глубины или вывода фотографий.

Однако, если все, что вам нужно, это FOV, вам нужна только часть информации, которую предлагает класс - матрица встроенных функций камеры - и вы можетеполучите это самостоятельно из AVCaptureVideoDataOutput.

Установите cameraIntrinsicMatrixDeliveryEnabled на AVCaptureConnection, соединяющем ваше устройство камеры с сеансом захвата.(Обратите внимание, что сначала вы должны проверить cameraIntrinsicMatrixDeliverySupported; не все форматы захвата поддерживают встроенные функции.)

Когда видеовыход отправляет буферы выборки буфера, проверьте вложения каждого буфера семплов для ключа kCMSampleBufferAttachmentKey_CameraIntrinsicMatrix.Как отмечено в CMSampleBuffer.h (кто-то должен подать радар о получении этой информации в онлайн-документации), значением для этого вложения является CFData, кодирующий matrix_float3x3, и элементы (0,0) и (1,1) этогоМатрица - это горизонтальное и вертикальное фокусное расстояние.

...