2016-10-11 20 views
1

Я пытаюсь вычислить матрицу существенных и проекционных изображений из двух изображений. Затем я буду использовать их для проецирования 3D-объекта на изображение. Два изображения, которые я использовал вObject Looking Skewed After Essential Matrix Calculation and Projection

enter image description here enter image description here

Я выбрал несколько пиксельных соответствий, и кормили, что на СВД основе наименьших квадратов механизм, который говорят книги дает мне необходимую матрицу. Я использовал следующий код для выполнения этой задачи (код основан главным образом на программировании Эрика Solem в Computer Vision с Python книги):

import scipy.linalg as lin 
import pandas as pd 

def skew(a): 
    return np.array([[0,-a[2],a[1]],[a[2],0,-a[0]],[-a[1],a[0],0]]) 

def essential(x1,x2): 
    n = x1.shape[1] 
    A = np.zeros((n,9)) 
    for i in range(n): 
     A[i] = [ x1[0,i]*x2[0,i], \ 
      x1[0,i]*x2[1,i], \ 
      x1[0,i]*x2[2,i], \ 
      x1[1,i]*x2[0,i], \ 
      x1[1,i]*x2[1,i], \ 
      x1[1,i]*x2[2,i], \ 
      x1[2,i]*x2[0,i], \ 
      x1[2,i]*x2[1,i], \ 
      x1[2,i]*x2[2,i]] 

    U,S,V = lin.svd(A) 
    F = V[-1].reshape(3,3) 
    return F 

def compute_P_from_essential(E): 
    U,S,V = lin.svd(E) 
    if lin.det(np.dot(U,V))<0: V = -V 
    E = np.dot(U,np.dot(np.diag([1,1,0]),V))   
    Z = skew([0,0,-1]) 
    W = np.array([[0,-1,0],[1,0,0],[0,0,1]])  
    P2 = [np.vstack((np.dot(U,np.dot(W,V)).T,U[:,2])).T, 
      np.vstack((np.dot(U,np.dot(W,V)).T,-U[:,2])).T, 
      np.vstack((np.dot(U,np.dot(W.T,V)).T,U[:,2])).T, 
      np.vstack((np.dot(U,np.dot(W.T,V)).T,-U[:,2])).T] 
    return P2 


points = [ \ 
    [266,163,296,160],[265,237,297,266],\ 
    [76,288,51,340],[135,31,142,4],\ 
    [344,167,371,156],[48,165,71,164],\ 
    [151,68,166,56],[237,26,259,19],\ 
    [226,147,254,140]] 

df = pd.DataFrame(points) 
df['uno'] = 1. 
x1 = np.array(df[[0,1,'uno']].T) 
x2 = np.array(df[[2,3,'uno']].T) 
print x1 
print x2 
E = essential(x1,x2) 
P = compute_P_from_essential(E) 

import pandas as pd 

x0 = 3.; y0 = 1.; z0 = 1. 

print df.shape 
e = 1 
cube = [[x0,y0,z0],[x0+e,y0,z0],[x0+e,y0+e,z0],[x0,y0+e,z0], 
     [x0,y0,z0+e],[x0+e,y0,z0+e],[x0+e,y0+e,z0+e],[x0,y0+e,z0+e]] 
cube = pd.DataFrame(cube) 
cube['1'] = 1. 

xx = np.dot(P[1], cube.T) * 100. 
xx[1,:] = 360-xx[1,:] 
#xx = xx/xx[2] 
print xx[0].shape 
plt.plot(xx[0], xx[1],'.') 
plt.xlim(0,640) 
plt.ylim(0,360) 

Я рассчитал необходимую матрицу, то матрица проекции, а затем использовал это спроецировать 3D-куб. Результат:

enter image description here

Это выглядит искажены, я не знаю, почему это произошло. Есть какие нибудь идеи как это починить?

Спасибо,

ответ

1

Прежде всего, это выглядит, как вы вычисления существенной матрицы, используя ровно 9 баллов. Вы можете сделать это, используя только 8 (так как масштаб является свободным параметром, вы можете умножить существенное на скаляр, и он останется таким же, чтобы вы могли исправить один из параметров и просто использовать 8 точек, но я отвлекаюсь.) Однако, на практике это очень плохая идея, потому что ваши 8 баллов могут иметь плохую пространственную конфигурацию. Итак, вы хотите выбрать N совпадений (например, 600) и использовать алгоритм, например RANSAC, чтобы определить лучшую матрицу Essential. Но помимо этого, я бы рекомендовал отлаживать такие приложения: вычислите матрицу FundalentalF на основе Essential, который вы только что вычислили. Теперь вы можете выбрать точку на изображении 1, а затем отобразить соответствующую эпиполярную линию во втором. Это поможет вам визуально оценить и тем самым отладить оценку Essential.

 Смежные вопросы

  • Нет связанных вопросов^_^