2017-09-16 30 views
6

Tôi đã viết một kịch bản đơn giản để chiếu các điểm 3D vào một cơ sở hình ảnh trên máy ảnh nội tại và bản in. Nhưng khi tôi có một máy ảnh tại điểm gốc chỉ xuống trục z và một điểm 3D xa hơn trục z nó xuất hiện phía sau máy ảnh thay vì ở phía trước nó. Đây là kịch bản của tôi, tôi đã kiểm tra nó rất nhiều lần.Tại sao điểm 3D xuất hiện phía sau máy ảnh?

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) 

Điều duy nhất tôi có thể nghĩ là ma trận xoay xác định không tương ứng với camera hướng xuống trục z âm với vector lên theo hướng trục dương. Nhưng tôi không thể thấy như thế nào không phải là trường hợp là ví dụ tôi đã xây dựng Rc từ một chức năng như gluLookAt và cho nó một máy ảnh tại nguồn gốc chỉ xuống trục z tiêu cực tôi sẽ nhận được ma trận nhận dạng.

+0

Bạn có thể giải thích cho tôi làm thế nào để bạn biết rằng máy ảnh của bạn được trỏ đến trục z tiêu cực? Có lẽ một camera ở vị trí (0,0,0) với ma trận xoay danh tính đang nhìn vào trục z cộng và không phải là điểm âm. –

Trả lời

3

Tôi nghĩ rằng sự nhầm lẫn là chỉ trong dòng này:

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

vì các công thức giả định Z-trục tích cực đi vào màn hình, vì vậy thực sự là một điểm với một giá trị Z tích cực sẽ được phía sau camera:

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

tôi dường như nhớ lại sự lựa chọn này là tùy ý để làm cho đại diện 3D chơi tốt với quan niệm ban 2D của chúng tôi: nếu bạn cho rằng máy ảnh của bạn đang tìm kiếm theo hướng -Z, sau đó X tiêu cực sẽ sang trái khi Y tích cực chỉ lên. Và trong trường hợp này, chỉ có những thứ với âm Z sẽ ở phía trước máy ảnh.

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

Trước hết, bạn đã thực hiện chuyển đổi ma trận nhận dạng. Bạn có camera ma trận xoay:

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

nào không làm cho phối hợp điểm không gian tại Z. tiêu cực Bạn nên ma trận xoay dựa trên góc độ hoặc lật, ví dụ:

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

Tôi nghĩ rằng sẽ khắc phục sự cố của bạn. Đây là công cụ hữu ích để kiểm tra nếu ma trận tính là chính xác:

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

Một nhận xét nữa: bạn đang tính toán R.t() (chuyển vị), và R là nhận dạng ma trận. Điều này làm cho không có sự khác biệt cho mô hình. Tương tự cho ma trận chuyển vị, mà vẫn bằng 0 sau khi chuyển đổi.

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

Trân

+1

Việc chuyển đổi ma trận nhận dạng là ma trận nhận dạng. – MondKin

+0

@MondKin Đúng, tôi đã sửa câu trả lời của mình. –

Các vấn đề liên quan