Структура из движения: ошибка вычисления матрицы вращения и перевода из основной матрицы
Я пытаюсь смоделировать структуру от движения.
- рассмотрим случай, когда движение в направлении х. Я создал точки соответствия, как показано ниже, где есть движение на 50 пикселей только в направлении х.
Предыдущая координата изображения
[0] {x=50.000 y=50.00 } [1] {x=100.00 y=50.00 }
[2] {x=150.00 y=50.00 } [3] {x=200.00 y=50.00 }
[4] {x=250.00 y=50.00 } [5] {x=300.00 y=50.00 }
[6] {x=50.000 y=100.0 } [7] {x=100.00 y=100.0 }
[8] {x=150.00 y=100.0 } [9] {x=200.00 y=100.0 }
[10] {x=250.00 y=100.0 } [11] {x=300.00 y=100.0 }
[12] {x=50.000 y=150.0 } [13] {x=100.00 y=150.0 }
[14] {x=150.00 y=150.0 } [15] {x=200.00 y=150.0 }
Текущая координата изображения [0] {x = 100.0 y = 50.0} [1] {x = 150.0 y = 50.0}
[2] {x = 200,0 y = 50,0 } [3] {x=250,0 y = 50,0 }
[4] {x=300,0 y = 50,0 } [5] {x=350,0 y = 50,0 }
[6] {x=100,0 у =100. } [7] {x=150,0 y=100. }
[8] {x=200,0 y=100. } [9] {x=250,0 y=100. }
[10] {x=300,0 y=100. } [11] {x=350,0 y = 100. }
[12] {х = 100,0, у =150. } [13] {x=150,0 y=150. }
[14] {x=200,0 y=150. } [15] {x=250,0 y = 150. }
Внутренняя матрица 6.2821272+002 0. 3.474665e+002
0. 6.2886809e+002 2.4486120e+002
0. 0. 1. с известной внутренней матрицей я вычислил фундаментальную матрицу, используя функцию opencv (cvFindFundamentalMatrix
)
int fm_count = cvFindFundamentalMat( pMatPtsImgPrev, pMatPtsImgCurr,
pFundMat,CV_FM_RANSAC ,0.2,0.99, status);
средняя ошибка pixex очень близка к нулю.
затем найдите необходимую матрицу, используя приведенную ниже формулу
E = CameraMatrix^T * F * CameraMatrix.
Основная матрица со смещением X -6.227048e-030, 1.8018814e-014, 4.30140591e-015 3.1235024e-014, 2.7432764e-015, 7.02982759 9.885755751e-015, -7.0298275, 3.10862446e-015
Затем разложите матрицу вращения и перемещения, как указано в приведенной ниже ссылке, используя SVD - SVD decomp = SVD(E);
Извлечь перевод и вращение из фундаментальной матрицы
при разложении углы поворота Rx = 0 град, Ry = 0 град и Rz =0 град.
Это, кажется, хорошо, поскольку вращение или 0 или 180 градусов.
Когда координата изменяется с переводом в направлении y только как координаты, приведенные ниже
Предыдущая координата
[0] {x=50.00 y=50.00 } [1] {x=100.0 y=50.00 }
[2] {x=150.0 y=50.00 } [3] {x=200.0 y=50.00 }
[4] {x=250.0 y=50.00 } [5] {x=300.0 y=50.00 }
[6] {x=50.00 y=100.0 } [7] {x=100.0 y=100.0 }
[8] {x=150.0 y=100.0 } [9] {x=200.0 y=100.0 }
[10] {x=250.0 y=100.0 } [11] {x=300.0 y=100.0 }
[12] {x=50.00 y=150.0 } [13] {x=100.0 y=150.0 }
[14] {x=150.0 y=150.0 } [15] {x=200.0 y=150.0 }
Текущая координата
[0] {x=50.00 y=100.0 } [1] {x=100.0 y=100.0 }
[2] {x=150.0 y=100.0 } [3] {x=200.0 y=100.0 }
[4] {x=250.0 y=100.0 } [5] {x=300.0 y=100.0 }
[6] {x=50.00 y=150.0 } [7] {x=100.0 y=150.0 }
[8] {x=150.0 y=150.0 } [9] {x=200.0 y=150.0 }
[10] {x=250.0 y=150.0 } [11] {x=300.0 y=150.0 }
[12] {x=50.00 y=200.0 } [13] {x=100.0 y=200.0 }
[14] {x=150.0 y=200.0 } [15] {x=200.0 y=200.0 }
та же самая процедура и та же самая внутренняя матрица используются, чтобы построить фундаментальную матрицу и существенную матрицу.
Основная матрица со смещением Y -2,791314e-030, 2,5449611e-015, 5,095796479e-016
4.3544169e-015, -0.039722588, 0.99921074] 1.78226326e-015, -0.999210746, -0.03972258
но вращение разлагается Rx = -2,27653561 градусов Ry = 180, а Rz =0
Чего я не понимаю, так это того, почему Rx имеет какую-то ценность, так как перевод идет в направлении X и Y, и я считаю, что повороты должны быть либо 0, либо 180 градусов.
Кинди, дай мне подсказку, чтобы в моем коде возникли проблемы.