Поле зрения камеры GoPro

Я откалибровал свою камеру GoPro Hero 4 Black с помощью набора инструментов калибровки камеры для Matlab и рассчитал поля обзора и фокусное расстояние с помощью CalibrationMatrixValues() OpenCV. >. Однако они отличаются от спецификаций GoPro. Вместо 118,2/69,5 FOV я получаю 95,4/63,4 и фокусное расстояние 2,8 мм вместо 17,2 мм. Очевидно, что-то не так.

Я предполагаю, что сама калибровка правильная, так как неискажение изображения, кажется, работает хорошо.

Может ли кто-нибудь дать мне подсказку, где я сделал ошибку? Я отправляю свой код ниже.

Спасибо.

Код

cameraMatrix = new Mat(3, 3, 6);
for (int i = 0; i < cameraMatrix.height(); i ++)
    for (int j = 0; j < cameraMatrix.width(); j ++) {
    cameraMatrix.put(i, j, 0);
}
cameraMatrix.put(0, 0, 582.18394);
cameraMatrix.put(0, 2, 663.50655);
cameraMatrix.put(1, 1, 582.52915);
cameraMatrix.put(1, 2, 378.74541);
cameraMatrix.put(2, 2, 1.);

org.opencv.core.Size size = new org.opencv.core.Size(1280, 720);
//output parameters
double [] fovx = new double[1];
double [] fovy = new double[1];
double [] focLen = new double[1];
double [] aspectRatio = new double[1];
Point ppov = new Point(0, 0);
org.opencv.calib3d.Calib3d.calibrationMatrixValues(cameraMatrix, size,
        6.17, 4.55, fovx, fovy, focLen, ppov, aspectRatio);


System.out.println("FoVx: " + fovx[0]);
System.out.println("FoVy: " + fovy[0]);
System.out.println("Focal length: " + focLen[0]);
System.out.println("Principal point of view; x: " + ppov.x + ", y: " + ppov.y);
System.out.println("Aspect ratio: " + aspectRatio[0]);

Результаты

FoVx: 95.41677635378488
FoVy: 63.43170132212425
Focal length: 2.8063085232812504
Principal point of view; x: 3.198308916796875, y: 2.3934605770833333
Aspect ratio: 1.0005929569269807

Характеристики ГоПро

https://gopro.com/help/articles/Question_Answer/HERO4-Field-of-View-FOV-Information

Редактировать

Результаты калибровки Matlab

Focal Length:          fc = [ 582.18394   582.52915 ] ± [ 0.77471   0.78080 ]
Principal point:       cc = [ 663.50655   378.74541 ] ± [ 1.40781   1.13965 ]
Skew:             alpha_c = [ -0.00028 ] ± [ 0.00056  ]   => angle of pixel axes = 90.01599 ± 0.03208 degrees
Distortion:            kc = [ -0.25722   0.09022   -0.00060   0.00009  -0.01662 ] ± [ 0.00228   0.00276   0.00020   0.00018  0.00098 ]
Pixel error:          err = [ 0.30001   0.28188 ]

Одно из изображений, используемых для калибровки 13.jpg

И неискаженное изображение _rect13.jpg


person Milan Zelenka    schedule 13.10.2016    source источник


Ответы (1)


Вы ввели 6.17мм и 4.55мм для размера сенсора в OpenCV, что соответствует соотношению сторон 1.36, тогда как ваше разрешение (1270x720) равно 1.76 (формат примерно 16x9). Вы обрезали свое изображение перед калибровкой MATLAB?

Размер пикселя, кажется, составляет 1,55 мкм от этого Gopro. страница (это, кстати, поразительно мало!). Если пиксели квадратные, а они должны быть на коммерческих камерах этого типа, это означает, что ваши входные данные не являются последовательными. Расчетный размер сенсора должен быть:

[Ширина сенсора, высота сенсора] = [1280, 720]*1,55*10^-3 = [1,97, 1,12] мм

Даже если учесть максимальное разрешение видео, которое составляет 3840 x 2160, мы получаем [5.95, 3.35]mm, что все равно отличается от вашего ввода.

Ознакомьтесь с этим объяснением эквивалентного фокусного расстояния, чтобы понять, почему фактическое фокусное расстояние камеры не 17.2, а 17.2*5.95/36 ~ 2,8 мм. В этом случае вычислите FOV, используя, например, формулы здесь. Вы действительно найдете значения 93,5°/61,7° (близко к вашим выходам, но все же не то, что написано в спецификациях, потому что вероятны оптические искажения из-за широких углов).

Однако я не понимаю, как возвращенное фокусное расстояние может быть правильным, тогда как введенный размер сенсора неверен. Не могли бы вы дать больше информации и/или отправить изображение?

Редактирование после обновления вопроса

На этих камерах с рабочим разрешением 1280x720 изображение даунсемплируется, но не обрезается, поэтому то, что я сказал выше о размерах сенсора, не применимо. Размер датчика, который следует учитывать, действительно используется (6,17x4,55), как объяснено в вашем первом комментарии.

FOV ограничен входными данными калибровочной матрицы (fx, fy, cx, cy), заданными в пикселях, и разрешением. Вы можете проверить это, набрав:

2*DEGRES(ATAN(1280/(2*582.18394))) (=95.416776...°)

Это значение FOV меньше ожидаемого, но, судя по виду неискаженного изображения, ваша модель искажения MATLAB правильная и калибровка правильная. Бочкообразная дисторсия из-за широкого угла, кажется, хорошо исправлена ​​примененным вами изменением деформации.

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

https://fr.mathworks.com/help/vision/ug/camera-dication.html

Следовательно, я думаю, что если вы не найдете модель, которая более точно подходит для камеры Gopro (возможно, модель с широкоугольным объективом), калибровка MATLAB вернет внутреннюю матрицу камеры, соответствующую «линейному» неискаженному изображению, и FOV действительно будет быть меньше (в случае бочкообразной дисторсии). Вам нужно будет применить коэффициенты искажения, связанные с калибровкой, чтобы получить фактическое значение FOV.

Мы видим на исправленном изображении, что боковые части FOV выходят за границы. Если бы вы полностью деформировали изображение, вы бы обнаружили, что координаты некоторых неискаженных пикселей превышают [-1280/2;+1280/2] (по горизонтали и по вертикали). Затем, заменив opencv.core.Size(1280, 720) самыми крайними полученными диапазонами, вы, надеюсь, получите значения веб-сайта Gopro.

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

person Matt-Mac-Muffin    schedule 14.10.2016
comment
Большое спасибо за ответ. Я нашел размеры сенсора здесь vfxcamdb.com/category/camera/gopro. Несмотря на это, поле зрения, возвращаемое калибровкойMatrixValues(...), не изменяется, если я изменяю размеры датчика. Я предполагаю, что все данные, необходимые для этого расчета, взяты из калибровочной матрицы камеры. Однако изменяется фокусное расстояние, которое становится равным ~0,9 мм (когда я изменяю размеры сенсора на 1,97 и 1,12). - person Milan Zelenka; 16.10.2016
comment
Я включил некоторые дополнительные данные в сообщение выше. - person Milan Zelenka; 16.10.2016
comment
Я не нашел информацию о размере сенсора, но вы действительно должны полагаться на информацию Gopro, когда она у вас есть. Тогда моя ошибка: я предполагаю, что между пикселями есть некоторое расстояние и что понижение частоты дискретизации при более низких разрешениях фактически увеличивает шаг пикселя. Результаты о фокусном теперь имеют смысл для меня. Что касается расхождений FOV, пробовали ли вы использовать для калибровки модель искажения, адаптированную к объективам типа «рыбий глаз»? - person Matt-Mac-Muffin; 16.10.2016
comment
Только что попробовал использовать модель «рыбий глаз» для калибровки камеры и получил практически идентичную матрицу камеры, отличаются только коэффициенты дисторсии «рыбий глаз» и их использование для неискажения изображения не дает хороших результатов. Что касается калибровки камеры, я использовал 19 изображений. Я не знаю, что делать дальше. Может быть, я просто неправильно истолковал получившиеся FOV? - person Milan Zelenka; 17.10.2016
comment
Ok. Просто чтобы убедиться, что материал, на который вы кладете шахматную доску, жесткий? Что мы могли бы сделать, чтобы помочь себе понять, так это измерить поле зрения вручную. просто поместите шахматную заплатку на известном расстоянии от камеры (не слишком близко, чтобы фокус был в порядке, и в плоскости, ортогональной оси камеры (оптической оси). Он должен быть достаточно хорошо обращен к камере. В идеале, используйте вещь большего размера, чем шахматная доска, чтобы пластина занимала все изображение Затем рассчитайте угол, который вы видите, используя базовую геометрию, или пришлите мне изображение + размеры пластин и расстояние от камеры, и я это сделаю. - person Matt-Mac-Muffin; 18.10.2016
comment
Я провел эксперимент, который вы предложили, и FOV действительно такие же, как в спецификациях GoPro ~ (118/69). Поэтому я делаю вывод, что есть два возможных объяснения. 1) Калибровка камеры неверна. Чего я не понимаю, так это почему неискажение изображения и вычисление позы камеры с использованием той же самой матрицы, кажется, работают довольно хорошо. 2) Полученная матрица камеры соответствует неискаженному изображению. Я попытался провести тот же эксперимент с неискаженными изображениями, и в результате FOV был ~(96,64), и я уверен, что неизбежно сделал небольшие ошибки измерения. - person Milan Zelenka; 18.10.2016
comment
Ах да, материал жесткий и плоский. - person Milan Zelenka; 18.10.2016
comment
Хорошо, тогда я согласен с вашим объяснением № 2. Соответственно, я внес дополнительные изменения в свой ответ, пожалуйста, не стесняйтесь изменять или закрывать вопрос. - person Matt-Mac-Muffin; 18.10.2016
comment
Да, теперь все это имеет смысл. Десятикратное спасибо за объяснение и потраченное время! - person Milan Zelenka; 19.10.2016