6

私は、カメラのイントリンシクスと外見上のイメージベースに3Dポイントを投影するための簡単なスクリプトを書いた。しかし、私が原点にカメラを置いてz軸を指し、さらに3D点をz軸の下に置くと、カメラの前ではなくカメラの後ろにあるように見えます。ここに私のスクリプトがあります。私は何度もそれをチェックしました。3Dポイントがカメラの背後にあるように見えるのはなぜですか?

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) 

私が考えることができる唯一のことは、特定の回転行列は、カメラが正のy軸方向の最大ベクトルと負のz軸を下向きに対応していないことです。しかし、私はgluLookAtのような関数からRcを構築し、元の位置に負のz軸を指し示すカメラを与えた場合、恒等行列を得ることができない場合がどうなるかわかりません。これらの式は、カメラの後ろになり、正のZ軸がスクリーンに入る正のZ値を持つので、実際にポイントを取るため

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

+0

あなたはあなたのカメラが負のz軸を指していることを知っていますか私に説明できますか?たぶん、アイデンティティ回転行列を持つ位置(0,0,0)のカメラが、負の値ではなく正のz軸を見ている可能性があります。 –

答えて

3

私は混乱だけで、このラインであると思います:あなたのカメラは-Z方向に見ていると仮定した場合、その後、負のXは左ときに次のようになります。

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

私はこの選択を思い出すように見えるが、3D表現は、当社の2D先入観とよく遊ぶ作るために任意です正のYは上向きです。この場合、マイナスZのものだけがカメラの前にあります。

-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) 

まず、恒等行列の転置を実行しました。 あなたがカメラの回転行列持っている:私はと思い

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

:あなたは、たとえば、角度やフリップに基づいて回転行列を作る必要があり、負のZ.のスペースの座標点を作成しません

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

をあなたの問題を解決します。

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

つ以上の発言:あなたが計算されているR.t()(移調)、およびRは単位行列で計算された行列が正しい場合 はここでチェックするための便利なツールです。これはモデルに違いはありません。転置行列の場合も同じですが、変換後も0になります。

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

よろしく

+1

単位行列の転置は単位行列です。 – MondKin

+0

@MondKin真実、私は答えを修正しました。 –

関連する問題