Përmbajtje:
Video: Skaneri bazë 3D për hartëzimin dixhital 3D: 5 hapa
2024 Autor: John Day | [email protected]. E modifikuara e fundit: 2024-01-30 12:12
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:
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:
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:
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:
- kapni foton e secilës projeksion të shiritit lazer në sipërfaqen që do të skanohet
- filtroni dhe hiqni ngjyrën nga imazhi
- binarizoni ngjyrën me një prag dinamik të imazhit
- aplikoni një detektor buzë për të njohur profilin e kapur të çdo seksion kryq të projeksionit lazer
- 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
- 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.
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:
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:
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:
Arduino Nano-MMA8452Q 3-Bosht 12-bit/8-bit Përshpejtues dixhital dixhital: 4 hapa
Arduino Nano-MMA8452Q 3-Aksi 12-bit/8-bit Përshpejtues dixhital: MMA8452Q është një akselerometër i zgjuar, me fuqi të ulët, me tre boshte, kapacitiv, me mikromakinim me 12 bit rezolucion. Opsionet fleksibile të programueshme të përdoruesit sigurohen me ndihmën e funksioneve të ngulitura në akselerometër, të konfigurueshme në dy ndërprerës
Si të shkatërroni një caliper dixhital dhe si funksionon një caliper dixhital: 4 hapa
Si të rrëzoni një caliper dixhital dhe si funksionon një caliper dixhital: Shumë njerëz dinë të përdorin kalibra për matje. Ky tutorial do t'ju mësojë se si të prishni një caliper dixhital dhe një shpjegim se si funksionon caliper dixhital
Termometër infra të kuqe pa kontakt me bazë Arduino - Termometri me bazë IR duke përdorur Arduino: 4 hapa
Termometër infra të kuqe pa kontakt me bazë Arduino | Termometri i bazuar në IR duke përdorur Arduino: Përshëndetje djema në këtë udhëzues ne do të bëjmë një termometër pa kontakt duke përdorur arduino. Meqenëse ndonjëherë temperatura e lëngut/ngurtës është shumë e lartë ose shumë e ulët dhe pastaj është e vështirë të kontaktosh me të dhe të lexosh temperatura atëherë në atë skenë
Si të bëni hartëzimin e projektimit me kapakun Pi: 9 hapa (me fotografi)
Si të bëni hartëzimin e projektimit me kapakun Pi: Ne kemi marrë frymëzim nga projektet tuaja dhe kemi krijuar një tutorial të hartës së projeksionit duke përdorur Pi Cap. Nëse dëshironi që projekti juaj të funksionojë pa tel përmes WiFi, atëherë ky është udhëzuesi për ju. Ne përdorëm MadMapper si një softuer të hartës së projeksionit
Riparimi i problemit bazë të ndërgjegjes së kompjuterit bazë (dështimi i diskut në sistem dhe furnizimi me energji i dëmtuar dhe skedarët e humbur/të korruptuar): 4 hapa
Riparimi i problemit bazë të ndërgjegjes kompjuterike bazë (dështimi i sistemit të diskut dhe PSU i prishur dhe skedarët që mungojnë/korruptojnë): KJO UDHZUES NUK KA PINRFUNDUAR, DO T AD SHTOJ M M SHUM INFORMACION KUR M G KA NJ SHANS. Nëse keni nevojë për ndonjë ndihmë me rregullimin e një kompjuteri ose nëse keni ndonjë pyetje fare, mos ngurroni të më dërgoni mesazh " Në këtë udhëzues do t'ju tregoj se si të riparoni komin bazë