Вопрос по translation, rotation, matrix, c++, opencv – Извлечь перевод и вращение из фундаментальной матрицы

16

Я пытаюсь получить векторы перемещения и вращения из вычисленной фундаментальной матрицы. Я использую OpenCV, и общий подход взят из Википедии. Мой код выглядит так:

//Compute Essential Matrix
Mat A = cameraMatrix(); //Computed using chessboard
Mat F = fundamentalMatrix(); //Computed using matching keypoints
Mat E = A.t() * F * A;

//Perfrom SVD on E
SVD decomp = SVD(E);

//U
Mat U = decomp.u;

//S
Mat S(3, 3, CV_64F, Scalar(0));
S.at(0, 0) = decomp.w.at(0, 0);
S.at(1, 1) = decomp.w.at(0, 1);
S.at(2, 2) = decomp.w.at(0, 2);

//V
Mat V = decomp.vt; //Needs to be decomp.vt.t(); (transpose once more)

//W
Mat W(3, 3, CV_64F, Scalar(0));
W.at(0, 1) = -1;
W.at(1, 0) = 1;
W.at(2, 2) = 1;

cout < "computed rotation: " < endl;
cout < U * W.t() * V.t() < endl;
cout < "real rotation:" < endl;
Mat rot;
Rodrigues(images[1].rvec - images[0].rvec, rot); //Difference between known rotations
cout < rot < endl;
Извините за поздний ответ, спасибо за исправление. Я очевидно забыл об этом. Я обновил ответ новыми результатами, к сожалению, они все еще не совсем верны. Teris
Я попытался перепроектировать куб на обоих изображениях на основе вычисленных значений. Я считаю, что эпилины на вершину должны совпадать. Но, к сожалению, они этого не делают. Я'Выложу код, который использовал позже. Teris
Должны ли вычисленные Коэффициенты искажения также быть умножены на Основную Матрицу каким-либо образом? Teris
decomp.vt V транспонирует, а не V. Что вы получите, если скажете?U * W.t() * V yiding

Ваш Ответ

2   ответа
10

http://isit.u-clermont1.fr/~ab/Classes/DIKU-3DCV2/Handouts/Lecture16.pdf.

Обратитесь к странице 2. Есть две возможности для R. Первая - UW.VT и второй UWTVT. Вы использовали второй. Попробуй первый.

Благодарю. Это именно то, чего мне не хватало. Я также могу порекомендовать очень простые и легкие для понимания источники новой книги "Освоение OpenCV с практическими проектами компьютерного зрения » github.com/MasteringOpenCV/code Teris
Можете ли вы предоставить ссылку, объясняющую, как установить, какой R является правильным? Antonio Sesto
Это написано на слайдах, в моем случае я простоиспытания» четыре возможных решения, применяя матрицы к фактическим точкам. Может быть, вы могли бы реализовать более эффективный тест, используя точечные произведения нормализованных векторов перевода и третьи столбцы каждого R. Чтобы увидеть, являются ли они "облицовочный» правильные направления. Teris
Ссылка теперь не работает, даже на archive.org. Будет ли у кого-нибудь копия или похожая ссылка? Gabriel Devillers
0

матрицы, но если проявить осторожность, вы можете выполнить его хорошо. Ключом к получению хороших результатов является правильная тщательная нормализация входных данных перед построением уравнений для решения. Многие из алгоритмов могут сделать это. Координаты точки в пикселях должны быть изменены на координаты камеры, вы делаете это в этой строке:

Mat E = A.t() * F * A;

Однако это предположение не является точным. Если калибровочная матрица камеры K известна, то вы можете применить обратную к точке x, чтобы получить точку, выраженную в нормализованных координатах.

X_{norm}= K.inv()*X_{pix} гдеX_{pix}(2)z равно 1.

В случае 8PA простое преобразование точек улучшается и, следовательно, в стабильности результатов. Предложенная нормализация - это перевод и масштабирование каждого изображения таким образом, чтобы центр тяжести опорных точек находился в начале координат, а среднеквадратическое расстояние точек от начала координат было равно\sqrt{2}, Обратите внимание, что рекомендуется, чтобы условие сингулярности выполнялось до денормализации.

Ссылка: проверьте, если:вы все еще заинтересованы

Похожие вопросы