2017-09-16 10 views
6

카메라 내장 및 외각 인쇄의 이미지 기반에 3D 포인트를 투사하는 간단한 스크립트를 작성했습니다. 그러나 원점에있는 카메라가 z 축을 가리키고 3D 점이 z 축 아래로 내려 가면 카메라 앞에있는 대신 카메라 뒤에있는 것처럼 보입니다. 여기 제 스크립트가 있습니다. 여러 번 확인했습니다. I 생각할 수왜 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| 

내가 생각 :

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

당신은해야한다 부정적인 Z.에서 공간 포인트를 조정하지 않습니다 예를 들어, 각도 또는 플립을 기반으로 회전 행렬 문제를 해결할 것입니다.

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

하나 더 말 : 당신이 계산되어 실온() (이항), R은 신원 행렬 계산 행렬이 올바른지 여기에 확인하기위한 편리한 도구입니다. 이것은 모델과 아무런 차이가 없습니다. 전치 행렬에 대해서도 같지만, 변환 후에는 여전히 0이됩니다.

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

감사

+1

항등 행렬의 전치 항은 항등 행렬입니다. – MondKin

+0

@MondKin 사실, 대답을 수정했습니다. –