Я хочу вычислить позу камеры, используя 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]
Как я могу проверить, что мои результаты хорошие? Если нет, каковы ошибки в моем коде, чтобы найти правильные результаты?