openCV triangulatePoints действуют странно в python - PullRequest
0 голосов
/ 05 августа 2020

Я пытаюсь вычислить 3D-точки с помощью OpenCV, чтобы они были реконструкцией нескольких видов. Я выполняю стандартные последовательности поиска совпадающих точек с помощью SIFT, а затем получаю фундаментальную и важную матрицу с известной калибровочной матрицей камеры. После восстановления положения второго кулачка относительно первого, я go пробую триангулировать точки. Все остальные части кода работают как положено. Но в этой части возникают сбои. Я использую OpenCV 4.3.0. Иногда triangulatePoints просто нарушает работу IDE (Spyder), иногда это дает мне очки, а иногда это дает мне кучу очков в [1,1,1]. IDE также не работает, если количество баллов превышает 200. Чем больше баллов, тем больше сбоев в работе. Это расстраивает, любая помощь будет оценена.

Вот фрагмент кода.

F, mask = cv.findFundamentalMat(pts1,pts2,cv.FM_LMEDS)
# We select only inlier points
pts1 = pts1[mask.ravel()==1]
pts2 = pts2[mask.ravel()==1]

print(len(pts1),len(pts2))
print(cv.__version__)

E, mask_2 = cv.findEssentialMat(pts1, pts2, focal=f_x, pp=(O_x, O_y), method=cv.FM_LMEDS, prob=0.999, threshold=3.0)
print("Essential Matrix")
print(E)
print(" ")
points, R_1, t_1, mask_2 = cv.recoverPose(E, pts1, pts2,pts2,focal=f_x, pp=(O_x, O_y), mask = mask_2)
print("Rotation Matrix")
print(R_1)
print(" ")
R_M = R.from_matrix(R_1)
R_1_E = R_M.as_euler('zyx', degrees=True)
print("angles (z,y,x) or (alpha, beta, gamma) Z is dir of Principal Ray, Y is Vert and X is horiz")
print(R_1_E)
print("Translation")
print(t_1)

K = np.array([[f_x, 0,O_x],
             [0,f_x, O_y],
             [0,0,1]])

Pr_1 = np.array([[1,0,0,0],[0,1,0,0],[0,0,1,0]])
Pr_2 = np.hstack((np.dot(K,R_1),np.dot(K,t_1)))
#Pr_2 = np.hstack((R_1,t_1))

pts1_t = pts1[:200].T
pts2_t = pts2[:200].T
#print(pts1_t)

points4D = cv.triangulatePoints(Pr_1,Pr_2,pts1_t, pts2_t)
#print(points4D.T[:3].T)
coordinate_eucl= cv.convertPointsFromHomogeneous(points4D.T)
coordinate_eucl=coordinate_eucl.reshape(-1,3)
px,py,pz=coordinate_eucl.T
coordP = []
for i in range(len(px)):
    coordP.append([px[i],py[i],pz[i]])
print(coordP[:20])

1 Ответ

0 голосов
/ 25 августа 2020

функция точек триангуляции в OpenCV Python работает не очень хорошо.

Я использовал функции, созданные Eliasvan, здесь: https://github.com/Eliasvan/Multiple-Quadrotor-SLAM/blob/master/Work/python_libs/triangulation.py

I использовал функцию Linear_LS_Triangulation, у меня сработало очень хорошо и быстро.

...