Вычисление 3D-координат ключевых точек на нескольких изображениях

У меня есть несколько изображений объекта, сделанных одной и той же откалиброванной камерой. Скажем, калиброванный означает как внутренние, так и внешние параметры (я могу поставить шахматную доску рядом с объектом, чтобы можно было получить все параметры). На этих изображениях я могу найти совпадающие ключевые точки, используя SIFT или SURF, и некоторый алгоритм сопоставления, это базовый OpenCV. Но как мне сделать 3D-реконструкцию этих точек из нескольких изображений? Это не классическая стереоаранжировка, поэтому есть более 2 изображений с одинаковыми точками объекта на них, и я хочу использовать как можно больше для повышения точности.

Существуют ли какие-либо встроенные функции OpenCV, которые делают это?

(Обратите внимание, что это делается в автономном режиме, решение не должно быть быстрым, но надежным)


person icguy    schedule 12.07.2016    source источник


Ответы (2)


Я думаю, вы ищете так называемые подходы Структура из движения. Они используют несколько изображений с разных точек зрения и возвращают 3D-реконструкцию (например, облако точек). Похоже, что OpenCV имеет модуль SfM в пакете contrib, но я нет опыта с ним.

Однако раньше я работал с bundler. Это было довольно просто и возвращает всю информацию (калибровку камеры и положения точек) в виде текстового файла, и вы можете просматривать облако точек с помощью Meshlab. Обратите внимание, что он использует ключевые точки и дескрипторы SIFT для установления соответствия.

person gfkri    schedule 12.07.2016
comment
спасибо, мне удалось разобраться самому, но ваш ответ был полезен! - person icguy; 14.07.2016
comment
пожалуйста, но обычно вы можете предоставить встроенные функции камеры для подходов SfM, чтобы улучшить результат (по крайней мере, упаковщик может их оценить сам, но в зависимости от количества изображений результат был хуже) ... вот почему я подумал, что SfM для вас проще, чем поставить шахматную доску рядом с вашим объектом (и разместить ее так, чтобы она была видна на каждом изображении)... - person gfkri; 14.07.2016

Я думаю, что нашел решение для этого. Алгоритмы структуры из движения имеют дело со случаем, когда камеры не откалиброваны, но в этом случае известны все внутренние и внешние параметры.

Проблема превращается в линейную задачу наименьших квадратов:

Мы должны вычислить координаты для одной точки объекта:

X = [x, y, z, 1]'
C = [x, y, z]'
X = [[C], [1]]

Нам даны n изображений, которые имеют эти матрицы преобразования:

Pi = Ki * [Ri|ti]

Эти матрицы уже известны. Точка объекта проецируется на изображения в

U = [ui, vi] 

Мы можем написать в однородных координатах (оператор * представляет собой умножение матриц, скалярное произведение и скалярное умножение):

[ui * wi, vi * wi, wi]' = Pi * X

Pi = [[p11i, p12i, p13i, p14i],
      [p21i, p22i, p23i, p24i],
      [p31i, p32i, p33i, p34i]]

Определим следующее:

p1i = [p11i, p12i, p13i] (the first row of Pi missing the last element)
p2i = [p21i, p22i, p23i] (the second row of Pi missing the last element)
p3i = [p31i, p32i, p33i] (the third row of Pi missing the last element)

a1i = p14i
a2i = p24i
a3i = p34i

Тогда мы можем написать:

Q = [x, y, z]
wi = p3i * Q + a3i
ui = (p1i * Q + a1i) / wi = 
   = (p1i * Q + a1i) / (p3i * Q + a3i)
ui * p3i * Q + ui * a3i - p1i * Q - a1i = 0
(ui * p3i - p1i) * Q = a1i - a3i

Аналогично для vi:

(vi * p3i - p2i) * Q = a2i - a3i

И это верно для i = 1..n. Мы можем записать это в матричной форме:

G * Q = b

G = [[u1 * p31 - p11],
     [v1 * p31 - p21],
     [u2 * p32 - p12],
     [v2 * p32 - p22],
     ...         
     [un * p3n - p1n],
     [vn * p3n - p2n]]

b = [[a11 - a31 * u1],
     [a21 - a31 * v1],
     [a12 - a32 * u2],
     [a22 - a32 * v2],
     ...
     [a1n - a3n * un],
     [a2n - a3n * vn]]

Поскольку G и b известны из матриц Pi, а точки изображения [ui, vi], мы может вычислить псевдоинверсию G (назовем ее G_) и вычислить:

Q = G_ * b
person icguy    schedule 14.07.2016
comment
На момент написания этого я уверен, что это имело смысл, но, глядя на это годы спустя, я понятия не имею, что это такое. - person icguy; 08.04.2021