Სარჩევი:

ძირითადი 3D სკანერი ციფრული 3D რუქისთვის: 5 ნაბიჯი
ძირითადი 3D სკანერი ციფრული 3D რუქისთვის: 5 ნაბიჯი

ვიდეო: ძირითადი 3D სკანერი ციფრული 3D რუქისთვის: 5 ნაბიჯი

ვიდეო: ძირითადი 3D სკანერი ციფრული 3D რუქისთვის: 5 ნაბიჯი
ვიდეო: Setting up a 3d Printer with MKS sGen L v1.0 Part 3 2024, სექტემბერი
Anonim
ძირითადი 3D სკანერი ციფრული 3D რუქისთვის
ძირითადი 3D სკანერი ციფრული 3D რუქისთვის

ამ პროექტში მე აღვწერ და ავუხსნი 3D სკანირებისა და რეკონსტრუქციის ძირითად საფუძვლებს, რომლებიც ძირითადად გამოიყენება მცირე ზომის ნახევარფრენიანი ობიექტების სკანირებისას და რომელთა მოქმედება შეიძლება გავრცელდეს სკანირებისა და რეკონსტრუქციის სისტემებზე, რომლებიც შეიძლება დამონტაჟდეს დისტანციური მართვის თვითმფრინავებზე. 3D მოდელი. იმ ადგილებიდან, სადაც დაფრინავს თვითმფრინავი, რომელიც მათ ატარებს

საბოლოო იდეა არის რომელიღაც ადგილის ან ტერიტორიის, მისი გარე თუ შიდა ნაწილის 3D სკანირება, ციფრული რუქის სახით გამოსაყენებლად (როგორც პრომეთეს ფილმში)

Ნაბიჯი 1:

გამოსახულება
გამოსახულება

იდეა არის სამგანზომილებიანი სკანირების სისტემის დაყენება დისტანციურად კონტროლირებად სიბრტყეზე, რათა მოხდეს ციფრული ციფრული სიგნალი იმ ადგილის ვირტუალურად, რომელზეც ის დაფრინავს 3D– ში, მაგრამ ამისათვის ჩვენ დავიწყეთ ლაზერული სამკუთხედის მოქმედების დასაწყისიდან სკანირება ან 3D რეკონსტრუქცია ლაზერული სამკუთხედებით ძირითადად შედგება ლაზერული სხივის გავლით პრიზმაში, რომელიც წარმოქმნის ლაზერულ ზოლს მთლიანი ლაზერული ზოლის მისაღებად, რომელიც დაპროექტებული იქნება დასკანერებულ ობიექტზე და მას შემდეგ რაც მიიღება ეს ლაზერული პროექცია ზედაპირის ზედაპირი სკანირების ადგილიდან, სურათი უნდა იყოს გადაღებული რაიმე სახის კამერით და სასურველია იცოდეს რა კუთხე იქმნება გამოსხივებული ლაზერული ზოლის პროექციის კუთხის მიმართ, რადგან თითოეული ეს სურათი ასახავს დაგეგმილ ლაზერულ ზოლებს. ობიექტის ზედაპირზე, ისინი წინასწარ იქნება დამუშავებული, რომ ამოიღონ შესამოწმებელი ობიექტის განზომილებიანი მახასიათებლები და უბრალოდ დაასკანირონ ზოლები ობიექტის ზემოთ, რათა მიიღონ მისი ზედაპირის პროფილი ობიექტის ამ განივი სეგმენტში და შემდგომ დაიჭირონ ობიექტის შემდეგი ჯვრის მონაკვეთის დაპროექტებული ზოლი, რომ დავამატოთ ყველა დაპროექტებული ზოლი ერთად სანამ ობტოს ყველა განივი მონაკვეთი ვიღებთ მისი ზედაპირის სამგანზომილებიან სკანირებას

ნაბიჯი 2:

გამოსახულება
გამოსახულება

ვინაიდან ჩვენ დავადგინეთ ჩვენი მიზანი, შემდეგი ნაბიჯი იმის ცოდნა, რომ ასაფრენად ჯერ ფეხები მყარად უნდა გქონდეთ მიწაზე, ასე რომ, ჩვენ დავიწყეთ ადგილზე წრფივი 3D სკანერის ექსპერიმენტული პროტოტიპით, რათა დავადგინოთ ძირითადი 3D სკანერი და როგორც ხედავთ ზემოთ მოცემულ სურათზე, მე გამოვიყენე კომპიუტერი, OpenCV, OpenGL Glut, ვებკამერა, ლაზერი, ლაზერული ფერმის გენერატორი (ამ შემთხვევაში ბრუნვის სარკის საშუალებით) ელექტრონული წრფივი გადაადგილების სისტემა (დამზადებულია სარკინიგზო საშუალებით და სისტემა ამოღებულია ძველი პრინტერიდან) იმ ბაზაზე, რომელზედაც ვდებ სკანირების ობიექტებს, ხესა და პლასტილინას და როგორც ხედავთ ფოტოში, კომპიუტერზე: მე მოვახერხე OpenTL– დან Glut– ით გენერირება და ჩვენება სამი- განზომილებიანი მოდელი რეპროდუცირებული დასკანერებული რეალური ობიექტის საფუძველზე (ამ შემთხვევაში სათამაშო ობობა)

ასე რომ, მეტისმეტად აშკარაა, რომ მოქმედების პრინციპი ფუნქციონალურია და რომ საფრენი სისტემის შესაბამისი კორექტირებითა და ადაპტაციებით ის შეძლებს იმ ადგილის 3D რუქის სკანირებას და რეპროდუცირებას, რომელშიც ის დაფრინავს.

მაგრამ ეს სისტემა მხოლოდ იმ ადგილების გარე ზედაპირის 3D რუქების მოპოვებას მოემსახურება, სადაც ის დაფრინავს ???…

ნაბიჯი 3:

გამოსახულება
გამოსახულება

გამოქვაბულებისა და სადინარების ინტერიერის შედგენა (ისევე როგორც პრომეთეს ფილმში) ეს 3D სკანირების სისტემა ასევე ემსახურება დიდი და ღრუ ობიექტების ინტერიერის სამგანზომილებიანი მოდელების რეკონსტრუქციას, როგორიცაა გამოქვაბულები, შენობები, გვირაბები და ა.შ. მისი მოქმედების პრინციპია ზუსტად იგივე რაც უკვე აღწერილია და რომელიც ძირითადად შედგება შემდეგიდან:

  1. გადაიღეთ ლაზერული ზოლის თითოეული პროექციის ფოტო სკანირების ზედაპირზე
  2. გაფილტრეთ და წაშალეთ ფერი სურათიდან
  3. ფერის ბინარიზაცია დინამიური გამოსახულების ზღურბლით
  4. გამოიყენეთ პირას დეტექტორი თითოეული ლაზერული პროექციის განივი მონაკვეთის გადაღებული პროფილის ამოცნობის მიზნით
  5. და სეგმენტაციის გამოყენებით შეარჩიეთ შესაბამისი საზღვარი იმ ობიექტის იმ მონაკვეთის 3D გამოსახულებისათვის, რომელიც დასკანერდება და აღდგება ვირტუალურ 3D რუქაზე
  6. შემდეგ ეს ნაბიჯები უბრალოდ მეორდება თითოეული ფოტოსთვის, რომელიც გადაღებულია ლაზერული ზოლების ქვე-წესით, რომელიც განუწყვეტლივ არის დაპროექტებული თითოეული ქვეგანყოფილებით ქვეგანყოფილებაში.
  7. ჯვარი მონაკვეთების წარმოდგენის ფენა ფენა დაემატება თანმიმდევრულად მანამ, სანამ არ მიიღება წერტილოვანი ღრუბელი, რომელიც წარმოიქმნება საგნის ჯვრის მონაკვეთების მრავალი გამოსახულებით

ნაბიჯი 4:

გამოსახულება
გამოსახულება

შემდეგ მე გავდივარ ზედაპირული ლაზერული ზოლების პროექციების გამოსახულების დამუშავების პროგრამებს. ამ ვირუსული სამგანზომილებიანი რეკონსტრუქციის სამგანზომილებიანი რუქის მოდელში:

სურათის დამუშავება:

n

#მოიცავს #მოიცავს #cv.h " #მოიცავს" highgui.h " #მოიცავს // #მოიცავს #მოიცავს #მოიცავს #მოიცავს

char f = 0; char სახელი = {"0.jpg"}; int n = 0, s, x, y; CvScalar sp; ფაილი *NuPu;

void Writepoints () {char bufferx [33], buffery [33]; იტოა (x, ბუფერული, 10); იტოა (y, ბუფერი, 10); fprintf (NuPu, bufferx); fprintf (NuPu, "\ t"); fprintf (NuPu, ბუფერი); fprintf (NuPu, "\ n"); }

void noteblockInit () {NuPu = გახსნა ("NuPu.txt", "w"); fseek (NuPu, 0, 0); fprintf (NuPu, "NP:"); fprintf (NuPu, "\ n"); }

int main () {char argstr [128]; noteblockInit (); cout << "თეკლეა! …:" ვ; სახელი [0] = f; კუტი <

IplImage* img0 = cvLoadImage ("00.jpg", 0); თუ (f == '0') {for (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 ++) { sp = cvGet2D (img1, y, x); if (sp.val [0]> 50) {ჩაწერის პუნქტები (); n ++;}}}} char buffer [33]; იტოა (n, ბუფერი, 10); fprintf (NuPu, "Fin:"); fprintf (NuPu, ბუფერი); fprintf (NuPu, "\ n"); fclose (NuPu);

cvWaitKey (0); //_execlp("calc.exe "," calc.exe ", argstr, NULL); cvDestroyAllWindows (); cvReleaseImage (& სურათი); cvReleaseImage (& img); cvReleaseImage (& img0); cvReleaseImage (& img1); cvReleaseImage (& img2); დაბრუნება 0; }

3D რეკონსტრუქცია:

#ჩართვა ///////////////////ifdef _APPLE_ #ჩათვლით #სხვა #ჩართეთ #ჩართეთ #დაასრულეთ #ჩართეთ #ჩართეთ #ჩართეთ #ჩართეთ #ჩართეთ #ჩართეთ

#განსაზღვრეთ იისფერი glColor3f (1, 0, 1) #განსაზღვრეთ azul glColor3f (0, 0, 1) #განსაზღვრეთ turkeza glColor3f (0, 1, 1) #განსაზღვრეთ verde glColor3f (0, 1, 0) #განსაზღვრეთ amarillo glColor3f (1, 1, 0) #განსაზღვრეთ naranja glColor3f (1,.3, 0) #განსაზღვრეთ rojo glColor3f (1, 0, 0) სახელების სივრცის გამოყენებით; int s, ბოტონი = 1, პულბუტი = 1; float mx = 0, my = 0, mtx = 0, mty = 0, mtz = -5.0; const int Avance = 1; სიმებიანი ხაზი, Aux; char Caracter = 'H'; ფაილი *NuPu; int NP, h, w; float G = 0, n = 0, cx [5000], cy [5000], x, y, ax, ay, az; int შრიფტი = (int) GLUT_BITMAP_8_BY_13; სტატიკური ხილული ეტიკეტი [100]; char buffer [3]; GLfloat anguloCuboX = 0.0f; GLfloat anguloCuboY = 0.0f; GLfloat anguloEsfera = 0.0f; GLint ანჩო = 500; GLint alto = 500; int hazPerspectiva = 0; void გადაკეთება (int სიგანე, int სიმაღლე) {glViewport (0, 0, სიგანე, სიმაღლე); glMatrixMode (GL_PROJECTION); glLoadIdentity (); if (hazPerspectiva) gluPerspective (23.0f, (GLfloat) სიგანე/(GLfloat) სიმაღლე, 1.0f, 20.0f); სხვაგვარად glOrtho (-1, 1, -1, 1, -10, 10); glMatrixMode (GL_MODELVIEW); ანჩო = სიგანე; ალტო = სიმაღლე; } void Kolorear (int K) {float Hip; x = (cx [s] -320)/480; y = (cy [s] -240)/640; თეძო = sqrt (pow (x, 2)+pow (y, 2)); თუ ((Hip> = 0) && (Hip =.07) && (Hip =.14) && (Hip =.21) && (Hip =.28) && (Hip =.35) && (Hip =.42) && (Hip <=. 49)) {violeta;}} void drawNuPu (void) {glColor3f (1, 1, 1); glBegin (GL_LINES); glVertex3f (.2, 0, 0); glVertex3f (-. 2, 0, 0); glVertex3f (0,.2, 0); glVertex3f (0, -.2, 0); glEnd (); როჟო; glBegin (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);} void renderBitmapString (float x, float y, void *font, char *string) {char *c; glRasterPos2f (x, y); for (c = string; *c! = '\ 0'; c ++) {glutBitmapCharacter (font, *c);}} void display () {// mx = 468; itoa (mx, buffer, 10); glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // glLoadIdentity (); glColor3f (1.0, 1.0, 1.0); glRasterPos2f (-1,.9); // glutBitmapString (GLUT_BESMO); s <3; s ++) {glutBitmapCharacter (GLUT_BITMAP_TIMES_ROMAN_24, ბუფერი [s]);} glTranslatef (mty, -mtx, mtz); glRotatef (mx, 1.0f, 0.0f, 0.0f); glRotatef (ჩემი, 0.0f, 1.0f, 0.0f); drawNuPu (); /*glColor3f(1.0, 1.0, 1.0); glRasterPos2f (.5,.5); // glutBitmapString (GLUT_BITMAP_TIMES_ROMAN_24, "გამარჯობა ტექსტი"); glutBitmapCharacter (GLUT);* / /*glColor3f (1. 0f, 1.0f, 1.0f); setOrthographicProjection (); glPushMatrix (); glLoadIdentity (); renderBitmapString (30, 15, (void *) შრიფტი, "GLUT Tutorial ---_ ------ _@ 3D Tech"); */ glFlush (); glutSwapBuffers (); anguloCuboX+= 0.1f; anguloCuboY+= 0.1f; anguloEsfera+= 0.2f; } void 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/rekostruccion 3D en specialized CICATA/Software/Reconstruccion 3D/R3d_0 / bin/Debug/NuPu.t"); if (myfile.is_open ()) {s = 0; while (getline (myfile, line)) {if ((line [0]! = 'N') && (line [0]! = 'F')) {Aux = line; ხაზი [0] = 48; ხაზი [1] = 48; ხაზი [2] = 48; ხაზი [3] = 48; cy [s] = atoi (line.c_str ()); Aux [4] = 48; Aux [5] = 48; Aux [6] = 48; // აუქსი [7] = 48; cx [s] = atoi (Aux.c_str ()); s ++; }} myfile.close (); } else cout <1780) NP = 1700; cout <void idle () {ჩვენება (); } void კლავიატურა (ხელმოუწერელი char key, int x, int y) {switch (გასაღები) {case 'p': case 'P': hazPerspectiva = 1; გადაკეთება (ანჩო, ალტო); შესვენება; საქმე 'o': შემთხვევა 'O': hazPerspectiva = 0; გადაკეთება (ანჩო, ალტო); შესვენება; შემთხვევა 27: // გასასვლელი გასასვლელი (0); შესვენება; }} void raton (int ღილაკი, int მდგომარეობა, int x, int y) { / * GLUT_LEFT_BUTTON 0 GLUT_MIDDLE_BUTTON 1 GLUT_RIGHT_BUTTON 2 GLUT_DOWN 0 GLUT_UP 1 * / ბოტონი = ღილაკი; პულბუტი = სახელმწიფო; // mx = y; ჩვენება (); } void ratmov (int x, int y) {if ((Boton == 0) & (Pulbut == 0)) {mx = y; ჩემი = x; } if ((Boton == 2) & (Pulbut == 0)) {mtx = (y/200) -1; mty = (x/200) -1; } if ((Boton == 1) & (Pulbut == 0)) {mtz =-(y/40) -5; } ჩვენება (); } int main (int argc, char ** argv) { /*glutAddMenuEntry () glutAddSubMenu () glutAttachMenu () glutCreateMenu () glutSetMenu () glutStrokeCharacter () glutStrokeLelsels () ბლოკი () ჩარჩო ბუფერი glGetPixelMapfv () დააბრუნებს მითითებულ პიქსელ რუქას glGetPixelMapuiv () დააბრუნებს მითითებულ პიქსელ რუქას glGetPointerv () აბრუნებს მითითებული მაჩვენებლის მისამართს.*/ Init (); leer (); glutInit (& argc, argv); glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); glutInitWindowPosition (50, 50); glutInitWindowSize (ანჩო, ალტო); glutCreateWindow ("კუბო 1"); მასში(); glutDisplayFunc (ჩვენება); glutReshapeFunc (გადაკეთება); glutIdleFunc (მოჩვენებითი); glutMouseFunc (რატონი); glutMotionFunc (ratmov); glutKeyboardFunc (კლავიატურა); glutMainLoop (); დაბრუნება 0; }

ნაბიჯი 5:

გამოსახულება
გამოსახულება

ამ მომენტში უნდა გავჩერდე! … მაგრამ მომდევნო თავში გპირდებით, რომ განვახორციელებ მას ჟოლოს პი 3 ან ჯეტონის ნანო დაფაზე, რომელიც უკვე დამონტაჟებულია დისტანციურად კონტროლირებად თვითმფრინავზე, ან ობობის რობოტზე, გამოქვაბულების ინტერიერის დასამოწმებლად

გირჩევთ: