Përmbajtje:

Skaneri bazë 3D për hartëzimin dixhital 3D: 5 hapa
Skaneri bazë 3D për hartëzimin dixhital 3D: 5 hapa

Video: Skaneri bazë 3D për hartëzimin dixhital 3D: 5 hapa

Video: Skaneri bazë 3D për hartëzimin dixhital 3D: 5 hapa
Video: 🟡 POCO X5 PRO - САМЫЙ ДЕТАЛЬНЫЙ ОБЗОР и ТЕСТЫ 2024, Shtator
Anonim
Skaneri bazë 3D për hartëzimin dixhital 3D
Skaneri bazë 3D për hartëzimin dixhital 3D

Në këtë projekt, unë do të përshkruaj dhe shpjegoj bazat themelore të skanimit dhe rindërtimit 3D të aplikuar kryesisht në skanimin e objekteve të vogla gjysmë-aeroplan, dhe funksionimi i të cilave mund të shtrihet në sistemet e skanimit dhe rindërtimit që mund të instalohen në avionët me telekomandë për të marrë një model 3D nga vendet ku fluturon aeroplani që i merr

Ideja përfundimtare është marrja e një skanimi 3D të një vendi ose zone, të jashtme ose të brendshme, për ta përdorur atë si një hartë dixhitale (si në filmin e Prometeus)

Hapi 1:

Imazhi
Imazhi

ideja është të instaloni të gjithë sistemin e skanimit 3d në një aeroplan të telekomanduar, në mënyrë që të digjitalizoni hartën virtuale të çdo zone mbi të cilën fluturon në 3D, por për këtë ne filluam që nga fillimi i funksionimit të trekëndëzimit lazer i skanimit ose rindërtimit 3d nga trekëndëzimi lazer në thelb konsiston në kalimin e një rreze lazeri përmes një prizmi që gjeneron një shirit lazer për të marrë një shirit të tërë lazer që do të projektohet në një objekt që do të skanohet, dhe sapo ky projeksion lazer të jetë marrë në sipërfaqja e sipërfaqes Nga vendi për të skanuar, imazhi duhet të kapet me një lloj kamere dhe mundësisht duke ditur këndin që formohet në lidhje me këndin e projeksionit të shiritit lazer të emetuar, pasi secila prej këtyre imazheve kap shiritat lazer të projektuar. Në sipërfaqen e objektit, ato do të përpunohen paraprakisht për të nxjerrë karakteristikat dimensionale të objektit që do të skanohet, dhe thjesht të skanojnë shirita me shirita mbi objektin për të marrë profilin e sipërfaqes së tij në atë segment tërthor të objektit, dhe më pas të kapin rripi i projektuar i seksionit kryq të mëposhtëm të objektit, për të shtuar të gjitha shiritat e projektuar së bashku Përpara të gjitha seksioneve kryq të oboto marrim një skanim tre-dimensional të sipërfaqes së tij

Hapi 2:

Imazhi
Imazhi

Meqenëse kemi identifikuar objektivin tonë, hapi tjetër duke ditur se për të ngritur së pari duhet të keni këmbët tuaja të vendosura në tokë, kështu që ne filluam në tokë me një prototip eksperimental të një skaneri linear 3d, për të vërtetuar funksionimin e saktë të bazës Skanim 3d dhe siç mund të shihni në imazhin e mësipërm, kam përdorur një PC, OpenCV, Glut of OpenGL, një kamer në internet, një lazer, gjenerator të fermës lazer (në këtë rast përmes një pasqyre rrotulluese) një sistem elektronik të zhvendosjes lineare (i bërë me një hekurudhë dhe sistemi i nxjerrë nga një printer i vjetër) nga një bazë në të cilën vendos objektet që do të skanohen, dru dhe plastelinë dhe siç mund ta shihni në foto, në kompjuter: kam arritur të krijoj dhe shfaq me Glut nga OpenGL një tre- model dimensionale i riprodhuar bazuar në objektin e vërtetë të skanuar (në këtë rast një merimangë lodër)

kështu që është më se e qartë se parimi i funksionimit është funksional dhe se me rregullimet dhe përshtatjet përkatëse në një sistem fluturues do të jetë në gjendje të skanojë dhe riprodhojë një hartë 3D të zonës në të cilën fluturon.

Por ky sistem do të shërbejë vetëm për të marrë harta 3D të sipërfaqes së jashtme të vendeve ku fluturon ???…

Hapi 3:

Imazhi
Imazhi

hartimi i brendësisë së shpellave dhe kanaleve (ashtu si në filmin Prometeus) Ky sistem skanimi 3D shërben gjithashtu për të rindërtuar modele tre-dimensionale të brendshme të objekteve të mëdha dhe të zbrazëta si shpella, ndërtesa, tunele, etj. saktësisht e njëjtë siç është përshkruar tashmë dhe e cila në thelb përbëhet nga sa vijon:

  1. kapni foton e secilës projeksion të shiritit lazer në sipërfaqen që do të skanohet
  2. filtroni dhe hiqni ngjyrën nga imazhi
  3. binarizoni ngjyrën me një prag dinamik të imazhit
  4. aplikoni një detektor buzë për të njohur profilin e kapur të çdo seksion kryq të projeksionit lazer
  5. dhe duke përdorur segmentimin zgjidhni kufirin e duhur për paraqitjen 3D të atij seksion kryq të objektit që do të skanohet dhe rindërtohet në hartën virtuale 3D
  6. atëherë këto hapa thjesht përsëriten për secilën fotografi të marrë në një nën-mënyrë të shiritave lazer të projektuar vazhdimisht nga secila nën-seksion në nën-seksion.
  7. shtresa për shtresë e paraqitjes së seksioneve tërthore shtohen në mënyrë të njëpasnjëshme derisa të merret një re pikë e formuar nga shumë përfaqësime të seksioneve kryq të objektit që do të hartohet

Hapi 4:

Imazhi
Imazhi

Pastaj kaloj programet për përpunimin e imazhit të projeksioneve të shiritave lazer sipërfaqësor. dhe të rindërtimit virtual 3d të këtyre paraqitjeve tërthorë susive në modelin e përpunuar tredimensional të hartës:

përpunimi i imazhit:

n

#include #include "cv.h" #include "highgui.h" #include // #include #include #include #include

char f = 0; emri i karbonit = {"0.jpg"}; int n = 0, s, x, y; CvScalar sp; DOSJA *NuPu;

void Writepoints () {char bufferx [33], buffery [33]; itoa (x, tampon, 10); itoa (y, tampon, 10); fprintf (NuPu, tampon); fprintf (NuPu, "\ t"); fprintf (NuPu, buffery); fprintf (NuPu, "\ n"); }

void noteblockInit () {NuPu = hapet ("NuPu.txt", "w"); fseek (NuPu, 0, 0); fprintf (NuPu, "NP:"); fprintf (NuPu, "\ n"); }

int kryesore () {char argstr [128]; noteblockInit (); cout << "Teklea!…:" f; emri [0] = f; cout <

IplImage* img0 = cvLoadImage ("00.jpg", 0); nëse (f == '0') {për (y = 1; yheight-2; y ++) {për (x = 1; xwidth-2; x ++) {sp = cvGet2D (img0, y, x); nëse (sp.val [0]> 50) {Pikat e shkrimit (); n ++;}}}} tjetër {për (y = 1; yheight-2; y ++) {për (x = 1; xwidth-2; x ++) { sp = cvGet2D (img1, y, x); if (sp.val [0]> 50) {Pikat e shkrimit (); n ++;}}}} tampon char [33]; itoa (n, tampon, 10); fprintf (NuPu, "Fin:"); fprintf (NuPu, tampon); fprintf (NuPu, "\ n"); fclose (NuPu);

cvWaitKey (0); //_execlp("calc.exe "," calc.exe ", argstr, NULL); cvDestroyAllWindows (); cvReleaseImage (& image); cvReleaseImage (& img); cvReleaseImage (& img0); cvReleaseImage (& img1); cvReleaseImage (& img2); kthimi 0; }

Rindërtimi 3D:

#përfshi ///////////////////ifidef _APPLE_ #include #else #Include #include #endif #include #include #includ #include #includ #include

#define violeta glColor3f (1, 0, 1) #define azul glColor3f (0, 0, 1) #define turkeza glColor3f (0, 1, 1) #define verde glColor3f (0, 1, 0) #define amarillo glColor3f (1, 1, 0) #define naranja glColor3f (1,.3, 0) #define rojo glColor3f (1, 0, 0) duke përdorur hapësirën e emrave std; int s, Boton = 1, Pulbut = 1; noton mx = 0, my = 0, mtx = 0, mty = 0, mtz = -5.0; const int Avance = 1; vargu i vargut, Aux; char Karakter = 'H'; DOSJA *NuPu; int NP, h, w; noton G = 0, n = 0, cx [5000], cy [5000], x, y, ax, ay, az; int font = (int) GLUT_BITMAP_8_BY_13; etiketë statike e karbonit [100]; tampon kar [3]; GLfloat anguloCuboX = 0.0f; GLfloat anguloCuboY = 0.0f; GLfloat anguloEsfera = 0.0f; GLint ancho = 500; GLint alto = 500; int hazPerspectiva = 0; ndryshim i zbrazët (gjerësia int, lartësia int) {glViewport (0, 0, gjerësia, lartësia); glMatrixMode (GL_PROJECTION); glLoadIdentity (); nëse (hazPerspectiva) gluPerspective (23.0f, (GLfloat) gjerësia/(GLfloat) lartësia, 1.0f, 20.0f); tjetër glOrtho (-1, 1, -1, 1, -10, 10); glMatrixMode (GL_MODELVIEW); anço = gjerësi; alto = lartësia; } void Kolorear (int K) {float Hip; x = (cx [s] -320)/480; y = (cy [s] -240)/640; Hip = sqrt (pow (x, 2)+pow (y, 2)); nëse ((Hip> = 0) && (Hip =.07) && (Hip =.14) && (Hip =.21) && (Hip =.28) && (Hip =.35) && (Hip =.42) && (Hip <=. 49)) {violeta;}} pavlefshme drawNuPu (e pavlefshme) {glColor3f (1, 1, 1); glBegin (GL_LINES); glVertex3f (.2, 0, 0); glVertex3f (-. 2, 0, 0); glVertex3f (0,.2, 0); glVertex3f (0, -.2, 0); glEnd (); rojo; glBegin (GL_POINTS); për (n = 0; n <10; n ++) {për (s = 0; s void setOrthographicProject () {glMatrixMode (GL_PROJECTION); glPushMatrix (); glLoadIdentity (); gluOrtho2D (0, w, 0, h); glScalef (1, -1, 1); glTranslatef (0, -h, 0); glMatrixMode (GL_MODELVIEW);} void renderBitmapString (noton x, noton y, void *font, char *string) {char *c; glRasterPos2f (x, y); për (c = string; *c! = '\ 0'; c ++) {glutBitmapCharacter (font, *c);}} shfaqje e pavlefshme () {// mx = 468; itoa (mx, tampon, 10); glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // glLoadIdentity (); glColor3f (1.0, 1.0, 1.0); glRasterPos2f (-1,.9); // glutBitmapString (GLUT_BESM,_TROM]; s <3; s ++) {glutBitmapCharacter (GLUT_BITMAP_TIMES_ROMAN_24, tampon [s]);} glTranslatef (mty, -mtx, mtz); glRotatef (mx, 1.0f, 0.0f, 0.0f); glRotatef (im, 0.0f, 1.0f, 0.0f); drawNuPu (); /*glColor3f(1.0, 1.0, 1.0); glRasterPos2f (.5,.5); // glutBitmapString (GLUT_BITMAP_TIMES_ROMAN_24, "Përshëndetje Teksti"); glutBitmAPCharacter (GLUT);* / /*glColor3f (1. 0f, 1.0f, 1.0f); setOrthographicProjection (); glPushMatrix (); glLoadIdentity (); renderBitmapString (30, 15, (pavlefshme *) font, "GLUT Tutorial ---_ ------ _@ 3D Tech"); */ glFlush (); glutSwapBuffers (); anguloCuboX+= 0.1f; anguloCuboY+= 0.1f; anguloEsfera+= 0.2f; } void init () {glClearColor (0, 0, 0, 0); aktivizo (GL_DEPTH_TEST); anko = 500; alto = 500; } void leer () {ifstream myfile ("A:/Respaldo shtator 2016/D/Respaldos/Respaldo compu CICATA abril 2015/usb1/rekostruccion 3D en Special Special CICATA/Software/Reconstruccion 3D/R3d_0 / bin/Debug/NuPu.t"); if (myfile.is_open ()) {s = 0; ndërsa (getline (myfile, line)) {if ((line [0]! = 'N') && (rreshti [0]! = 'F')) {Aux = line; rreshti [0] = 48; rreshti [1] = 48; rreshti [2] = 48; rreshti [3] = 48; cy [s] = atoi (rreshti.c_str ()); Aux [4] = 48; Aux [5] = 48; Aux [6] = 48; // Aux [7] = 48; cx [s] = atoi (Aux.c_str ()); s ++; }} myfile.close (); } else cout <1780) NP = 1700; cout <void idle () {display (); } tastiera e pavlefshme (çelësi i shenjuar i char, int x, int y) {switch (kyç) {case 'p': case 'P': hazPerspectiva = 1; rimodelim (anko, alto); pushim; rasti 'o': rasti 'O': hazPerspectiva = 0; rimodelim (anko, alto); pushim; rasti 27: // dalje shpëtimi (0); pushim; }} void raton (butoni int, gjendja int, int x, int y) { / * GLUT_LEFT_BUTTON 0 GLUT_MIDDLE_BUTTON 1 GLUT_RIGHT_BUTTON 2 GLUT_DOWN 0 GLUT_UP 1 * / Boton = buton; Pulbut = gjendje; // mx = y; shfaqje (); } void ratmov (int x, int y) {if ((Boton == 0) & (Pulbut == 0)) {mx = y; mi = x; } nëse ((Boton == 2) & (Pulbut == 0)) {mtx = (y/200) -1; mty = (x/200) -1; } nëse ((Boton == 1) & (Pulbut == 0)) {mtz =-(y/40) -5; } ekran (); } int kryesore (int argc, char ** argv) { /*glutAddMenuEntry () glutAddSubMenu () glutAttachMenu () glutCreateMenu () glutSetMenu () glutStrokeCharacter () glutStrokeLengles ()*e glukozës ()*e [lexuar] buffer frame glGetPixelMapfv () kthen hartën e pikselit të specifikuar glGetPixelMapuiv () kthen hartën e pikselit të specifikuar glGetPointerv () Kthen adresën e treguesit të specifikuar.*/ Init (); leer (); glutInit (& argc, argv); glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); glutInitWindowPosition (50, 50); glutInitWindowSize (ancho, alto); glutCreateWindow ("Cubo 1"); init (); glutDisplayFunc (ekran); glutReshapeFunc (riformësim); glutIdleFunc (boshe); glutMouseFunc (raton); glutMotionFunc (ratmov); glutKeyboardFunc (tastiera); glutMainLoop (); kthimi 0; }

Hapi 5:

Imazhi
Imazhi

për momentin më duhet të ndalem! … por në kapitullin tjetër ju premtoj se do ta zbatoj në mjedrën time pi 3 ose nanoboardin tim jetson, të montuar tashmë në ndonjë avion me telekomandë, ose në ndonjë robot merimangë për të skanuar brendësinë e shpellave

Recommended: