2016-07-26 11 views
2

Для проверки результатов двуходового подхода 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) 
    

ответ

0

Ваша проблема заключается в том, что вы используете очки с шахматной доски, вы не можете оценить фундаментальную матрицу из копланарных точек. Один из способов исправить это - совместить точки сцены с использованием общего подхода, такого как SIFT или SURF. Другой способ - оценить основную матрицу напрямую, используя 5-точечный алгоритм, поскольку матрицу Essential можно вычислить из копланарных точек.

Кроме того, имейте в виду, что вы можете рассчитывать только камеру по шкале от основной матрицы. Другими словами, ваш перевод станет единичным вектором. Одним из способов расчета масштабного коэффициента для получения фактической длины перевода является использование вашей шахматной доски.

+0

Большое вам спасибо за ответ! , Я сравнивал между вращениями, полученными как из одной основной матрицы, вычисленной один раз с помощью 5-точечного алгоритма «cv2.findEssentialMat», а другого - компьютера из фундаментальной матрицы. Я узнал, что оба дают более или менее похожие матрицы вращения, очень незначительные различия. но, тем не менее, ни одна из них не соответствовала относительной матрице вращения, но, однако, была и небольшая разница, и все признаки матрицы были инвертированы. А именно Rot_from_E = - R_relative –

+0

У меня на самом деле была проблема с конфигурацией, этот алгоритм вычисляет положение камеры, предполагая, что камера меняется, но в моем случае объект менялся. поэтому относительная поза должна быть вычислена следующим образом: R_relative = T1 * inv (T2) вместо: R_rel = inv (T2) * T1. Я на самом деле сделал еще один код, где я смоделировал камеру и принял точки и позы, а также не работал с компланарным объектом. и я получил матрицу вращения справа. –

+0

На самом деле, теперь я попробовал другое. Я удалил искажение изображения, а матрица Essential из 5-точечного алгоритма дала мне точную относительную позу. –