Открыть резюме -Несколько методов SfM

У меня есть задание:

У нас работает система, в которой камера делает полукруг вокруг головы человека. Мы знаем матрицу камеры и вращение/смещение каждого кадра. (Искажение и прочее... но я хочу сначала поработать без этих параметров)

Моя задача состоит в том, чтобы у меня была только Матрица камеры, которая постоянна на протяжении этого хода, а изображений (более 100 ).Теперь я должен получить перевод и вращение от кадра к кадру и сравнить его с вращением и перемещением в реальном мире (из системы, которая у меня есть, но только для сравнения, я тоже должен это доказать!)

Первые шаги, которые я сделал до сих пор:

  1. используйте RobustMatcher из OpenCV Cookbook -works finde -40 -70 Соответствует каждому кадру -visible выглядит очень хорошо!
  2. Я получаю основную матрицу с помощью getFundamental (). Я использую надежные точки от robustMatcher и RANSAC.
  3. Когда я получу F, я смогу получить Essentialmatrix E с моей CameraMatrix K вот так:

cv::Mat E = K.t() * F * K; //Found at the Bible HZ Chapter 9.12

Теперь нам нужно извлечь R и t из E с помощью SVD. Кстати, позиция camera1 просто нулевая, потому что нам нужно с чего-то начинать.

cv::SVD svd(E);
cv::SVD svd(E);

cv::Matx33d W(0,-1,0,   //HZ 9.13
          1,0,0,
          0,0,1);

 cv::Matx33d Wt(0,1,0,//W^
        -1,0,0,
        0,0,1);

 cv::Mat R1 = svd.u * cv::Mat(W)  * svd.vt; //HZ 9.19
 cv::Mat R2 = svd.u * cv::Mat(Wt) * svd.vt; //HZ 9.19

 //R1 or R2???
 R = R1; //R2

 //t=+u3 or t=-u3?
 t = svd.u.col(2); //=u3

Это мой реальный статус!

Мои планы:

  1. триангулировать все точки, чтобы получить 3D-точки
  2. Соединить кадр i с кадром i++
  3. Визуализируй мои 3D точки на них как-нибудь!

Теперь мои вопросы:

  1. этот надежный сопоставитель устарел? есть ли другой метод?
  2. Неправильно ли использовать эти точки, как описано на моем втором шаге? Они должны быть преобразованы с искажением или что-то в этом роде?
  3. Какие R и t я извлекаю здесь? Это вращение и перемещение между камерой1 и камерой2 с точки зрения камеры1?
  4. Когда я читаю Библию, газеты или где-либо еще, я обнаруживаю, что есть 4 варианта того, как могут быть R и t! ´P′ = [UWV^T |+u3] или [UWV^T |−u3] или [UW^TV^T |+u3] или [UW^TV^T |−u3]´ P´ — проекционная матрица второго изображения. Это означает, что t может быть -или + и R могут быть совершенно разными?! Я обнаружил, что мне нужно вычислить одну точку в 3D и выяснить, находится ли эта точка перед обеими камерами, тогда я нашел правильную матрицу! Я нашел часть этого кода в Интернете, и он просто сказал это без дальнейших вычислений: cv::Mat R1 = svd.u * cv::Mat(W) * svd.vt и t = svd.u.col(2); //=u3Почему это правильно?Если это не -, как мне сделать эту триангуляцию в OpenCV? Я сравнил этот перевод с переводом, который мне дали. (Сначала мне пришлось передать перемещение и вращение по отношению к камере1, но теперь я понял это! )Но это не то же самое. Значения моей программы просто позволяют назвать ее прыгающей от плюса к минусу. Но оно должно быть более постоянным, потому что камера движется по постоянному кругу. Я уверен, что некоторые оси могут быть переключены. Я знаю, что перевод только от -1 до 1, но я думал, что смогу извлечь коэффициент из моих результатов в мои сравнительные значения, и тогда он должен быть похож.

Делал ли кто-нибудь что-то подобное раньше?

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

Я знаю, что visual sfm может как-то это сделать. (На youtube есть видео, где кто-то ходит вокруг дерева и получает по этим картинкам реконструкцию этого дерева с помощью визуального sfm )Это примерно то же самое, что я должен сделать.

Последний вопрос:

Кто-нибудь знает простой способ визуализировать мои 3D-точки? Я предпочитаю MeshLab. Какой-то опыт в этом?

6
задан Alexis Pigeon 14 August 2012 в 10:35
поделиться