преобразование проекционных матриц, вычисленных из трифокального тензора, для оценки трехмерных точек

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

Я мог бы успешно вычислить проекционные матрицы, используя 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. Шесть трехмерных точек:

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]

В то время как фактические 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 в форму, которая позволяет
значимая триангуляция? Мне нужно вычислить правильные трехмерные точки, используя трифокальный тензор.

4

Решение

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

Для того, чтобы получить метрический реконструкция, вам нужно знать калибровочные матрицы ваших камер. Знаете ли вы эти матрицы (например, используете ли вы виртуальные камеры для рендеринга изображений) или оценили их с помощью калибровки камеры (см. Учебные пособия по калибровке OpenCV), вы можете найти метод для получения метрической реконструкции в §7.4.5 «Геометрия, ограничения и вычисление трифокального тензора», автор К.Рессл (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. Вычислить основные матрицы F21, F31, Обозначив P2=[A|a] а также P3=[B|b], у тебя есть F21=[a]x.A а также F31=[b]x.B (см. таблицу 9.1 в [HZ00]), где для вектора 3×1 e [e]x = [0,-e_3,e_2;e_3,0,-e_1;-e_2,e_1,0]

  3. Вычислить основные матрицы E21 = K2'.F21.K1 а также E31 = K3'.F31.K1

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

    я. Вычислить 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

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

    v. если X1_3<0 задавать ti = -ti

    VI. определять Pi_E=Ki.[Ri|ti]

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

    я. определять p2=R2'.inv(K2).x2 а также p3=R3'.inv(K3).x3

    II. определять M=[p2]x

    III. Вычислить масштаб s=(p3'.M.R2'.t2)/(p3'.M.R3'.t3)

    внутривенно Задавать t3=t3*s

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

[HZ00] «Геометрия множественного обзора в компьютерном зрении», Р. Хартли и А. Циссерман, 2000.

9

Другие решения

Других решений пока нет …