Реальная проекция камеры - PullRequest
0 голосов
/ 26 марта 2020

Я работаю над проектом, который будет использоваться для отслеживания роботов на самолете с использованием OpenCV. В настоящее время я пытаюсь просто получить координаты пикселей трехмерной точки, но по какой-то причине я получаю невозможные значения; отрицательные значения и числа, превышающие строки или столбцы пикселей. Я использую iPhone X для камеры и обработки изображений, однако я проверял матричные преобразования в MATLAB на скорость и простоту.

Мой вопрос: почему я получаю большие значения, превышающие количество строк и столбцов пикселей, и почему существуют отрицательные значения? Что я сделал не так с системами координат, переводами или реализацией MATLAB?

Чтобы получить калибровочную матрицу intrinsi c, я использовал этот инструмент калибровки MATLAB, предоставленный Caltech.

Матрица калибровки intrinsi c:

enter image description here

Я вполне уверен, что это правильно, так как я выполнил калибровку 3 раза, с различные наборы изображений шахматной доски, и каждый раз достигали очень похожих результатов. Кроме того, значения фокусного расстояния близки к тем, которые я нашел в Интернете при расчете фокусного расстояния по FOV и размеру датчика.

Уравнение для вычисления координат пикселей в проективном пространстве, P ^ 2, из мирового пространства в R ^ 3 выглядит следующим образом: enter image description here

В форме:

enter image description here

Где:

с - коэффициент масштабирования

м` - координаты пикселей в P ^ 2

A - матрица камеры Intrinsi c

[R | t] - каскадное вращение и перевод камеры. Extrinsi c matrix.

M` - Физические точки однородных координат.

На диаграмме ниже показано соглашение о координатах: enter image description here

Для простоты и легкости моих расчетов я не применял вращение к камере, поэтому плоскость изображения и физическая плоскость, на которой находится точка, параллельны. Поэтому моя матрица вращения R - это единичная матрица 3x3.

Точка, которую я пытаюсь преобразовать в пиксельные координаты, представляет собой красный кружок в центре таблицы. Я определил начало системы координат как внизу слева, как показано на диаграмме ниже. Ось z положительно «входит» в страницу. Top down view of table, showing coordinate system

Я размещаю центр камеры точно на 510 мм выше красного круга. То есть с мировыми космическими координатами (1000, -1500, -510). Это приводит к матрице extrinsi c:

enter image description here

, ведущей к окончательному уравнению для нахождения координат пикселей (u, v). Я делю левую часть уравнения на 510, чтобы получить u и v.

enter image description here

Ниже приведена математическая реализация 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

Я новичок в этом предмете и не уверен, правильно ли я определил переводы или мировые координаты.

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