2013-12-16 15 views
5

Opencv findFundamentalMat kullanarak iki kamera arasında Temel Matrisi hesapladım. Ardından görüntüdeki epipolar çizgileri çiziyorum. Ben Hartley & Zissserman yaklaşım kullanarak o temel matrisin, bilgi işlem ilk temel matris den poz almaya çalıştı ve, ŞimdiTemel matristen poz ve tam tersi

Epipolar lines ok : Ve ben gibi bir şey olsun. Burada doğru olana kadar her şeyi kontrol etmek için

K2=np.mat(self.calibration.getCameraMatrix(1)) 
K1=np.mat(self.calibration.getCameraMatrix(0)) 
E=K2.T*np.mat(F)*K1 

H&Z

w,u,vt = cv2.SVDecomp(np.mat(E)) 
if np.linalg.det(u) < 0: 
    u *= -1.0 
if np.linalg.det(vt) < 0: 
    vt *= -1.0 
#Find R and T from Hartley & Zisserman 
W=np.mat([[0,-1,0],[1,0,0],[0,0,1]],dtype=float) 
R = np.mat(u) * W * np.mat(vt) 
t = u[:,2] #u3 normalized. 

, ben E ve F recompute ve tekrar Epipolar çizgiler çizmek.

S=np.mat([[0,-T[2],T[1]],[T[2],0,-T[0]],[-T[1],T[0],0]]) 
E=S*np.mat(R) 
F=np.linalg.inv(K2).T*np.mat(E)*np.linalg.inv(K1) 

Ama sürpriz, çizgiler hareket etti ve artık puanlardan geçmiyorlar. Yanlış bir şey mi yaptım?

epilines bad

Bu soruya http://answers.opencv.org/question/18565/pose-estimation-produces-wrong-translation-vector/ ile ilgili olabilir, ancak ben almak matrisler olan bir çözüm

vermedi:

Original F=[[ -1.62627683e-07 -1.38840952e-05 8.03246936e-03] 
[ 5.83844799e-06 -1.37528349e-06 -3.26617731e-03] 
[ -1.15902181e-02 1.23440336e-02 1.00000000e+00]] 

E=[[-0.09648757 -8.23748182 -0.6192747 ] 
[ 3.46397143 -0.81596046 0.29628779] 
[-6.32856235 -0.03006961 -0.65380443]] 

R=[[ 9.99558381e-01 -2.72074658e-02 1.19497464e-02] 
    [ 3.50795548e-04 4.12906861e-01 9.10773189e-01] 
    [ -2.97139627e-02 -9.10366782e-01 4.12734058e-01]] 

T=[[-8.82445166e-02] 
[8.73204425e-01] 
[4.79298380e-01]] 

Recomputed E= 
[[-0.0261145 -0.99284189 -0.07613091] 
[ 0.47646462 -0.09337537 0.04214901] 
[-0.87284976 -0.01267909 -0.09080531]] 

Recomputed F= 
[[ -4.40154169e-08 -1.67341327e-06 9.85070691e-04] 
[ 8.03070680e-07 -1.57382143e-07 -4.67389530e-04] 
[ -1.57927152e-03 1.47100268e-03 2.56606003e-01]] 

cevap

2

ilk F kadar tanımlanır Bu nedenle, döndürülen F'yi karşılaştırırsanız ve E'den hesaplanan F matrisi ile, her ikisinin de aynı ölçekte olduğundan emin olmak için bunları normalleştirmeniz gerekir. Bu nedenle, ikinci hesaplanmış F.

+0

'u normalize etmeniz gerekir. Hem sayısal olarak hem de sadece çizdikleri epipolar satırları karşılaştırmayı hedeflemiyorum ... O zaman önemli mi? Normalleştirirken sütun normalleştirmeyi mi kastediyorsunuz? –

+0

Epipolar çizgilerin çizilmesinde Evet, OpenCV'nin fonksiyonunu kullanmalısınız ve benim anlayışım gereği normalleştirilmiş matrisi de gerektirir. OpenCV'de normalleşme hakkında daha fazla şey okumak zorundasınız. (Uzun süre kullandığım gibi normalleştirme türünden emin değilim.) –

İlgili konular