Найти положение камеры с 2 изображениями OpenCV - PullRequest
0 голосов
/ 02 августа 2020

Я хочу вычислить позу камеры, используя 2 изображения (одна и та же сцена). Я загружаю набор данных 7scenes, который дает точную позу камеры, чтобы проверить мои результаты. Я нахожу код для извлечения R и t из основной матрицы с помощью OpenCV:

sift = cv2.xfeatures2d.SIFT_create()

kp1, des1 = sift.detectAndCompute(img1,None)
kp2, des2 = sift.detectAndCompute(img2,None)
bf = cv2.BFMatcher()
matches = bf.knnMatch(des1, des2, k=2)

good = []
pts1_matched = []
pts2_matched = []
for i,(m,n) in enumerate(matches):
if m.distance < 0.8*n.distance:
             good.append(m)
             p1 = kp1[i].pt
             p2 = kp2[i].pt
             pts1_matched.append([p1[0], p1[1]])
             pts2_matched.append([p2[0], p2[1]])

(fx,fy) = (585,585) #focal length
cx = img1.shape[0] / 2
cy = img1.shape[1] / 2
K = np.array([[fx, 0, 0],
              [0, fy, 0],
              [cx, cy, 1]])
pts1_matched, pts2_matched = np.float32((pts1_matched, pts2_matched))
E = cv2.findEssentialMat(pts1_matched,pts2_matched,K)
R1, R2, T = cv2.decomposeEssentialMat(E[0])

Два возможных решения для вращения (R1 и R2) и одно возможное решение для перевода T:

R1 = [[-0.9992901  -0.03100816  0.02139616] 
[-0.03319142  0.99330623 -0.11063938] 
[-0.01782221 -0.111271   -0.99363028]] 

R2 = [[ 0.98326156  0.16971227 -0.06629063]
 [-0.18032326  0.85435868 -0.4873959 ]
 [-0.02608109  0.49119139  0.87066112]]

t =  [[0.07333358]
 [0.97687004]
 [0.20086589]]

Из набора данных 7scenes:

img1:

R = [[7.8397959e-001     -3.0723304e-001      5.3939360e-001]
[5.1147088e-002   8.9793324e-001      4.3711308e-001]
[-6.1864668e-001     -3.1510442e-001      7.1968108e-001]]

t = [-5.1953632e-001 -4.5830688e-001 1.6971579e-002]

img2:

R = [[7.7172202e-001     -3.2201505e-001      5.4837173e-001]
[5.7146903e-002   8.9393026e-001      4.4451046e-001]
[-6.3335752e-001     -3.1170598e-001      7.0827383e-001]]

t = [-5.1967233e-001 -4.6223685e-001 2.4931354e-002]

Как я могу проверить, что мои результаты хорошие? Если нет, каковы ошибки в моем коде, чтобы найти правильные результаты?

...