2016-07-12 12 views
0

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

Есть ли встроенные функции OpenCV, которые это делают?

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

ответ

0

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

Проблема деградирует в линейной задачи наименьших квадратов:

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

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

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

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 

И это справедливо для я = 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 и б известны из Pi матриц, а точки изображения [Ui, VI], мы можем вычислить Псевдообратный G (назовем его g_), и вычислить:

Q = G_ * b 
0

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

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

+0

спасибо, мне удалось понять это сам, но ваш ответ был полезным! – icguy

+0

приветствуется, но обычно вы можете обеспечить встроенные камеры для подходов SfM для улучшения результата (по крайней мере, расслоение может оценить их самостоятельно, но в зависимости от количества изображений результат был хуже) ... вот почему я подумал SfM проще для вас, чем разместить шахматную доску рядом с вашим объектом (и разместить ее таким образом, что это видно на каждом изображении) ... – gfkri