रास्पबेरी पाई रोबोट दृष्टि: गहराई का नक्शा
आज, "ड्रोन बिल्डिंग" की सभी तकनीक सक्रिय रूप से सस्ती हो रही है। एक को छोड़कर: आसपास के स्थान का नक्शा प्राप्त करना। दो चरम सीमाएं हैं: या तो महंगे लिडार (हजारों डॉलर) और गहराई के नक्शे (कई सैकड़ों डॉलर) के निर्माण के लिए ऑप्टिकल समाधान, या अल्ट्रासोनिक रेंजफाइंडर जैसे काफी पैसा समाधान।इसलिए, एक उपाय करने के लिए एक कैमरा के साथ एक सस्ती रास्पबेरी पाई के आधार पर एक विचार उत्पन्न हुआ जो एक खाली जगह में होगा और आपको "सस्ती के लिए" एक गहरा नक्शा प्राप्त करने की अनुमति देगा। और इसे एक सरल प्रोग्रामिंग भाषा में करने के लिए जैसे पायथन, ताकि यह शुरुआती लोगों के लिए प्रयोग करने के लिए उपलब्ध हो। दरअसल, मैं अपने परिणामों के बारे में बताना चाहता था। नमूना तस्वीरों के साथ परिणामी स्क्रिप्ट को डेस्कटॉप पर भी चलाया जा सकता है।एक कैमरे से मानचित्र की गहराई।
सबसे पहले, ऑप्टिकल भाग के बारे में कुछ शब्द। गहराई का नक्शा बनाने के लिए, दो चित्रों का उपयोग हमेशा किया जाता है - बाएं और दाएं कैमरों से। और हमारे पास एक कैमरे के साथ रसभरी है। इसलिए, एक ऑप्टिकल फाड़नेवाला विकसित किया गया था, जिसके परिणामस्वरूप कैमरा को एक स्टीरियो जोड़ी मिलती है।सरल शब्दों में - अगर आप फोटो को देखते हैं, तो ब्लैक बॉक्स से कैमरे की दो आंखें आपको देखती हैं। लेकिन वास्तव में कैमरा एक है। बस थोड़ा सा जादुई जादू।
फोटो डिवाइस के बारहवें पुनरावृत्ति को दर्शाता है। एक विश्वसनीय स्थिर डिजाइन प्राप्त करने में लंबा समय लगा, जो एक ही समय में सस्ता होगा। सबसे कठिन हिस्सा आंतरिक दर्पण है, जो एल्यूमीनियम के वैक्यूम जमाव द्वारा ऑर्डर करने के लिए बनाए गए थे। यदि आप मानक दर्पण का उपयोग करते हैं, जिसमें ग्लास के नीचे परावर्तक परत स्थित है, और इसके ऊपर नहीं है, तो जंक्शन पर वे एक अंतराल बनाते हैं जो पूरी तस्वीर को मौलिक रूप से खराब कर देता है।हम किस पर काम करेंगे
रास्पियन व्हीजे की रास्पबेरी छवि को आधार के रूप में लिया गया था, पायथन 2.7 और ओपनसीवी 2.4 स्थापित किए गए थे, अच्छी तरह से, छोटी चीज़ों के लिए आवश्यक पैकेज - मेटप्लोटिब, सुपी और अन्य। सभी प्रकार और कार्ड की तैयार छवि का लिंक लेख के अंत में दिया गया है। पाठ के रूप में लिपियों का विवरण परियोजना की वेबसाइट पर पाया जा सकता हैगहराई का नक्शा बनाने के लिए चित्र तैयार करना
चूंकि हमारा समाधान धातु से बना नहीं है और अल्ट्रा-सटीक प्रकाशिकी के बिना, विधानसभा के परिणामस्वरूप आदर्श ज्यामिति से छोटे विचलन संभव हैं। इसके अलावा, कैमरा स्क्रू के साथ डिवाइस से जुड़ा हुआ है, इसलिए इसकी स्थिति आदर्श नहीं हो सकती है। कैमरे के स्थान के साथ समस्या मैन्युअल रूप से हल हो गई है, और संरचना की विधानसभा के "वक्रता" के लिए क्षतिपूर्ति सॉफ्टवेयर में की जाएगी।स्क्रिप्ट एक - कैमरा संरेखण
चित्र में दर्पणों का जंक्शन आदर्श रूप से ऊर्ध्वाधर और केंद्रित होना चाहिए। इसे आँख से करना कठिन है, इसलिए पहली स्क्रिप्ट बनाई गई थी। यह सिर्फ लाइव पूर्वावलोकन मोड में कैमरे से चित्र कैप्चर करता है, इसे स्क्रीन पर प्रदर्शित करता है, और केंद्र में ओवरले में एक सफेद पट्टी होती है जिसके साथ संरेखण हो रहा है। कैमरा सही ढंग से उन्मुख होने के बाद, हम शिकंजा को कड़ा कर देते हैं और विधानसभा पूरी हो जाती है।पहली लिपि के कोड में क्या दिलचस्प है- –
- – , cv.imshow() , . , . , , .
- – , .. . «» , camera.hflip = True
दूसरी स्क्रिप्ट - हमें एक "क्लीन" स्टीरियो जोड़ी मिलती है
हमारे बाएं और दाएं चित्र छवि के केंद्र में शामिल हैं। तस्वीर में संयुक्त में एक गैर-चौड़ाई है - आप केवल डिवाइस से दर्पण को हटाकर इससे छुटकारा पा सकते हैं, जिससे संरचना का आकार बढ़ जाता है। रास्पबेरी के कैमरे में अनंतता पर ध्यान केंद्रित किया गया है, और निकट स्थित वस्तुओं (हमारे मामले में, यह एक जंक्शन है) बस "धुंधला" है। इसलिए, आपको बस स्क्रिप्ट को बताने की जरूरत है, जो हमारी राय में एक "खराब" ज़ोन है, ताकि तस्वीरों में स्टीरियो जोड़ी साफ हो जाए। एक दूसरी स्क्रिप्ट बनाई गई थी जो एक चित्र प्रदर्शित करती है और आपको ज़ोन को काटने के लिए इंगित करने के लिए कुंजियों का उपयोग करने की अनुमति देती है।यहाँ प्रक्रिया क्या दिखती है:दूसरी लिपि के कोड में क्या दिलचस्प है- , , cv2.rectangle(). , , . , , Enter .
- , . , .
- JSON. , , .
- . , , , . , ./src . . pf_1280_720.txt – , .
- , . . :
loadImagePath = ""
तीसरी स्क्रिप्ट - अंशांकन के लिए तस्वीरों की एक श्रृंखला
बुनियादी विज्ञान कहता है कि गहराई से मानचित्र बनाने में सफलतापूर्वक, स्टीरियो जोड़ी को कैलिब्रेट किया जाना चाहिए। अर्थात्, बाईं तस्वीर के सभी प्रमुख बिंदु समान ऊंचाई पर और दाईं तस्वीर में होने चाहिए। इस स्थिति में, स्टीरियोएमबी फ़ंक्शन, जो हमारा एकमात्र वास्तविक समय है, सफलतापूर्वक अपना काम कर सकता है।अंशांकन के लिए, हमें एक संदर्भ चित्र प्रिंट करने, फ़ोटो की एक श्रृंखला बनाने और अंशांकन एल्गोरिथ्म को देने की आवश्यकता है, जो सभी विकृतियों की गणना करेगा और चित्रों को सामान्य में वापस लाने के लिए मापदंडों को बचाएगा।तो, " शतरंज की बिसात " को प्रिंट करें और एक सख्त सपाट सतह पर इसे गोंद दें। सादगी के लिए, सीरियल फोटो को एक उलटी गिनती टाइमर के साथ एक स्क्रिप्ट बनाया गया था, जो वीडियो के शीर्ष पर प्रदर्शित होता है।यहाँ सीरियल फोटोग्राफी की पटकथा काम की तरह दिखती है:3 स्क्रिप्ट कोड में क्या दिलचस्प है- . , . , , «» . , – , . camera.capture () , use_video_port=True.
- – camera.annotate_text() . 5 – .
- -, , ./src
यह ध्यान दिया जाना चाहिए कि बनाई गई श्रृंखला की "शुद्धता" अंशांकन परिणामों के लिए महत्वपूर्ण है। थोड़ी देर बाद हम उस परिणाम को देखेंगे जो गलत तरीके से ली गई तस्वीरों के साथ प्राप्त किया गया है।स्क्रिप्ट 4 - स्टीरियो जोड़ियों पर फ़ोटो काटना
फ़ोटो की एक श्रृंखला लेने के बाद, हम एक और सेवा स्क्रिप्ट बनाएंगे जो ली गई तस्वीरों की पूरी श्रृंखला लेती है और इसे चित्रों के जोड़े में काट देती है - बाएँ और दाएँ, और जोड़े को फ़ोल्डर में सहेजती है। चित्र के केंद्र में क्षेत्र। स्क्रिप्ट काफी सामान्य है, इसलिए मैंने एक स्पॉइलर के नीचे वीडियो छिपाया।काम का एक उदाहरण और 4 वीं स्क्रिप्ट के स्रोतों का लिंक सबसे दिलचस्प बात अंशांकन, पांचवीं लिपि है
अंशांकन स्क्रिप्ट। स्टीरियो फ़ोल्डर से कैलिब्रेशन फ़ंक्शन तक सभी स्टीरियो जोड़े को खिलाती है और विचार में डूब जाती है। अपने कठिन काम के बाद (पहले रास्पबेरी पर 15 चित्रों के लिए 1280x720 के बारे में 5 मिनट लगते हैं), वह अंतिम स्टीरियो जोड़ी लेता है, "चित्रों को सही करता है" (ठीक करता है) और पहले से ही सुधरे हुए संस्करणों को दिखाता है जिसके द्वारा आप एक गहराई का नक्शा बना सकते हैं।यहाँ स्क्रिप्ट काम में कैसी दिखती है:5 वीं लिपि के कोड में क्या दिलचस्प है "कुछ गड़बड़ हो गई।"
ऐसे समय होते हैं जब अंशांकन परिणाम अप्रत्याशित होते हैं।यहाँ हड़ताली उदाहरण के एक जोड़े हैं:
वास्तव में, अंशांकन एक परिभाषित क्षण है। गहराई के नक्शे के निर्माण के चरण में हमें जो मिलता है, वह सीधे उसकी गुणवत्ता पर निर्भर करता है। बड़ी संख्या में प्रयोगों के बाद, शूटिंग आवश्यकताओं की निम्न सूची की पुष्टि की गई:- शतरंज का चित्र फोटो के समतल के समानांतर नहीं होना चाहिए - हमेशा विभिन्न कोणों पर। लेकिन कट्टरता के बिना भी - यदि आप तस्वीर के विमान के लिए लगभग लंबवत बोर्ड रखते हैं, तो स्क्रिप्ट को बस चित्र में शतरंज नहीं मिलेगा।
- हल्की, अच्छी रोशनी। कम कमरे की रोशनी में, और यहां तक कि जब वीडियो से तस्वीरें खींचते हैं, तो तस्वीर की गुणवत्ता कम हो जाती है। मेरे मामले में, 90% मामलों में प्रकाश ने स्थिति को तुरंत ठीक कर दिया।
- इंटरनेट लिखता है कि बोर्ड को जब भी संभव हो छवि में अधिकतम स्थान पर कब्जा करना चाहिए। वास्तव में मदद करता है।
यहाँ एक "निश्चित" स्टीरियो जोड़ी अच्छे अंशांकन परिणामों के साथ कैसा दिखता है:
स्क्रिप्ट 6 - गहराई का नक्शा बनाने का पहला प्रयास
जैसे सब कुछ तैयार है - आप पहले से ही एक गहरा नक्शा बना सकते हैं।हम अंशांकन परिणामों को लोड करते हैं, फोटो लेते हैं और साहसपूर्वक cv2.StereoBM का उपयोग करते हुए गहराई का नक्शा बनाते हैं। हमें कुछ इस तरह मिलता है:
परिणाम बहुत प्रभावशाली नहीं है, जाहिर है हमें कुछ कसने की आवश्यकता है। खैर, चलिए अगली, 7 वीं लिपि में और अधिक बारीकियों पर चलते हैं। वहाँ हम निर्माण के लिए 10 मापदंडों का उपयोग नहीं करेंगे, जैसा कि स्टीरियो () में है, लेकिन लगभग 10, जो कि अधिक दिलचस्प है।यहां 6 वीं लिपि के स्रोत दिए गए हैंस्क्रिप्ट 7 - उन्नत सेटिंग्स के साथ गहराई का नक्शा
जब पैरामीटर 2 नहीं बल्कि 10 हैं, तो स्क्रिप्ट के लगातार पुनरारंभ के साथ उनके विकल्पों के माध्यम से छंटनी गलत है। इसलिए, गहराई के नक्शे के सुविधाजनक इंटरएक्टिव ट्यूनिंग के लिए एक स्क्रिप्ट बनाई गई थी। कार्य इंटरफ़ेस के साथ कोड को जटिल नहीं करना था, इसलिए सब कुछ matplotlib पर किया गया था। रास्पबेरी पर matplotlib में इंटरफ़ेस का ड्राइंग काफी धीमा है, इसलिए मैं आमतौर पर काम करने वाले फ़ोल्डर को रास्पबेरी से लैपटॉप में स्थानांतरित करता हूं और वहां मापदंडों का चयन करता हूं। यहां बताया गया है कि स्क्रिप्ट कैसे काम करती है:आपके द्वारा मापदंडों का चयन करने के बाद, Save बटन द्वारा स्क्रिप्ट परिणाम JSON प्रारूप में 3dmap_set.txt फ़ाइल को बचाता है।7 वीं लिपि के कोड में क्या दिलचस्प है- 7-
- . , - , .
- , . , numOfDisparities 16, . update(val), . numOfDisparities 65.57 64. , .
- matplotlib , .
गहराई के नक्शे के साथ व्यावहारिक काम से पता चला है कि, सबसे पहले, आपको minDisparity पैरामीटर का चयन करने की आवश्यकता है, और इसके साथ numOfDisparities के संयोजन में। खैर, याद रखें कि numOfDisparities चरण 16 के साथ वास्तव में विवेकपूर्ण रूप से बदलती है।इस जोड़ी को स्थापित करने के बाद, आप अन्य मापदंडों के साथ खेल सकते हैं।कार्ड सेटिंग्स की विशेषताएं पहले से ही उपयोगकर्ता के स्वाद की बात हैं, और कार्य के हल होने पर निर्भर करता है। आप नक्शे को बड़ी संख्या में छोटे भागों में ला सकते हैं या बढ़े हुए क्षेत्रों को प्रदर्शित कर सकते हैं। रोबोट द्वारा बाधाओं के एक सरल बचाव के लिए, दूसरा अधिक उपयुक्त है। एक बिंदु बादल के लिए, पहले, लेकिन प्रदर्शन के मुद्दे यहां आते हैं (हम उनके पास वापस आएंगे)।हम क्या देखना चाहते हैं?
खैर, शायद सबसे महत्वपूर्ण बिंदुओं में से एक हमारे डिवाइस के "दूरदर्शिता" का समायोजन है। गहराई का नक्शा स्थापित करते समय, मैं आमतौर पर एक वस्तु को लगभग 30 सेमी की दूरी पर रखता हूं, एक मीटर में दूसरा, और बाकी मीटर पर। और 7 वीं लिपि में पहले दो मापदंडों (minDisparity और numOfDisparities) की स्थापना करते समय, मैं निम्नलिखित का अनुसरण कर रहा हूं:- निकटतम वस्तु (30 सेमी) - लाल
- आधा मीटर में वस्तु - पीला या हरा
- 2-3 मीटर की वस्तुएं - हरा या हल्का नीला
नतीजतन, हमें 5-10 मीटर के दायरे में बाधाओं के "पास" क्षेत्र को पहचानने के लिए एक सिस्टम कॉन्फ़िगर किया गया है।मक्खी पर वीडियो के साथ काम करना - स्क्रिप्ट 8 वीं, अंतिम
खैर, अब हमारे पास एक तैयार अनुकूलित प्रणाली है, और हमें एक व्यावहारिक परिणाम प्राप्त करना होगा। हम अपने कैमरे से वीडियो का उपयोग करके वास्तविक समय में एक गहरा मानचित्र बनाने की कोशिश कर रहे हैं, और इसे अपडेट करते समय वास्तविक समय में दिखाते हैं।8 वीं लिपि के कोड में क्या दिलचस्प है गति की दौड़ में
तो, पहला माप सिंगल-कोर प्रोसेसर के साथ पहले रास्पबेरी पर किया गया था।- 4 सेकंड - 1280x720 की छवि पर एक नक्शा बनाना यह बहुत कुछ है।- 2.5 सेकंड - रास्पबेरी पाई 2 पर, पहले से बेहतर।विश्लेषण से पता चला कि इस मामले में, दूसरे रास्पबेरी पर केवल एक कोर का उपयोग किया जाता है। विकार! मैंने TBC के समानांतर लाइब्रेरी का उपयोग करके OpenCV का पुनर्निर्माण किया।- 1.5 सेकंड - मल्टी-कोर का उपयोग करके दूसरे रास्पबेरी पर लॉन्च। वास्तव में, यह पता चला कि केवल 2 कोर का उपयोग किया जाता है - यह अभी भी साथ छेड़छाड़ करना है। यह पता चला कि न केवल मैं इस समस्या को लेकर आया था , इसलिए अभी भी चलना बाकी है।एल्गोरिथ्म को देखते हुए, ऑपरेशन की गति को संसाधित डेटा के आकार पर रैखिक रूप से निर्भर करना चाहिए। इसलिए, यदि आप संकल्प को 2 गुना कम करते हैं, तो सैद्धांतिक रूप से सब कुछ 4 गुना तेजी से काम करना चाहिए।- 0.3 सेकंड , या लगभग 3-4 एफपीएस - 640x360 के आधे-कम संकल्प के साथ। सिद्धांत की पुष्टि की गई थी।आगे की योजना
सबसे पहले, मैं दूसरी रास्पबेरी की बहुस्तरीय से सबसे अधिक प्राप्त करना चाहता था। मैं StereoBM फ़ंक्शन के स्रोतों पर करीब से नज़र डालूँगा और समझने की कोशिश करूँगा कि काम पूरे रास्ते क्यों नहीं हो रहा है।अगला चरण बहुत अधिक रोमांच का वादा करता है - यह गणनाओं को गति देने के लिए रसभरी जीपीयू का उपयोग है।यहां तीन संभावित रास्ते बनाए गए हैं:यदि आपको रास्पबेरी ओपनसीवी के लिए टीबीबी के साथ काम करने का अनुभव था, या आप रास्पबेरी जीपीयू के लिए कोडिंग के साथ काम कर रहे थे, तो मैं अतिरिक्त संकेतों के लिए आभारी रहूंगा । मैं एक सरल कारण के लिए काफी कुछ तैयार किए गए विकास को खोजने में कामयाब रहा - दो कैमरों के साथ रास्पबेरी एक दुर्लभ घटना है। यदि आप USB के माध्यम से दो वेबकैम को हुक करते हैं, तो बड़े ब्रेक आते हैं, और केवल रास्पबेरी पाई कंप्यूट दो देशी कैमरों के साथ काम कर सकते हैं, जिसमें लेस और एडेप्टर के साथ एक हेवी देवबोर्ड की भी आवश्यकता होती है।उपयोगी लिंक:
वर्किंग स्क्रिप्ट:रास्पबेरी पर OpenCV और पायथन की स्थापना:स्टीरियो लाइब्रेरी:GPU का कामखैर, हब्र पर एक दिलचस्प लेख " छवियों को पहचानने के लिए, आपको छवियों को पहचानने की आवश्यकता नहीं है "Source: https://habr.com/ru/post/hi388259/
All Articles