2014-02-17 6 views
4

Я использую этот устаревший код: http://fossies.org/dox/opencv-2.4.8/trifocal_8cpp_source.html для оценки трехмерных точек из данных соответствующих 2D-точек из трех разных точек зрения. Проблема я столкнулся с такой же, как указано здесь: http://opencv-users.1802565.n2.nabble.com/trifocal-tensor-icvComputeProjectMatrices6Points-icvComputeProjectMatricesNPoints-td2423108.htmlПреобразование матриц проекции, вычисленных из трифокального тензора для оценки 3D-точек

Я мог бы вычислить матрицы Проекционные успешно используют icvComputeProjectMatrices6Points. Я использовал 6 наборов соответствующих точек из 3 видов. Результаты представлены ниже:

projMatr1 P1 = 
[-0.22742541, 0.054754492, 0.30500898, -0.60233182; 
    -0.14346679, 0.034095913, 0.33134204, -0.59825808; 
    -4.4949986e-05, 9.9166318e-06, 7.106331e-05, -0.00014547621] 

projMatr2 P2 = 
[-0.17060626, -0.0076031247, 0.42357284, -0.7917347; 
    -0.028817834, -0.0015948272, 0.2217239, -0.33850163; 
    -3.3046148e-05, -1.3680664e-06, 0.0001002633, -0.00019192585] 

projMatr3 P3 = 
[-0.033748217, 0.099119112, -0.4576003, 0.75215244; 
    -0.001807699, 0.0035084449, -0.24180284, 0.39423448; 
    -1.1765103e-05, 2.9554356e-05, -0.00013438619, 0.00025332544] 

Кроме того, я вычислен 3D точек с помощью icvReconstructPointsFor3View. Шесть 3D точки являются следующие:

4D points = 
[-0.4999997, -0.26867214, -1, 2.88633e-07, 1.7766099e-07, -1.1447386e-07; 
    -0.49999994, -0.28693244, 3.2249036e-06, 1, 7.5971762e-08, 2.1956141e-07; 
    -0.50000024, -0.72402155, 1.6873783e-07, -6.8603946e-08, -1, 5.8393886e-07; 
    -0.50000012, -0.56681377, 1.202426e-07, -4.1603233e-08, -2.3659911e-07, 1] 

While, фактические 3D точки являются следующие:

- { ID:1,X:500.000000, Y:800.000000, Z:3000.000000} 
    - { ID:2,X:500.000000, Y:800.000000, Z:4000.000000} 
    - { ID:3,X:1500.000000, Y:800.000000, Z:4000.000000} 
    - { ID:4,X:1500.000000, Y:800.000000, Z:3000.000000} 
    - { ID:5,X:500.000000, Y:1800.000000, Z:3000.000000} 
    - { ID:6,X:500.000000, Y:1800.000000, Z:4000.000000} 

Мой вопрос теперь, как преобразовать P1, P2 и P3 в форме, которая позволяет значимая триангуляция? Мне нужно вычислить правильные трехмерные точки, используя трифокальный тензор.

ответ

8

Трифокальный тензор вам не поможет, потому что, как и фундаментальная матрица, он дает только проективный реконструкция сцены и позы камеры. Если X0_j и P0_i являются истинными трехмерными точками и матрицами камер, это означает, что восстановленные точки Xp_j = inv(H).X0_j и матрицы фотоаппаратов Pp_i = P0_i.H определены только с общей матрицей 4x4 H, что неизвестно.

Чтобы получить метрическую, вам необходимо знать калибровочные матрицы ваших камер. Знаете ли вы эти матрицы (например, если вы используете виртуальные камеры для рендеринга изображений) или вы оценили их с помощью калибровки камеры (см. OpenCV calibration tutorials), вы можете найти способ получения результирующей метрики в п. 7.4.5 «Геометрия, ограничения и вычисления трифокального тензора ", С.Ressl (PDF).

Обратите внимание, что даже при использовании этого метода вы не можете получить 3D-реконструкцию вплоть до масштабов, если у вас нет дополнительных знаний (например, знание фактического расстояния между двумя фиксированными 3D-точками).

Эскиз алгоритма:

Входы: три матрицы камеры P1, P2, P3 (проективное мировые координаты, с системой координат выбрана так, что P1=[I|0]), соответствующие калибровки матрицы K1, K2, K3 и одна точка корреспонденции x1, x2, x3.

Выходы: три матрицы камер P1_E, P2_E, P3_E (метрическая реконструкция).

  1. Набор P1_E=K1.[I|0]

  2. Compute фундаментальные матрицы F21, F31. Обозначая P2=[A|a] и P3=[B|b], у вас есть F21=[a]x.A и F31=[b]x.B (см. Таблицу 9.1 в [HZ00]), где для 3x1 вектора е [e]x = [0,-e_3,e_2;e_3,0,-e_1;-e_2,e_1,0]

  3. Compute существенные матрицы E21 = K2'.F21.K1 и E31 = K3'.F31.K1

  4. Для i = 2,3, сделайте следующее

    I. Вычислить SVD Ei1=U.S.V'. Если det(U)<0 комплект U=-U. Если det(V)<0 комплект V=-V.

    ii. Определение W=[0,-1,0;1,0,0;0,0,1], Ri=U.W.V' и ti = third column of U

    iii. Определение M=[Ri'.ti]x, X1=M.inv(K1).x1 и Xi=M.Ri'.inv(Ki).xi

    iv. Если X1_3.Xi_3<0 установите Ri=U.W'.V' и пересчитывать M и X1

    ст. Если X1_3<0 установить ti = -ti

    VI. Определение Pi_E=Ki.[Ri|ti]

  5. Выполните следующие действия, чтобы получить правильную шкалу для t3 (последова- к тому, что ||t2||=1):

    I. Определение p2=R2'.inv(K2).x2 и p3=R3'.inv(K3).x3

    ii. Определение M=[p2]x

    iii. Вычислить шкалу s=(p3'.M.R2'.t2)/(p3'.M.R3'.t3)

    iv. Набор t3=t3*s

  6. Конца алгоритма: матрицы камеры P1_E, P2_E, P3_E действительны до изотропного масштабирования сцены и изменений 3D системы координат (следовательно, реконструкция метрики).

[HZ00] "Multiple геометрия зрения в области компьютерного зрения", по R.Hartley и A.Zisserman, 2000.

+0

как я вычислить H, когда я уже знаю калибровки камеры Матрица K? – magarwal

+0

Ссылка на PDF была сломана, я ее исправил. Вы нашли раздел, на который я ссылался? – AldurDisciple

+0

сделал. Но не смог понять его до уровня реализации :( – magarwal