2017-09-16 21 views
6

3B noktaları, kamera iç öğeleri ve ek baskılar üzerine bir resim tabanına yansıtmak için basit bir komut dosyası yazdım. Ancak, z eksenini ve z eksenini aşağıya doğru bir 3B noktaya işaret eden bir fotoğraf makinesine sahip olduğumda, kameranın önünde değil, arkasında görünüyor. İşte senaryolarım, çok defa kontrol ettim. AklımaFotoğraf makinesinin arkasında neden bir 3D nokta var?

import numpy as np 

def project(point, P): 
    Hp = P.dot(point) 

    if Hp[-1] < 0: 
     print 'Point is behind camera' 

    Hp = Hp/Hp[-1] 
    print Hp[0][0], 'x', Hp[1][0] 
    return Hp[0][0], Hp[1][0] 

if __name__ == '__main__': 

    # Rc and C are the camera orientation and location in world coordinates 
    # Camera posed at origin pointed down the negative z-axis 
    Rc = np.eye(3) 
    C = np.array([0, 0, 0]) 

    # Camera extrinsics 
    R = Rc.T 
    t = -R.dot(C).reshape(3, 1) 

    # The camera projection matrix is then: 
    # P = K [ R | t] which projects 3D world points 
    # to 2D homogenous image coordinates. 

    # Example intrinsics dont really matter ... 

    K = np.array([ 
     [2000, 0, 2000], 
     [0, 2000, 1500], 
     [0, 0, 1], 
    ]) 


    # Sample point in front of camera 
    # i.e. further down the negative x-axis 
    # should project into center of image 
    point = np.array([[0, 0, -10, 1]]).T 

    # Project point into the camera 
    P = K.dot(np.hstack((R, t))) 

    # But when projecting it appears to be behind the camera? 
    project(point,P) 

tek şey tespit rotasyon matrisi pozitif y ekseni yönünde yukarı vektörü ile negatif z-eksenini aşağı bakacak kameraya karşılık gelmez olmasıdır. Ama bunun nasıl bir durum olamayacağını göremiyorum, örneğin, RL'yi gluLookAt gibi bir fonksiyondan oluşturdum ve orijininde matrisin negatif z eksenini gösteren bir kamera verildi. Bu formüllerden kamera arkasında olacak, pozitif Z ekseni ekranına girer pozitif Z değeri ile yani aslında bir noktayı varsayalım çünkü

if Hp[-1] < 0: 
    print 'Point is behind camera' 

:

+0

size kamera negatif z eksenine işaret ettiğini biliyoruz bana nasıl açıklayabilir misiniz? Belki kimlik rotasyon matrisi ile konumdaki bir kamera (0,0,0) artı z eksenine bakar ve negatif olanı değil. –

cevap

3

Ben karışıklık sadece bu satırda olduğunu düşünüyorum: Eğer kamera -Z yönünde bakıyor varsayarsak, o zaman olumsuz X sola ne zaman olacak:

if Hp[-1] > 0: 
    print 'Point is behind camera' 

Ben bu seçimi hatırlamak gibi görünüyor 3D gösterimi bizim 2D önyargılarla iyi oynamak yapmak keyfi Olumlu Y puanlar. Ve bu durumda, sadece kameranın önünde negatif Z olan şeyler olacaktır.

-1
# Rc and C are the camera orientation and location in world coordinates 
# Camera posed at origin pointed down the negative z-axis 
Rc = np.eye(3) 
C = np.array([0, 0, 0]) 
# Camera extrinsics 
R = Rc.T 
t = -R.dot(C).reshape(3, 1) 

Her şeyden önce kimlik matrisi aktarımı gerçekleştirdiniz. Kamera rotasyon matrisi vardır:

|1, 0, 0| 
|0, 1, 0| 
|0, 0, -1| 

ben düşünüyorum:

| 1, 0, 0| 
| 0, 1, 0| 
| 0, 0, 1| 

Sen yapmalıdır negatif Z'de uzay koordinat noktası yapmaz mesela açılar veya kapak dayalı rotasyon matrisi senin problemini çözecek.

http://www.andre-gaschler.com/rotationconverter/

Bir laf daha: Eğer hesaplıyoruz R.t() (transpozisyon), ve R Kimlik matristir bilgisayarlı matris doğruysa İşte kontrol etmek için kullanışlı bir araçtır. Bu, modele göre bir fark yaratmaz. Dönüşümden sonra hala 0'a eşit olan aktarım matrisi için de aynı.

https://www.quora.com/What-is-an-inverse-identity-matrix

Selamlar

+1

Kimlik matrisinin aktarımı kimlik matrisidir. – MondKin

+0

@MondKin Doğru, cevabımı düzelttim. –

İlgili konular