Я работаю над проектом, который будет использоваться для отслеживания роботов на самолете с использованием OpenCV. В настоящее время я пытаюсь просто получить координаты пикселей трехмерной точки, но по какой-то причине я получаю невозможные значения; отрицательные значения и числа, превышающие строки или столбцы пикселей. Я использую iPhone X для камеры и обработки изображений, однако я проверял матричные преобразования в MATLAB на скорость и простоту.
Мой вопрос: почему я получаю большие значения, превышающие количество строк и столбцов пикселей, и почему существуют отрицательные значения? Что я сделал не так с системами координат, переводами или реализацией MATLAB?
Чтобы получить калибровочную матрицу intrinsi c, я использовал этот инструмент калибровки MATLAB, предоставленный Caltech.
Матрица калибровки intrinsi c:
Я вполне уверен, что это правильно, так как я выполнил калибровку 3 раза, с различные наборы изображений шахматной доски, и каждый раз достигали очень похожих результатов. Кроме того, значения фокусного расстояния близки к тем, которые я нашел в Интернете при расчете фокусного расстояния по FOV и размеру датчика.
Уравнение для вычисления координат пикселей в проективном пространстве, P ^ 2, из мирового пространства в R ^ 3 выглядит следующим образом:
В форме:
Где:
с - коэффициент масштабирования
м` - координаты пикселей в P ^ 2
A - матрица камеры Intrinsi c
[R | t] - каскадное вращение и перевод камеры. Extrinsi c matrix.
M` - Физические точки однородных координат.
На диаграмме ниже показано соглашение о координатах:
Для простоты и легкости моих расчетов я не применял вращение к камере, поэтому плоскость изображения и физическая плоскость, на которой находится точка, параллельны. Поэтому моя матрица вращения R - это единичная матрица 3x3.
Точка, которую я пытаюсь преобразовать в пиксельные координаты, представляет собой красный кружок в центре таблицы. Я определил начало системы координат как внизу слева, как показано на диаграмме ниже. Ось z положительно «входит» в страницу.
Я размещаю центр камеры точно на 510 мм выше красного круга. То есть с мировыми космическими координатами (1000, -1500, -510). Это приводит к матрице extrinsi c:
, ведущей к окончательному уравнению для нахождения координат пикселей (u, v). Я делю левую часть уравнения на 510, чтобы получить u и v.
Ниже приведена математическая реализация MATLAB:
clear all;
clc;
theta = 0;
Rx = [1, 0, 0; %With theta = 0 , this is the 3x3 identity matrix
0, cos(theta), -sin(theta);
0, sin(theta), cos(theta)];
tx = 1000; %Camera translations. ty and tz are negative due to coordinate system convention.
ty = -1500;
tz = -510;
I = eye(3);
translation = [tx; ty; tz];
extrinsic = [Rx translation]; %Concatenate rotation and translation matrices
fx = 3319.68707;
fy = 3337.51214;
cx = 1476.77578;
cy = 1921.59370;
intrinsic = [fx, 0, cx;
0, fy, cy;
0, 0, 1];
x = 1000;
y = -1500;
z = 0;
worldCoords = [x; y; z; 1];
scaledPixelCoords = intrinsic * extrinsic * worldCoords; %Before I divide the LHS by 510
pixelCoords = scaledPixelCoords / 510;
disp(pixelCoords);
Вывод:
1.0e+04 *
1.1542
-2.1554
-0.0001
Я новичок в этом предмете и не уверен, правильно ли я определил переводы или мировые координаты.