Для проверки результатов двуходового подхода SFM для оценки положения камеры [R | t], я использовал шаблоны шахматной доски, которые я использовал для калибровки, особенно, что «calibrateCamera» функция в OpenCV возвращает векторы вращения и трансляции для каждого шаблона. И, следовательно, относительная поза между скажем, первые два шаблона могут быть легко рассчитаны.некорректная поза камеры с двух сторон SFM
Но я не получаю правильную позу камеры, и я изо всех сил пытаюсь понять проблему, но не напрасно.
Буду признателен за ваш вклад в решение моей проблемы.
МОЙ КОД Описание:
- undistort изображения
- находкой шахматная доска углы в двух изображениях
- матча точек (проверенными откладывая стороны в сторону двух изображений и линий)
- оценка фундаментальная матрица (проверено: x'T * F * x = 0)
- Существенная матрица (E) = KT * F * K (проверено: X'T * E * X = 0)
- СВД E = U * S * VT
R = U * W * VT или U * WT * VT такой, что WT = [0, -1,0; 1,0,0; 0,0,1]
FundMat, mask = cv2.findFundamentalMat(imgpoints1, imgpoints2, cv2.FM_LMEDS) # is the fundamental matrix is really a fundamental Matrix. xFx'=0 ?? # verfication of fundamental matrix for i in range(len(imgpoints1)): X = np.array([imgpoints1[i][0],imgpoints1[i][1],1]) X_prime = np.array([imgpoints2[i][0],imgpoints2[i][1],1]) err = np.dot(np.dot(X_prime.T,FundMat),X) if mask[i] == True: print(err) # E = [t]R = (K_-T)_-1 * F * K = K_T*F*K term1 = np.dot(np.transpose(mtx), FundMat) # newcameramtx , mtx E = np.dot(term1, mtx) # newcameramtx , mtx # verfication of Essential matrix for i in range(len(imgpoints1)): X_norm = np.dot(np.linalg.inv(mtx), np.array([imgpoints1[i][0],imgpoints1[i][1],1]).T) X_prime_norm = np.dot(np.linalg.inv(mtx), np.array([imgpoints2[i][0],imgpoints2[i][1],1]).T) err_Ess = np.dot(np.dot(X_prime_norm.T,E),X_norm) if mask[i] == True: print(err_Ess) # SVD of E U,S,V_T = np.linalg.svd(E) # computation of Rotation and Translation without enforcement W = np.array([[0,-1,0],[1,0,0],[0,0,1]]) Rot1 = np.dot(np.dot(U, W), V_T) Rot2 = np.dot(np.dot(U, W.T), V_T)
Большое вам спасибо за ответ! , Я сравнивал между вращениями, полученными как из одной основной матрицы, вычисленной один раз с помощью 5-точечного алгоритма «cv2.findEssentialMat», а другого - компьютера из фундаментальной матрицы. Я узнал, что оба дают более или менее похожие матрицы вращения, очень незначительные различия. но, тем не менее, ни одна из них не соответствовала относительной матрице вращения, но, однако, была и небольшая разница, и все признаки матрицы были инвертированы. А именно Rot_from_E = - R_relative –
У меня на самом деле была проблема с конфигурацией, этот алгоритм вычисляет положение камеры, предполагая, что камера меняется, но в моем случае объект менялся. поэтому относительная поза должна быть вычислена следующим образом: R_relative = T1 * inv (T2) вместо: R_rel = inv (T2) * T1. Я на самом деле сделал еще один код, где я смоделировал камеру и принял точки и позы, а также не работал с компланарным объектом. и я получил матрицу вращения справа. –
На самом деле, теперь я попробовал другое. Я удалил искажение изображения, а матрица Essential из 5-точечного алгоритма дала мне точную относительную позу. –