Sfm, реконструкция из стереоизображения - PullRequest
0 голосов
/ 05 сентября 2018

Мне нужна твоя помощь. Мне нужно перестроить маркеры в 3D пространстве из стереоизображения. В моем случае я хотел бы восстановить маркеры, используя некалиброванный метод.

Я снимаю 2 фотографии и пока подписываю маркеры вручную.

import cv2
import numpy as np
from matplotlib import pyplot as plt
from scipy import linalg


img1 =  cv2.imread('3.jpg',0)


img2 = cv2.imread('4.jpg',0)


pts1 = np.array([(1599.6711229946527, 1904.8048128342245), (1562.131016042781, 1734.4304812834225), (1495.7139037433158, 1295.5), 
     (2373.5748663101604, 1604.4839572192514), (2362.0240641711234, 2031.8636363636363), (2359.136363636364, 2199.3502673796793), 
     (2656.5695187165775, 1653.5748663101604), (2676.7834224598937, 1506.302139037433), (2740.312834224599, 1026.9438502673797), 
     (1957.745989304813, 807.4786096256685)],dtype='float64')

pts2 = np.array([(1579.457219251337, 1899.0294117647059), (1539.0294117647059, 1737.3181818181818),
     (1472.612299465241, 1307.0508021390374), (2315.8208556149734, 1633.3609625668448),
     (2298.4946524064176, 2054.9652406417113), (2301.3823529411766, 2190.687165775401), 
     (2630.5802139037432, 1670.9010695187167), (2642.131016042781, 1538.066844919786),
     (2711.4358288770054, 1076.0347593582887), (1949.0828877005351, 842.1310160427806)],dtype='float64')

Впоследствии я нахожу фундаментальную матрицу

F, mask = cv2.findFundamentalMat(pts1,pts2,cv2.FM_7POINT)

и выведите результат из cv2.computeCorrespondEpilines

ссылка

Казалось бы, это хорошо работает!

У меня есть матрица камеры, предварительно откалиброванная на шахматной доске, следуя инструкциям на сайте opencv

mtx=np.array([[3.19134206e+03, 0.00000000e+00, 2.01707613e+03],
       [0.00000000e+00, 3.18501724e+03, 1.54542273e+03],
       [0.00000000e+00, 0.00000000e+00, 1.00000000e+00]])

Извлеките Основную матрицу, следуя тому, что сообщается в книге Хартли и Циссермана

E = K.t () * F * K

E = mtx.T * F * mtx

Я разложил эту матрицу, чтобы найти матрицы поворота и перемещения

R1, R2, T = cv2.decomposeEssentialMat(E)
kr= np.dot(mtx,R1)
kt= np.dot(mtx,T)
projction2=np.hstack((kr,kt))
projction1 = np.array([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0]])

получение проекционных матриц. P1 - первая матрица, которая, как всегда описано в вышеприведенной книге, - P1 = [I | 0], вторая матрица - P2 = K [ R | t ]

.

теперь я использовал следующий код, чтобы вернуться к триангуляции точек

points4D = cv2.triangulatePoints(projction1, projction2, pts1.T, pts2.T)

Я конвертирую однородные координаты в декартовы, и результат таков:

coordinate_eucl= cv2.convertPointsFromHomogeneous(points4D.T)

coordinate_eucl=coordinate_eucl.reshape(-1,3)
x,y,z=coordinate_eucl.T

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(x, y, z, c='r', marker='o')
ax.set_xlabel('X Label')
ax.set_ylabel('Y Label')
ax.set_zlabel('Z Label')
plt.show()

ссылка

в чем я не прав?

ТНХ

1 Ответ

0 голосов
/ 06 сентября 2018

Хорошо проверять каждый шаг в отдельности. (Вы можете сначала посмотреть 4-й шаг)
1- Во-первых, вы сказали, что калибровали камеру ранее. Сколько ошибок перепроецирования вы получили? Делали ли вы какие-либо проверки для подтверждения успешности калибровки? Я также предполагаю, что обе ваши камеры в основном идентичны.
2- Если фундаментальная матрица, которую вы нашли, верна (кстати, убедитесь, что ваши списки точек имеют одинаковый порядок для обоих списков), она должна удовлетворять эпиполярному ограничению p' F p = 0, где p' - это точка в правом представлении, а p - это точка слева (однородные координаты пикселей). Хотя они не будут точно 0, они должны быть близки к 0. Это уравнение должно выполняться для всех точечных соответствий. Если это не так, попробуйте использовать CM_FM_RANSAC или перейдите к шагу 3.
3. Проверьте, можете ли вы непосредственно рассчитать необходимую матрицу с помощью функции opencv . Кроме того, аналогичное уравнение должно выполняться для существенной матрицы.
4- Функция OpenCV degposeEssentialMat возвращает две возможные матрицы поворота и два возможных преобразования (итого 4 возможных комбинации R T). Попробуйте протестировать их все. Если вы можете получить правильное решение с помощью одной из 4 комбинаций, я отредактирую свой ответ, указав, как получить правильную комбинацию.
Если ваши фундаментальные / основные матричные вычисления верны и проблема все еще возникает, пожалуйста, дайте мне знать.

...