Фундаментальное понимание tvecs rvecs в OpenCV-ArUco - PullRequest
0 голосов
/ 13 ноября 2018

Я хочу использовать ArUco , чтобы найти «пространственные координаты» маркера. У меня проблемы с пониманием tvecs и rvecs. Я дошел до того, что tvecs - это перевод, а rvecs - для вращения. Но как они ориентированы, в каком порядке они написаны в коде или как их ориентировать?

Вот небольшой набросок установки. У меня есть камера (веб-камера ноутбука, только нарисованная для иллюстрации ориентации камеры) в положении X , Y , Z , камера ориентирована, что можно описать с углом a вокруг X , углом b вокруг Y , угол c вокруг Z (углы в рад).

Поэтому, если моя камера неподвижна, я буду делать различные снимки плат ChArUco и назначать алгоритму калибровки камеры tvecs_camerapos ( Z , Y , X ) и rvecs_camerapos ( c , b , a ). Я получаю камеру Matrix, distCoeffs и tvecs_cameracalib, rvecs_cameracalib. t/rvecs_camerapos и t/rvecs_cameracalib отличаются, что я нахожу странным.

  • Является ли эта номинация / порядок t / rvecs правильными?
  • Должен ли я использовать camerapos или cameracalib для оценки позы, если камера не двигается?

Я думаю, t/rvecs_cameracalib ничтожно мал, потому что меня интересуют только внутренние параметры алгоритма калибровки камеры.

Теперь я хочу найти X , Y , Z положение маркера , я использую aruco.estimatePoseSingleMarkers с t/rvecs_camerapos и получить t/rvecs_markerpos. tvecs_markerpos не соответствуют моим ожидаемым значениям.

  • Нужно ли преобразование t/rvecs_markerpos, чтобы найти X , Y , Z маркера?
  • Где мое заблуждение?

Ответы [ 2 ]

0 голосов
/ 06 августа 2019

Процедуры OpenCV, которые имеют дело с камерами и калибровкой камеры (включая AruCo), используют модель камеры с точечным отверстием . Мировое происхождение определяется как центр проекции модели камеры (где все световые лучи, поступающие в камеру, сходятся), ось Z определяется как оптическая ось модели камеры, а оси X и Y образуют ортогональную систему с Z. + Z перед камерой, + X направо, а + Y вниз. Все координаты AruCo определены в этой системе координат. Это объясняет, почему твэки «камеры» и rvecs меняются: они не определяют положение вашей камеры в какой-либо мировой системе координат, а скорее определяют положение маркеров относительно вашей камеры.

Вам на самом деле не нужно знать, как работает алгоритм калибровки камеры, кроме того, что он даст вам матрицу камеры и некоторые параметры искажения объектива, которые вы используете в качестве входных данных для других процедур AruCo и OpenCV.

Получив данные калибровки, вы можете использовать AruCo для идентификации маркеров и возврата их положений и ориентаций в трехмерную систему координат, заданную вашей камерой, с правильной компенсацией искажения объектива камеры. Этого достаточно, например, для дополненной реальности, используя OpenGL поверх видеопотока с вашей камеры.

  • Tvec маркера - это перевод (x, y, z) маркера с начала координат; единица измерения расстояния - это та единица измерения, которую вы использовали для определения своей напечатанной калибровочной таблицы (т. е. если вы описали свою калибровочную таблицу для OpenCV с использованием мм, то в качестве единицы измерения расстояния в твэках будет мм).

  • rvec маркера - это трехмерный вектор вращения, который определяет ось вращения и угол поворота вокруг этой оси и задает ориентацию маркера. Его можно преобразовать в матрицу вращения 3x3 с помощью функции Родрига (cv :: Rodrigues ()). Это либо вращение, которое преобразует локальные оси маркера в мировые (камеры), либо обратные - я не помню, но вы можете легко проверить.

0 голосов
/ 24 марта 2019

В моем понимании, центр маркера - это система отсчета трехмерного мира. Rvec и tvec - это преобразования, используемые для определения положения любой другой трехмерной точки (в мировой системе отсчета) с помощью системы координат камеры. Таким образом, оба этих вектора являются внешними параметрами [R | t] . Внутренние параметры обычно получают из калибровки. Теперь, если вы хотите спроецировать любую другую 3D-точку с мировым эталонным кадром на плоскость изображения, вам нужно сначала поместить эту 3D-точку в систему координат камеры, а затем спроецировать ее на изображение, чтобы получить перспективу.

Точка на плоскости изображения (u, v, 1) = [внутренняя] [внешняя] [3D точка, 1]

Вышеприведенное объяснение неверно .

Эталонная система координат камеры. rvec, tvec дает 6D позу маркера относительно камеры.

...