Как рассчитать внешние параметры одной камеры относительно второй камеры?

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

Любая помощь или предложение, пожалуйста. Спасибо!

3 ответа

Решение

Сначала преобразуйте свою матрицу вращения в вектор вращения. Теперь у вас есть 2 3d вектора для каждой камеры, назовите их A1,A2,B1,B2. У вас есть все 4 из них относительно некоторого происхождения O. Правило, которое вам нужно,

A relative to B = (A relative to O)- (B relative to O)

Примените это правило к вашим 2 векторам, и вы будете иметь их позу относительно друг друга.

Некоторая документация по преобразованию матрицы вращения в углы Эйлера можно найти здесь, а также во многих других местах. Если вы используете openCV, вы можете просто использовать Rodrigues. Вот код Matlab/ Octave, который я нашел.

Вот более простое решение, поскольку у вас уже есть матрицы вращения 3x3 R1 и R2 и векторы переноса 3x1 t1 и t2.

Они выражают движение от мировой системы координат к каждой камере, то есть являются матрицами такими, что, если p является точкой, выраженной в мировой системе координат, то та же самая точка, выраженная, скажем, в кадре камеры 1, имеет вид p1 = R1 * p + t1.

Движение от камеры 1 до 2 представляет собой просто композицию (а) движения ИЗ камеры 1 в мировой кадр и (b) движения ИЗ мирового кадра в камеру 2. Вы можете легко рассчитать эту композицию следующим образом:

  1. Сформируйте 4x4 матрицы рототрансляции Qw1 = [R1 t1] и Qw2 = [ R2 t2 ], причем 4-я строка равна [0 0 0 1]. Эти матрицы полностью выражают рото-трансляцию от мировой системы координат до камеры 1 и 2 соответственно.
  2. Движение ОТ камеры 1 К мировому кадру просто Q1w = inv(Qw1). Здесь inv() - алгебраическая обратная матрица, т. Е. Такая, что inv(X) * X = X * inv(X) = IdentityMatrix для каждой неособой матрицы X.
  3. Ротопередача с камеры 1 на 2 тогда Q12 = Q1w * Qw2, и наоборот, с камеры 2 на 1 Q21 = Q2w * Qw1 = inv(Qw2) * Qw1.

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

Здесь очень простое и легкое решение. Я полагаю, ваша первая камера имеет R1 и T1, вторая камера имеет матрицы вращения R2 и T2 и вектор перевода в соответствии с общей точкой отсчета.

Перевод с 1-й на 2-ю камеру, поворот с 1-й на 2-ю камеру можно рассчитать, следуя двухстрочному коду matlab;

R=R2*R1';
T=T2-R*T1;

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