आयताकार में चतुर्भुज को कैसे असंसाधित करें?


10

tl; dr: प्रोजेक्टिव ज्योमेट्री में मैथ प्रॉब्लम: कैसे कोई 4x4 कैमरा मैट्रिक्स पाता है जो नीचे दिए गए जैसा प्रोजेक्शन देता है, जैसे कि A, B, C, D, यूनिट बॉक्स के किनारों पर कहीं होते हैं (जैसे OpenGL सामान्यीकृत डिवाइस) निर्देशांक), और यूनिट बॉक्स के कोने किरणों ईए, ईबी, ईसी, ईडी के साथ कहीं उचित हैं?

(यह एक विशेष रूप से एक होमोग्राफी, एक दृष्टिकोण, और / या एक कोलिनेशन का एक विशेष मामला हो सकता है। शब्दावली से परिचित नहीं है।)


विस्तार

व्यूपोर्ट के भीतर एक चतुर्भुज ABCD को देखते हुए, मुझे लगता है कि एक अद्वितीय (?) परिवर्तन मौजूद है जो इसे एक आयत में वापस मैप करता है। जैसा कि नीचे दी गई छवि में देखा गया है: व्यूपोर्ट में चतुर्भुज ABCD एक भौतिक 'विंडो' के रूप में कार्य करता है, और यदि हम इसे एक आयत में वापस मैप करते हैं तो यह विकृत दिखाई देगा।

यहाँ छवि विवरण दर्ज करें

(दाईं ओर का बॉक्स NDC का प्रतिनिधित्व करता है, जिसके बारे में मैं बाद में बात करता हूं)

लक्ष्य को सही पर छवि को जल्दी से प्राप्त करना है। हम छवि को प्राप्त करने के लिए हर बिंदु पर पुनर्विचार कर सकते हैं (जो मैंने किया है), लेकिन मैं ओपनजीएल या अन्य प्रक्षेप्य तकनीकों का उपयोग करना पसंद करूंगा क्योंकि मैं सम्मिश्रण, आदिम चीजों का लाभ उठाना चाहता था।

पहला प्रयास

मेरा मानना ​​है कि मैं 3x4 कैमरा मैट्रिक्स को खोजने की समस्या को हल कर सकता हूं जो 3-अंतरिक्ष में (बाईं ओर) 3 + 1-आयामी सजातीय समन्वय बनाता है और इसे 2-अंतरिक्ष में 2 + 1 आयामी सजातीय निर्देशांक के नीचे प्रोजेक्ट करता है (पर) सही)। कैमरा मैट्रिक्स की अज्ञात प्रविष्टियों के लिए समीकरणों की एक प्रणाली प्राप्त करने के लिए प्रत्यक्ष रैखिक परिवर्तन का उपयोग करके इसे हल किया जा सकता है , और एकवचन मान विघटन का उपयोग करके सिस्टम को हल करनाBa=0a(एस वी डी)। मैं पूर्व-छवि के बिंदुओं और (0,0), (1,0), (1) में ईए, ईबी, ईसी, ईडी (जहां ई आपकी भौतिक आंख या विश्व-अंतरिक्ष में कैमरा है) को वैक्टर ले जाएगा। , 1), (0,1) या पोस्ट-इमेज में अंक के रूप में कुछ, और प्रत्येक जोड़ी अंक एसवीडी में प्लग करने के लिए कुछ रेखीय समीकरण देगा। परिणामी मैट्रिक्स ईए -> (0,0) आदि का नक़्शा बनाएगी (यह मानते हुए कि स्वतंत्रता के लिए पर्याप्त डिग्री हैं अर्थात यदि समाधान अद्वितीय है, जिसके बारे में मुझे यकीन नहीं है, तो नोट देखें [a]।)

लेकिन मेरे चैरगिन के लिए यह नहीं है कि ओपनजीएल कैसे काम करता है। ओपनजीएल 3 डी मैट्रिक्स के साथ सीधे 2 डी को 2 डी प्रोजेक्ट नहीं करता है। ओपनजीएल को "सामान्यीकृत डिवाइस निर्देशांक" (एनडीसी) की आवश्यकता होती है, जो तीन-आयामी बिंदु हैं। NDC में प्रोजेक्ट करने के बाद, (-1, -1, -1,1) से 'यूनिट' बॉक्स में (1,1,1,1) सब कुछ खींचा जाता है; बाहर सब कुछ बंद है (क्योंकि हम सजातीय निर्देशांक के साथ काम कर रहे हैं: कोई भी बिंदु (x, y, z, w) केवल तभी स्क्रीन पर दिखाई देगा, जब पहले तीन निर्देशांक (x / w, y / w, z / w , 1) -1 से 1 तक इकाई बॉक्स के भीतर हैं)।

तो यह सवाल बनता है: क्या कुछ उचित परिवर्तन मौजूद हैं जो कुछ अजीब-से दिखने वाले घनाभ को समरूप निर्देशांक में चित्रित करते हैं (विशेषकर ABCD (सामने वाले बिंदु) और A'B'C'D 'के साथ बाईं ओर खींचा गया) (पीछे के बिंदु, छिपे हुए) सामने के बिंदुओं पर)) यूनिट क्यूब के लिए, जैसे 4x4 मैट्रिक्स का उपयोग करना? कोई कैसे करता है?

मैंने क्या कोशिश की है

मैंने कुछ और मजबूत करने की कोशिश की है: मैंने ABCD और A'B'C'D को एक नियमित पिरामिड फ़्रैम (जैसे gl frrum) की तरह देखा है (यानी इस काल्पनिक सेटअप में, बाईं ओर की छवि बस एक काले आयत पर आधारित होगी यह, एक चतुर्भुज नहीं), और फिर कथित 4x4 मैट्रिक्स के समाधान के लिए DLT / प्रत्यक्ष रैखिक परिवर्तन का उपयोग किया। हालाँकि जब मैंने इसकी कोशिश की, तो स्वतंत्रता की पर्याप्त डिग्री नहीं मिली ... परिणामस्वरूप 4x4 मैट्रिक्स ने हर इनपुट वेक्टर को हर आउटपुट वेक्टर पर मैप नहीं किया। ए, बी, सी, डी, ए '(पूर्व-परिवर्तन और पोस्ट-ट्रांसफ़ॉर्म वैक्टर के 5 जोड़े) का उपयोग करते समय, I / लगभग / मुझे जो परिणाम चाहिए वह मिलता है ... वैक्टर को सही ढंग से मैप किया जाता है, लेकिन उदाहरण के लिए B', (-1, -1,1,1) के बजाय C (D,) (3,3,1,1) मैपिंग कर रहे हैं और OpenGL से दूर हो गए हैं। अगर मैं एक छठे बिंदु को जोड़ने की कोशिश करता हूं (परियोजना के लिए 4x4 मैट्रिक्स के लिए 6 जोड़े), मेरा समाधान पतित (शून्य, शिशु) लगता है। आजादी के कितने डिग्री मैं यहां काम कर रहा हूं, और क्या यह 4x4 मैट्रिक्स के साथ सामान्य 4vectors (3 + 1-आयामी सजातीय-समन्वित वैक्टर) को मैप करना संभव है जो हम जानते हैं और प्यार करते हैं?

यादृच्छिक छोटे विचार

मैं अनुमान लगा रहा हूं कि 4x4 मैट्रिक्स के साथ किसी भी मनमाने क्यूबॉइड के लिए किसी भी मनमाना क्यूबाइड को मैप करना संभव नहीं है, हालांकि मैं उलझन में हूं क्योंकि मुझे लगा कि किसी भी उत्तल चतुर्भुज के लिए 2d में किसी भी उत्तल चतुर्भुज के साथ कुछ मैट्रिक्स में मैप करना संभव है जैसे कि , कहते हैं, फ़ोटोशॉप? ... एक प्रक्षेपवक्र परिवर्तन के साथ यह नहीं किया जा सकता है? और यह कैसे 3 डी के लिए सामान्यीकरण करता है? ...... इसके अलावा एक 4x4 मैट्रिक्स को खोजने के असफल प्रयास को देखते हुए, रैखिक बीजगणित कहता है कि हमें NxN मैट्रिक्स से सबसे अच्छे मामले में N लक्ष्य बिंदुओं के लिए N रैखिक रूप से स्वतंत्र बिंदुओं से अधिक मैप करने की उम्मीद नहीं करनी चाहिए, लेकिन मुझे लगता है कि किसी तरह सजातीय निर्देशकों ने इसे धोखा दिया क्योंकि कुछ छिपी हुई कॉलिनरिटी चल रही है? मुझे नहीं लगता?

एक और समाधान?

मुझे लगता है कि कोई भी निम्न बदसूरत चीज़ कर सकता है, जहां आप एक विशिष्ट फ़्रस्ट्रम कैमरा प्रोजेक्शन मैट्रिक्स का उपयोग करते हैं, कोनों के अनुरूप 2d अंक प्राप्त करते हैं, फिर 2 डी परिप्रेक्ष्य विकृत होमोग्राफी करते हैं, लेकिन अगर पिक्सेल रेंडर होने के बाद ऐसा होता है। (उदाहरण फोटोशॉप) तो संकल्प के साथ समस्याएं होंगी ... शायद काल्पनिक रूप से कोई एनडीसी-स्पेस के भीतर एक्सवाई-प्लेन पर इस परिवर्तन को करने के लिए एक मैट्रिक्स का पता लगा सकता है, फिर इसे सामान्य फ्रस्ट्रम-आधारित मैट्रिक्स के साथ रचना कर सकता है?

(नोट [a]: स्वतंत्रता की डिग्री: ABCD आगे एक आयत पर अभिनय करने वाले एक परिवर्तनकारी परिवर्तन की पोस्ट-छवि होने के लिए विवश हो सकती है, यदि वह आवश्यक हो ... तो बाईं ओर काला आयत कहा जा सकता है चित्र फ़्रेम क्लिपआर्ट मॉडल पेश करने का परिणाम)


1
यदि आप कोने के पिन के लिए गूगल करते हैं तो आपको इस का कुछ कार्यान्वयन मिलता है
पूजा

जवाबों:


1

मुझे लगता है कि समाधान चार बिंदुओं को सही ढंग से रूपांतरित करने वाले प्रक्षेप्य परिवर्तन की तलाश में है।

अर्थात

y=P×x

x=[x0,x1,1]y=[y0y2,y1y2]

P

अब आप ऐसा करने के लिए बीजगणित का उपयोग कर सकते हैं, या बस OpenCV के getPerspectiveTransform:) का उपयोग कर सकते हैं ।

इसके अलावा अवधारणा से परिचित होने के लिए विकिपीडिया पर समरूप निर्देशांक देखें


धन्यवाद! (मैंने इसे कुछ समय पहले हल किया और अभी समाधान पोस्ट किया जब मैंने आपकी टिप्पणी देखी।)
ninjagecko

0

मैंने डायरेक्ट लीनियर ट्रांसफॉर्मेशन को लागू करके अपना प्रश्न हल किया । विकिपीडिया पर उदाहरण अनुभाग मेरा उपयोग मामला था।

समीकरणों को प्राप्त करने के लिए, [x1 x2 x3 x4; x5 x6 x7 x8; x9 x10 x11 x12]अपने पसंदीदा कंप्यूटर बीजगणित प्रणाली जैसे मेटमैक्स (जैसे ) में सेजमैथ में प्लग करें, फिर आवश्यक मैट्रिक्स समीकरण को सचित्र के रूप में हल करें, चर के समाधान को अपने कोड में कॉपी-पेस्ट करें और स्वरूपण समायोजित करें।

एक के बाद एक के उपयोग के मामले को हल करने के लिए अनुकूलित कर सकते हैं या विशेष आयामों को उचित रूप में अनदेखा कर सकते हैं (जैसे कि सामान्यीकृत डिवाइस निर्देशांक मैट्रिक्स में गहराई / z समन्वय की उपेक्षा करें उपयोग के मामले में उपयुक्त)।

आपको अपनी भाषा में SVD अपघटन फ़ंक्शन या लाइब्रेरी की आवश्यकता होगी।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.