2012-01-18 20 views
5

के साथ सतह पर प्रक्षेपण के लिए छवि सुधार ओपनसीवी में मेरे उदाहरणों में 3 डी सतह पर प्रक्षेपित छवि पर सुधार लागू करने के लिए सबसे अच्छा तरीका क्या है या Projection on 3D surface में दिखाया गया है?ओपनसीवी

ओपनसीवी चेकरबोर्ड कोने का पता लगाने के साथ मेरा पहला परीक्षण बहुत ही आशाजनक नहीं लग रहा था। अगर कैमरा कोण बहुत खड़ा था, तो छवि बहुत विकृत या बहुत छोटी थी (बहुत दूर) कोई कोने नहीं मिला था। इसके अलावा यदि चेकरबोर्ड में बहुत से फ़ील्ड थे।

मेरा विचार एल्गोरिदम का उपयोग करना था जैसे कि सतहों (वस्तुओं) का पता लगाने के लिए 3 डी स्कैनर में इसका उपयोग किया जाता है, लेकिन मुझे नहीं पता कि यह ओपनसीवी के साथ संभव है या नहीं। भले ही ओपनसीवी के साथ यह संभव नहीं होगा, ऐसे ऑब्जेक्ट स्कैनिंग के लिए उपयोग किए जाने वाले एल्गोरिदम क्या हैं?

यह छवियां दिखाती हैं कि यह किसी भी सुधार के बिना कैसा दिखता है। Uncorrected projection on surface

हरे आयताकार सही अनुमान हैं। Corrected projection (green)

+0

आप किस प्रकार के विवरण की तलाश में हैं? –

+0

सबसे पहले आपके उत्तर के लिए धन्यवाद। क्या आप विरूपण (एल्गोरिदम) का पता लगाने के बारे में कुछ मूल बातें बता सकते हैं। फिर, यदि किसी भी तरीके से सुधार डेटा पाया जाता है, तो सुधार के लिए ओपनसीवी विधियों का उपयोग करने के लिए सबसे अच्छा क्या है? दुर्भाग्यवश ओपनसीवी दस्तावेज बहुत खराब है। – bkausbk

+0

ठीक है, मैं पहले कुछ साफ़ करना होगा। हरे आयत जिन्हें आप "सही" के रूप में दिखाते हैं, वे वास्तव में कैसे सुधार किए जाते हैं? वे स्क्रीनशॉट में जो कुछ भी देख सकते हैं उसके साथ अच्छी तरह से फिट नहीं लग रहे हैं ... बीटीडब्लू, इस साइट पर ऐसी चीजों के बारे में बहुत सारे विवरण हैं http://www.vision.caltech.edu/bouguetj/calib_doc/ और इन यह पुस्तक "कंप्यूटर विजन में एकाधिक दृश्य ज्यामिति" http://www.robots.ox.ac.uk/~vgg/hzbook/, वे अच्छे संदर्भ हैं। किसी भी मामले में, मुझे बताएं कि आप उन हरे आयतों को "सही" के रूप में कैसे अर्हता प्राप्त करते हैं, धन्यवाद –

उत्तर

2

मार्कर, जैसा कि मैंने ProCamCalib के लिए उपयोग किया था, चेकरबोर्ड पैटर्न से अधिक मजबूत रूप से पता लगाया जाना चाहिए। आप ProCamCalib के साथ ARToolkitPlus का उपयोग कर सकते हैं, लेकिन अन्य विकल्प हैं, या आप अपना खुद का छोटा डिटेक्टर बना सकते हैं। :) फिर, मार्करों के ज्ञात कोने निर्देशांक के साथ, हम ओपनसीवी के शेष अंशांकन कार्यों का उपयोग करके उसी तरह कैलिब्रेट कर सकते हैं।

और मैं इसके साथ अच्छी चीजें भी कर सकता हूं, जैसा कि ProCamTracker के पृष्ठ पर दिखाया गया है।

संपादित करें: अब जब मैं प्रश्न को बेहतर समझता हूं, तो हम इसे स्थिर दृश्यों के लिए आसानी से पूरा कर सकते हैं, हालांकि ओपनसीवी हमें बहुत मदद नहीं करेगा। सबसे पहले, हम कैमरे को उस स्थिति में रखते हैं जहां से हम एक दर्शक को एक सही प्रक्षेपण देखना चाहते हैं। फिर, हम बाइनरी पैटर्न (जो स्थानीय रूप से चमकते बिंदुओं की तरह दिखते हैं) प्रोजेक्ट करते हैं, और उन बिंदुओं के पैटर्न की छवियों को कैप्चर करते हैं। (हम उन्हें बार-बार बना सकते हैं, जब तक कि वे बार बन जाते हैं, एक तकनीक जिसे संरचित प्रकाश के रूप में जाना जाता है।) कैमरे की छवियों से पता लगाने और उन बिंदुओं को द्विआधारी कोड में डिकोड करने के बाद, हमें कैमरा < -> प्रोजेक्टर पिक्सेल पत्राचार, अच्छी तरह से कुछ अंश वैसे भी, और वहां से यह 100% ग्राफिक्स है। यहाँ एक कागज है कि कुछ और जानकारी में इन चरणों को शामिल किया गया है:

Zollmann, एस, Langlotz, टी और Bimber, ओ
मनमानी सतहों पर देखें निर्भर अनुमान के लिए निष्क्रिय-एक्टिव ज्यामितीय कैलिब्रेशन
http://140.78.90.140/medien/ar/Pub/PAGC_final.pdf
डेमो वीडियो: http://140.78.90.140/medien/ar/Pub/PAGC.avi

EDIT2: किसी प्रकार का पैटर्न पेश करके, हम प्रोजेक्टर छवि में पिक्सेल निर्देशांक को समझ सकते हैं जो कैमरे की छवि में दिए गए पिक्सेल से मेल खाते हैं। हम अक्सर अस्थायी डॉट पैटर्न का उपयोग करते हैं क्योंकि यह पहचानना और डीकोड करना आसान है ... और वास्तव में, ओपनसीवी इसके लिए आसान हो सकता है। जिस तरह से मुझे लगता है कि मैं ऐसा करने की कोशिश करता हूं, ऐसा कुछ होगा। चलो सादगी के लिए केवल 2 बिट लेते हैं। इस प्रकार हमारे पास चार छवियां हैं: 00, 01, 10, और 11. चूंकि हम प्रोजेक्टर छवि को नियंत्रित करते हैं, हम उन्हें जानते हैं, लेकिन हमें उन्हें कैमरे की छवि में भी ढूंढना है। सबसे पहले मैं अंतिम (कैमरा) छवि लेता हूं, 11, और इसे पहले (कैमरा) छवि 00 से घटाता हूं, cvAbsDiff() का उपयोग करके, फिर परिणाम को cvThreshold() के साथ बिनरिज करें, और बाइनरी में समोच्च (या ब्लब्स) ढूंढें cvFindContours() के साथ छवि। हमें यह सुनिश्चित करना चाहिए कि प्रत्येक समोच्च के पास cvContourArea() के साथ एक उचित क्षेत्र है, जबकि हम इसके केंद्र को cvMoments() के साथ पा सकते हैं। फिर हम अन्य छवियों के साथ सामान करना शुरू कर सकते हैं। प्रत्येक समोच्च के लिए, मैं cvBoundingRect() को cvCountNonZero() में पिक्सल (सीवी थ्रेसहोल्ड() कैमरे के साथ बिनराइज्ड) को इन बाउंडिंग आयतों के अंदर ले जाने का प्रयास करता हूं, जिसे हम cvSetImageROI() के माध्यम से सेट कर सकते हैं।यदि nonzero गिनती बड़ी है, तो इसे 0 के रूप में पंजीकृत किया जाना चाहिए, यदि नहीं, 0.

एक बार आपके पास सभी बिट्स हो जाने के बाद, आपके पास कोड है, और आप कर चुके हैं।

+0

धन्यवाद, यह वही था जो मैं ढूंढ रहा था। मुझे समझ में नहीं आता कि डॉट पैटर्न का उपयोग क्यों करें और इससे विस्थापन मानचित्र कैसे बनाएं, लेकिन दस्तावेज़ का अध्ययन करने के बाद यह स्पष्ट होना चाहिए। – bkausbk

+0

आपको जो चाहिए वह लगता है, बढ़िया! मैं पूर्णता के लिए थोड़ा और विवरण जोड़ूंगा ... –