2017-09-16 15 views
6

मैंने कैमरे के इंट्रिनिक्स और एक्सट्रिंटिक्स पर छवि अड्डों में 3 डी पॉइंट प्रोजेक्ट करने के लिए एक साधारण स्क्रिप्ट लिखी। लेकिन जब मेरे पास ज़ेड-अक्ष को इंगित करने वाले मूल पर कैमरा होता है और ज़ेड-अक्ष के नीचे एक 3 डी अंक आगे होता है तो यह इसके सामने कैमरे के पीछे होता है। मेरी स्क्रिप्ट यहाँ है, मैंने इसे कई बार चेक किया है।कैमरे के पीछे एक 3 डी बिंदु क्यों दिखता है?

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- अक्ष नीचे ओर इशारा करते हुए के अनुरूप नहीं है है। लेकिन मैं नहीं देख सकता कि यह मामला कैसे नहीं होगा उदाहरण के लिए मैंने ग्लू लुकएट जैसे फ़ंक्शन से आरसी का निर्माण किया था और नकारात्मक जेड-अक्ष को इंगित करने वाले मूल पर कैमरा दिया था, मुझे पहचान मैट्रिक्स मिलेगा।

+0

तुम मुझे व्याख्या कर सकते हैं आप कैसे जानते हैं कि अपने कैमरे नकारात्मक z अक्ष की ओर इशारा करते है? शायद पहचान रोटेशन मैट्रिक्स के साथ स्थान (0,0,0) में एक कैमरा प्लस जेड अक्ष को देख रहा है, न कि ऋणात्मक। –

उत्तर

3

मुझे लगता है कि भ्रम की स्थिति केवल इस पंक्ति में है:

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

क्योंकि इन सूत्रों मान सकारात्मक Z- अक्ष स्क्रीन में चला जाता है तो वास्तव में एक सकारात्मक जेड मूल्य के साथ एक बिंदु कैमरे के पीछे हो जाएगा: यदि आप अपने कैमरे -Z दिशा में देख रहा है मान लेते हैं, तो नकारात्मक एक्स बाईं जब करने के लिए किया जाएगा:

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

मैं इस विकल्प को याद करने लगते हैं 3D प्रतिनिधित्व के हमारे 2 डी पूर्वाग्रहों के साथ अच्छी तरह से खेलते बनाने के लिए मनमाने ढंग से है सकारात्मक वाई अंक ऊपर। और इस मामले में, नकारात्मक जेड के साथ केवल चीजें कैमरे के सामने होंगी।

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

कौन सा नकारात्मक जेड आप बनाना चाहिए पर अंतरिक्ष बिंदु समन्वय नहीं है रोटेशन कोण या फ्लिप, उदाहरण के लिए के आधार पर मैट्रिक्स आपकी समस्या ठीक कर देगा। यहाँ की जाँच के लिए उपयोगी टूल है अगर गणना की मैट्रिक्स सही है:

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

एक और टिप्पणी: यदि आप परिकलित कर रहे हैं R.t() (स्थानांतरण), और आर पहचान मैट्रिक्स है। यह मॉडल के लिए कोई फर्क नहीं पड़ता है। ट्रांसपोजिशन मैट्रिक्स के लिए वही है, जो अभी भी रूपांतरण के बाद 0 के बराबर है।

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

सादर

+1

पहचान मैट्रिक्स का स्थानांतरण पहचान मैट्रिक्स है। – MondKin

+0

@MondKin True, मैंने अपना जवाब सही किया। –

संबंधित मुद्दे