Как вычислить нормализованные координаты изображения из пиксельных координат?

#opencv #computer-vision

#opencv #компьютерное зрение

Вопрос:

Мне нужно вычислить 3D-точки из соответствующих точек изображения. Алгоритм для этого объясняется здесь: http://en.wikipedia.org/wiki/Essential_matrix . У меня это не работает, я получаю неправильные результаты. 1. Процедура использует «нормализованные координаты изображения» — как я могу их вычислить? 2. Матрицы R и T (вычисляемые из essential matrix) совпадают с теми, которые выводятся из процедуры cv::stereocalibrate?

Это то, что я делаю сейчас:

  1. Стерео калибрует мои настройки
  2. Обратная матрица камеры для обеих камер
  3. Вычислите нормализованные координаты соответствующих точек для обеих камер — путем умножения инвертированной матрицы камеры и однородных координат точек в пикселях

Остальные операции основаны на этой статье http://en.wikipedia.org/wiki/Essential_matrix в разделе: 3D точки из соответствующих точек изображения

  1. Вычисление физической / реальной координаты точки x3 с использованием матриц поворота и перемещения (задается процедурой калибровки стерео).
  2. Вычисление координат x1 и x2, как написано в статье

Спасибо за вашу помощь.

Комментарии:

1. Что у вас есть прямо сейчас? Какой аспект вашего внедрения у вас не работает?

2. Я вставил еще немного информации. Вы хотите, чтобы я вставил пример кода, или вы думаете, что в алгоритме что-то не так?

3. То, что вы делаете, выглядит разумно. Каков результат? Почему вы решили, что это не работает?

4. В упомянутой статье предлагается вычислять 3D-координаты, начиная с выражения для y’2 и для y’1. Результат должен быть примерно таким же. В моем случае это не так, результаты совершенно другие. Я также взял изображение цели с известной геометрией и попытался вычислить расстояния между отмеченными точками — опять эти расстояния не соответствуют реальным значениям. Позже я опубликую некоторые примерные результирующие координаты, если это может помочь.

Ответ №1:

В OpenCV есть функция, которая делает именно это — cv::undistortPoints. Учитывая точки, матрицу камеры и коэффициенты искажения камеры, будут выведены «нормализованные» точки. Вы можете прочитать больше на странице, описывающей эту функцию.

Комментарии:

1. Это не так. Неискаженные точки будут в пиксельных координатах. Посмотрите, что здесь делает undistorPoints(): opencv.itseez.com/modules/imgproc/doc /…

2. Вы правы в том, что документация со мной не согласна… однако я широко использовал функцию и на 99% (но не на 100%) уверен, что фактическая функция не выводит координаты пикселей. Ошибка либо в коде, либо в документации.

3. И… мы оба правы … в документации есть ошибка. Неискаженные точки возвращаются в нормализованных координатах.

4. Если вы передадите матрицы R и P, результат будет в координатах пикселей, в противном случае они будут нормализованы