विषयसूची:

डिजिटल ३डी मैपिंग के लिए बेसिक ३डी स्कैनर: ५ कदम
डिजिटल ३डी मैपिंग के लिए बेसिक ३डी स्कैनर: ५ कदम

वीडियो: डिजिटल ३डी मैपिंग के लिए बेसिक ३डी स्कैनर: ५ कदम

वीडियो: डिजिटल ३डी मैपिंग के लिए बेसिक ३डी स्कैनर: ५ कदम
वीडियो: Duplicate Fingerprint बनाना सिखे घर पर|| How to make Fingerprint#shorts 2024, सितंबर
Anonim
डिजिटल 3डी मैपिंग के लिए बेसिक 3डी स्कैनर
डिजिटल 3डी मैपिंग के लिए बेसिक 3डी स्कैनर

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

अंतिम विचार किसी स्थान या क्षेत्र का 3D स्कैन प्राप्त करना है, या तो इसका बाहरी या आंतरिक भाग, इसे डिजिटल मानचित्र के रूप में उपयोग करने के लिए (जैसा कि प्रोमेटियस की फिल्म में है)

चरण 1:

छवि
छवि

किसी भी क्षेत्र के आभासी मानचित्र को डिजिटाइज करने के लिए रिमोट-नियंत्रित विमान पर संपूर्ण 3डी स्कैनिंग सिस्टम स्थापित करने का विचार है, लेकिन इसके लिए हमने लेजर त्रिभुज विधि के संचालन की शुरुआत से शुरुआत की है। लेजर त्रिभुज द्वारा स्कैनिंग या 3 डी पुनर्निर्माण में मूल रूप से एक प्रिज्म के माध्यम से एक लेजर बीम को पारित करना होता है जो एक संपूर्ण लेजर पट्टी प्राप्त करने के लिए एक लेजर पट्टी उत्पन्न करता है जिसे स्कैन की जाने वाली वस्तु पर प्रक्षेपित किया जाएगा, और एक बार यह लेजर प्रक्षेपण प्राप्त हो जाने के बाद सतह की सतह स्कैन करने के स्थान से, छवि को किसी प्रकार के कैमरे के साथ कैप्चर किया जाना चाहिए और अधिमानतः उस कोण को जानना चाहिए जो उत्सर्जित लेजर पट्टी के प्रक्षेपण कोण के संबंध में बनता है, क्योंकि इनमें से प्रत्येक छवि अनुमानित लेजर स्ट्रिप्स को कैप्चर करती है। ऑब्जेक्ट की सतह पर, उन्हें स्कैन किए जाने वाले ऑब्जेक्ट की आयामी विशेषताओं को निकालने के लिए प्रीप्रोसेस किया जाएगा, और ऑब्जेक्ट के उस अनुप्रस्थ खंड में इसकी सतह की प्रोफ़ाइल प्राप्त करने के लिए ऑब्जेक्ट के ऊपर स्ट्रिप द्वारा स्ट्रिप को स्कैन करें, और बाद में कैप्चर करें ऑब्जेक्ट के निम्नलिखित क्रॉस सेक्शन की अनुमानित पट्टी, सभी अनुमानित धारियों को एक साथ जोड़ने के लिए ओब्टो के सभी क्रॉस सेक्शन से पहले हम इसकी सतह का त्रि-आयामी स्कैन प्राप्त करते हैं

चरण 2:

छवि
छवि

चूंकि हमने अपने उद्देश्य की पहचान कर ली है, अगला कदम यह जानते हुए कि टेक ऑफ करने के लिए आपको पहले अपने पैरों को जमीन पर मजबूती से रखना होगा, इसलिए हमने जमीन पर एक रैखिक 3डी स्कैनर के प्रायोगिक प्रोटोटाइप के साथ शुरुआत की, ताकि बुनियादी के सही संचालन को मान्य किया जा सके। 3 डी स्कैनरऔर जैसा कि आप ऊपर की छवि में देख सकते हैं, मैंने एक पीसी, ओपनसीवी, ओपनजीएल का ग्लूट, एक वेब कैमरा, एक लेजर, लेजर फार्म जनरेटर (इस मामले में एक घूर्णी दर्पण के माध्यम से) एक इलेक्ट्रॉनिक रैखिक विस्थापन प्रणाली (एक रेल के साथ बनाया गया) का उपयोग किया और एक पुराने प्रिंटर से निकाला गया सिस्टम) जिस आधार पर मैं स्कैन की जाने वाली वस्तुओं को रखता हूं, लकड़ी और प्लास्टिसिन और जैसा कि आप फोटो में देख सकते हैं, कंप्यूटर पर: मैं ओपनजीएल से ग्लूट के साथ तीन उत्पन्न करने और प्रदर्शित करने में कामयाब रहा- स्कैन की गई वास्तविक वस्तु के आधार पर पुन: प्रस्तुत आयामी मॉडल (इस मामले में एक खिलौना मकड़ी)

इसलिए यह स्पष्ट है कि ऑपरेटिंग सिद्धांत कार्यात्मक है, और यह कि अपने संबंधित समायोजन और एक उड़ान प्रणाली के अनुकूलन के साथ यह उस क्षेत्र के 3 डी मानचित्र को स्कैन और पुन: पेश करने में सक्षम होगा जिसमें वह उड़ता है।

लेकिन यह प्रणाली केवल उन स्थानों की बाहरी सतह के 3D मानचित्र प्राप्त करने का काम करेगी, जिन पर वह उड़ता है ???…

चरण 3:

छवि
छवि

गुफाओं और नलिकाओं के इंटीरियर का मानचित्रण (बिल्कुल प्रोमेटियस मूवी की तरह) यह 3डी स्कैनिंग सिस्टम गुफाओं, इमारतों, सुरंगों आदि जैसी बड़ी और खोखली वस्तुओं के इंटीरियर के त्रि-आयामी मॉडल को फिर से बनाने का काम करता है। इसका संचालन सिद्धांत है बिल्कुल वैसा ही जैसा कि पहले ही वर्णित है और जिसमें मूल रूप से निम्नलिखित शामिल हैं:

  1. स्कैन की जाने वाली सतह पर लेजर पट्टी के प्रत्येक प्रक्षेपण की तस्वीर कैप्चर करें
  2. छवि से रंग फ़िल्टर करें और निकालें
  3. डायनेमिक इमेज थ्रेशोल्ड के साथ रंग को बिनाराइज़ करें
  4. प्रत्येक लेजर प्रोजेक्शन क्रॉस सेक्शन के कैप्चर किए गए प्रोफाइल को पहचानने के लिए एज डिटेक्टर लागू करें
  5. और सेगमेंटेशन का उपयोग करके उस वस्तु के उस क्रॉस सेक्शन के 3 डी प्रतिनिधित्व के लिए उपयुक्त सीमा का चयन करें जिसे स्कैन किया जाना है और वर्चुअल 3 डी मानचित्र पर पुनर्निर्माण किया जाना है।
  6. फिर इन चरणों को उप-अनुभाग में प्रत्येक उप-अनुभाग द्वारा लगातार प्रक्षेपित लेजर पट्टियों के उप-तरीके में ली गई प्रत्येक तस्वीर के लिए दोहराया जाता है।
  7. क्रॉस सेक्शन के प्रतिनिधित्व की परत दर परत क्रमिक रूप से तब तक जोड़ी जाती है जब तक कि मैप किए जाने वाले ऑब्जेक्ट के क्रॉस सेक्शन के कई अभ्यावेदन द्वारा गठित एक बिंदु क्लाउड प्राप्त नहीं हो जाता है।

चरण 4:

छवि
छवि

फिर मैं सतही लेजर स्ट्रिप्स के अनुमानों की छवि प्रसंस्करण के लिए कार्यक्रम पास करता हूं। और विस्तृत त्रि-आयामी मानचित्र मॉडल में इन सहायक अनुप्रस्थ निरूपणों का आभासी 3डी पुनर्निर्माण:

मूर्ति प्रोद्योगिकी:

एन

#शामिल करें #शामिल करें "cv.h" #शामिल करें "highgui.h" #शामिल करें

चार एफ = 0; चार नाम = {"0.jpg"}; इंट एन = 0, एस, एक्स, वाई; CvScalar सपा; फ़ाइल *नुपु;

शून्य राइटपॉइंट्स () {चार बफ़रएक्स [३३], बफ़री [३३]; इटोआ (एक्स, बफरएक्स, 10); itoa (y, बफ़री, 10); fprintf (NuPu, बफ़रएक्स); fprintf (NuPu, "\ t"); fprintf (NuPu, बफ़री); fprintf (NuPu, "\ n"); }

शून्य नोटब्लॉकइनिट () { NuPu = fopen ("NuPu.txt", "w"); fseek (NuPu, 0, 0); fprintf (NuPu, "एनपी:"); fprintf (NuPu, "\ n"); }

इंट मेन () {चार आर्गस्ट्र [128]; नोटब्लॉकइनिट (); cout<<"टेकली!…:"f; नाम [0] = एफ; कोउट<

IplImage* img0=cvLoadImage("00.jpg", 0); if(f=='0') { के लिए (y=1;yheight-2;y++) { for(x=1;xwidth-2;x++) {sp=cvGet2D(img0, y, x); if(sp.val[0]>50){लिखने के बिंदु ();n++;} }}} और { for(y=1;yheight-2;y++) { for(x=1;xwidth-2;x++) { एसपी = सीवीगेट 2 डी (आईएमजी 1, वाई, एक्स); if(sp.val[0]>50){लिखने के बिंदु ();n++;}}}} चार बफर[33]; इटोआ (एन, बफर, 10); fprintf (NuPu, "फिन:"); fprintf (NuPu, बफर); fprintf (NuPu, "\ n"); एफक्लोज (नुपु);

सीवीवेटकी (0); //_execlp ("calc.exe", "calc.exe", argstr, NULL); cvDestroyAllWindows (); cvReleaseImage (और छवि); cvReleaseImage(&img); cvReleaseImage(&img0); cvReleaseImage(&img1); cvReleaseImage(&img2); वापसी 0; }

3डी पुनर्निर्माण:

#शामिल करें ////////////////// #ifdef _APPLE_ #शामिल करें

# परिभाषित करें वायलेटा ग्लोकलर३एफ(१, ०, १), 1, 0) # परिभाषित करें naranja glColor3f(1,.3, 0) # rojo glColor3f(1, 0, 0) को नेमस्पेस एसटीडी का उपयोग करके परिभाषित करें; int s, Boton=1, Pulbut=1; फ्लोट mx=0, my=0, mtx=0, mty=0, mtz=-5.0; कॉन्स्ट इंट एवांस = 1; स्ट्रिंग लाइन, औक्स; चार कैरेक्टर = 'एच'; फ़ाइल *नुपु; इंट एनपी, एच, डब्ल्यू; फ्लोट G=0, n=0, cx[5000], cy[5000], x, y, ax, ay, az; इंट फॉन्ट = (इंट) GLUT_BITMAP_8_BY_13; स्थिर चार लेबल [१००]; चार बफर [3]; GLfloat anguloCuboX = 0.0f; GLfloat anguloCuboY = 0.0f; GLfloat anguloEsfera = 0.0f; GLint ancho=500; ग्लिंट ऑल्टो = 500; int hazPerspectiva = 0; शून्य पुनर्विक्रय (इंट चौड़ाई, इंट ऊंचाई) {glViewport (0, 0, चौड़ाई, ऊंचाई); ग्लमैट्रिक्समोड (GL_PROJECTION); ग्ललोड इडेंटिटी (); if(hazPerspectiva) gluPerspective(23.0f, (GLfloat)width/(GLfloat)ऊंचाई, 1.0f, 20.0f); और ग्लोथो (-1, 1, -1, 1, -10, 10); ग्लमैट्रिक्समोड (GL_MODELVIEW); एको = चौड़ाई; ऑल्टो = ऊंचाई; } शून्य कोलोरियर (इंट के) {फ्लोट हिप; एक्स = (सीएक्स [एस] -320) / 480; y=(cy[s]-240)/640; हिप = वर्ग (पाउ (एक्स, 2) + पाउ (वाई, 2)); अगर((हिप>=0)&&(हिप=.07)&&(हिप=.14)&&(हिप=.21)&&(हिप=.28)&&(हिप=.35)&&(हिप=.४२) &&(हिप<=.49)){वायलेटा;}} शून्य ड्रा नुपु (शून्य) {glColor3f(1, 1, 1); ग्लबीगिन (GL_LINES); glVertex3f(.2, 0, 0); glVertex3f (-.2, 0, 0); glVertex3f(0,.2, 0); glVertex3f(0, -.2, 0); ग्लेंड (); रोजो; ग्लबीगिन (GL_POINTS); for(n=0;n<10;n++) { for(s=0;s void setOrthographicProjection() {glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); gluOrtho2D(0, w, 0, h); glScalef (1, -1, 1); glTranslatef (0, -h, 0); glMatrixMode (GL_MODELVIEW); } शून्य रेंडर बिटमैपस्ट्रिंग (फ्लोट एक्स, फ्लोट वाई, शून्य * फ़ॉन्ट, चार * स्ट्रिंग) {चार * सी; glRasterPos2f (x, y); के लिए (c=string; *c!= '\0'; c++) {glutBitmapCharacter(font, *c); }} शून्य प्रदर्शन() {//mx=468; itoa (mx, बफर, 10); glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // glLoadIdentity (); glColor3f (1.0, 1.0, 1.0); glRasterPos2f (-1,.9); // glutBitmapString (GLUT_BITMAP_TIMES_ROMAN_24, "हैलो टेक्स्ट"); के लिए (नमस्ते पाठ");;s<3;s++) { glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24, बफ़र[s]); } glTranslatef(mty, -mtx, mtz); glRotatef(mx, 1.0f, 0.0f, 0.0f); glRotatef(my, 0.0f, 1.0f, 0.0f); drawNuPu (); /*glColor3f(1.0, 1.0, 1.0); glRasterPos2f(.5,.5); //glutBitmapString(GLUT_BITMAP_TIMES_ROMAN_24, "Hello Text"); glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24, '7');*/ /*glColor3f(1. 0 एफ, 1.0 एफ, 1.0 एफ); सेटऑर्थोग्राफिकप्रोजेक्शन (); ग्लपशमैट्रिक्स (); ग्ललोड इडेंटिटी (); रेंडरबिटमैपस्ट्रिंग (३०, १५, (शून्य *) फ़ॉन्ट, "ग्लूट ट्यूटोरियल ---_------_@3डी टेक");*/ glFlush(); ग्लूटस्वैपबफर (); anguloCuboX+=0.1f; anguloCuboY+=0.1f; एंगुलोएस्फेरा+=0.2f; } शून्य init () {glClearColor (0, 0, 0, 0); glEnable (GL_DEPTH_TEST); एको = 500; ऑल्टो = 500; } void leer() { ifstream myfile("A:/Respaldo sept 2016/D/Respaldos/Respaldo Compu CICATA abril 2015/usb1/rekostrucion 3D en Especialidad CICATA/Software/Reconstrucion 3D/R3d_0\bin/Debug/NuPu.txt"); अगर (myfile.is_open ()) { एस = 0; जबकि (गेटलाइन (माईफाइल, लाइन)) {अगर ((लाइन [0]! = 'एन') && (लाइन [0]! = 'एफ')) { औक्स = लाइन; लाइन [0] = 48; लाइन [1] = ४८; रेखा [2] = ४८; लाइन [३] = ४८; साइ [एस] = एटोई (लाइन.c_str ()); औक्स [4] = 48; औक्स[5]=48; औक्स[6]=48; // औक्स [7] = ४८; सीएक्स [एस] = एटोई (औक्स.c_str ()); एस++; } } myfile.close (); } और कोउट <1780)एनपी = 1700; cout <शून्य निष्क्रिय () {प्रदर्शन (); } शून्य कीबोर्ड (अहस्ताक्षरित चार कुंजी, int x, int y) {स्विच (कुंजी) {केस 'पी': केस 'पी': hazPerspectiva = 1; फिर से आकार देना (एंको, ऑल्टो); टूटना; केस 'ओ': केस 'ओ': hazPerspectiva=0; फिर से आकार देना (एंको, ऑल्टो); टूटना; केस 27: // एस्केप एक्जिट (0); टूटना; } } शून्य रैटन (इंट बटन, इंट स्टेट, इंट एक्स, इंट वाई) {/* GLUT_LEFT_BUTTON 0 GLUT_MIDDLE_BUTTON 1 GLUT_RIGHT_BUTTON 2 GLUT_DOWN 0 GLUT_UP 1 */ Boton=button; पुलबट = राज्य; // एमएक्स = वाई; प्रदर्शन (); } शून्य रैटमोव (इंट एक्स, इंट वाई) { अगर ((बोटन == 0) और (पुलबट == 0)) { एमएक्स = वाई; मेरा = एक्स; } if((Boton==2)&(Pulbut==0)) {mtx=(y/200)-1; एमटीआई = (एक्स / 200) -1; } if((Boton==1)&(Pulbut==0)) {mtz=-(y/40)-5; } प्रदर्शन (); } int main(int argc, char **argv) {/*glutAddMenuEntry() glutAddSubMenu() glutAttachMenu() glutCreateMenu() glutSetMenu() glutStrokeCharacter() glutStrokeLength()*//*glReadPixels() से पिक्सल का एक ब्लॉक पढ़ें फ्रेम बफर glGetPixelMapfv() निर्दिष्ट पिक्सेल मानचित्र लौटाता है glGetPixelMapuiv() निर्दिष्ट पिक्सेल मानचित्र लौटाता है glGetPointerv() निर्दिष्ट सूचक का पता देता है।*/ Init(); लीयर (); ग्लूटइनिट (& argc, argv); glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); glutInitWindowPosition (५०, ५०); glutInitWindowSize (एंको, ऑल्टो); glutCreateWindow ("क्यूबो 1"); इस में(); glutDisplayFunc (प्रदर्शन); glutReshapeFunc (फिर से आकार देना); glutIdleFunc (निष्क्रिय); ग्लूटमाउसफंक (रैटन); ग्लूटमोशनफंक (रतमोव); glutKeyboardFunc (कीबोर्ड); ग्लूटमेनलूप (); वापसी 0; }

चरण 5:

छवि
छवि

फिलहाल मुझे रुकना है! लेकिन अगले अध्याय में मैं आपसे वादा करता हूं कि मैं इसे अपने रास्पबेरी पाई 3 या अपने जेटसन नैनोबार्ड पर लागू करूंगा, जो पहले से ही कुछ रिमोट-नियंत्रित विमानों पर या किसी मकड़ी रोबोट पर गुफाओं के इंटीरियर को स्कैन करने के लिए लगाया गया है।

सिफारिश की: