2010-02-16 18 views
8

हार्टले/ज़िसमैन के मल्टीव्यू जियोमेटरी के बाद, एल्गोरिदम 12: इष्टतम त्रिभुज विधि (पी 318), मुझे संबंधित छवि अंक xhat1 और xhat2 (चरण 10) मिला। चरण 11 में, किसी को 3 डी पॉइंट Xhat की गणना करने की आवश्यकता है। ऐसी एक विधि डायरेक्ट लीनियर ट्रांसफॉर्म (डीएलटी) है, जिसका उल्लेख 12.2 (पी 312) और 4.1 (पी 88) में किया गया है।त्रिभुज और प्रत्यक्ष रैखिक परिवर्तन

समरूप विधि (DLT), p312-313, कहा गया है कि यह इकाई विलक्षण वेक्टर एक के सबसे छोटे विलक्षण मान के संगत है, इस प्रकार के रूप में एक समाधान पाता है,

A = [xhat1(1) * P1(3,:)' - P1(1,:)' ; 
     xhat1(2) * P1(3,:)' - P1(2,:)' ; 
     xhat2(1) * P2(3,:)' - P2(1,:)' ; 
     xhat2(2) * P2(3,:)' - P2(2,:)' ]; 

[Ua Ea Va] = svd(A); 
Xhat = Va(:,end); 

plot3(Xhat(1),Xhat(2),Xhat(3), 'r.'); 

हालांकि, एक एक 16x1 है मैट्रिक्स, जिसके परिणामस्वरूप एक वीए 1x1 है।

3 डी बिंदु प्राप्त करने में मैं गलत (और एक फिक्स) क्या कर रहा हूं?

के लिए क्या इसके लायक नमूना डेटा:

xhat1 = 

    1.0e+009 * 

    4.9973 
    -0.2024 
    0.0027 


xhat2 = 

    1.0e+011 * 

    2.0729 
    2.6624 
    0.0098 


P1 = 

    699.6674   0 392.1170   0 
     0 701.6136 304.0275   0 
     0   0 1.0000   0 


P2 = 

    1.0e+003 * 

    -0.7845 0.0508 -0.1592 1.8619 
    -0.1379 0.7338 0.1649 0.6825 
    -0.0006 0.0001 0.0008 0.0010 


A = <- my computation 

    1.0e+011 * 

    -0.0000 
     0 
    0.0500 
     0 
     0 
    -0.0000 
    -0.0020 
     0 
    -1.3369 
    0.2563 
    1.5634 
    2.0729 
    -1.7170 
    0.3292 
    2.0079 
    2.6624 

अद्यतन एल्गोरिथ्म

% xi 
A = [xhat1(1) * P1(3,:) - P1(1,:) ; 
    xhat1(2) * P1(3,:) - P1(2,:) ; 
    xhat2(1) * P2(3,:) - P2(1,:) ; 
    xhat2(2) * P2(3,:) - P2(2,:) ]; 

A(1,:) = A(1,:)/norm(A(1,:)); 
A(2,:) = A(2,:)/norm(A(2,:)); 
A(3,:) = A(3,:)/norm(A(3,:)); 
A(4,:) = A(4,:)/norm(A(4,:)); 

[Ua Ea Va] = svd(A); 
X = Va(:,end); 
X = X/X(4); % 3D Point 
+0

यह के लिए छोटी से छोटी उम्मीद जानकारी के साथ पोस्ट करने के लिए बेहतर हो सकता है xhat1, पी 1 इत्यादि ताकि हम एक कामकाजी उदाहरण की प्रतिलिपि बना सकें और पेस्ट कर सकें और यह मानना ​​न पड़े कि आपके इनपुट में कौन सा फॉर्म है। – MatlabDoug

उत्तर

10

के रूप में किताब (सेकंड 12.2) में बताया गया है में खंड xi के लिए कार्य करना कोड, पीमैं टीपंक्तियां हैं पी। इसलिए, आपको P1(k,:) को स्थानांतरित करने की आवश्यकता नहीं है (यानी सही फॉर्मूलेशन A = [xhat1(1) * P1(3,:) - P1(1,:) ; ... है)।

मुझे आशा है कि यह सिर्फ एक टाइपो था।

इसके अतिरिक्त, यह अपने एल 2 मानक के साथ A की प्रत्येक पंक्ति को सामान्य बनाने की सिफारिश की है, सभी i

A(i,:) = A(i,:)/norm(A(i,:));

के लिए IE और अगर आप triangulated 3 डी बिन्दु करना चाहते हैं, इससे पहले कि आप Xhat को सामान्य करने के लिए है साजिश रचने (अपने व्यर्थ अन्यथा), यानी

Xhat = Xhat/Xhat(4);

+0

जैकब, आप उल्लेख करते हैं कि ए की पंक्तियों को सामान्यीकृत किया जाना चाहिए। क्या Frobenius मानक (?) पी 10 9 पर सामान्यीकरण से काफी अलग है जो xhat1 और xhat2 को सामान्य करता है, डीएलटी को डी-सामान्य करता है? – yxk

+1

नहीं, यह अलग है - इसका उपयोग सिर्फ एसवीडी गणना को कोसाइन माप का उपयोग करने के लिए किया जाता है। और मेरा मतलब एल 2 मानदंड था, यानी || ए (i, :) ||। – Jacob

+0

मेरे मामले में, एसवीडी लागू करने से पहले ए की पंक्तियों के सामान्यीकरण के परिणामस्वरूप अप्रत्याशित reprojection त्रुटियों (कैमरे पर त्रिभुज बिंदु प्रक्षेपित करके और अनुमानों के बीच की दूरी की गणना और त्रिकोण के लिए इनपुट की गणना करके गणना की गई) 0.007 से 22px तक थी। सामान्यीकरण को हटाने से सीमा को 0.001-0.4 पीएक्स तक लाया गया। – neuviemeporte

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