Orodha ya maudhui:

Skana ya Msingi ya 3D kwa Ramani ya Dijitali ya 3D: Hatua 5
Skana ya Msingi ya 3D kwa Ramani ya Dijitali ya 3D: Hatua 5

Video: Skana ya Msingi ya 3D kwa Ramani ya Dijitali ya 3D: Hatua 5

Video: Skana ya Msingi ya 3D kwa Ramani ya Dijitali ya 3D: Hatua 5
Video: 🟡 POCO X5 PRO - САМЫЙ ДЕТАЛЬНЫЙ ОБЗОР и ТЕСТЫ 2024, Septemba
Anonim
Skana ya Msingi ya 3D kwa Ramani ya Dijitali ya 3D
Skana ya Msingi ya 3D kwa Ramani ya Dijitali ya 3D

Katika mradi huu, nitaelezea na kuelezea misingi ya skanning ya 3D na ujenzi uliotumika hasa kwa skanning ya vitu vidogo vya ndege, na ambao operesheni yake inaweza kupanuliwa kwa mifumo ya skanning na ujenzi ambayo inaweza kuwekwa kwenye ndege za kudhibiti kijijini kupata mfano wa 3D. ya mahali ambapo ndege ambayo huwachukua inzi zilizowekwa

Wazo la mwisho ni kupata skana ya 3D ya mahali au eneo, iwe nje au ndani, kuitumia kama ramani ya dijiti (kama kwenye sinema ya Prometeus)

Hatua ya 1:

Picha
Picha

wazo ni kusanikisha mfumo mzima wa skanning ya 3d kwenye ndege inayodhibitiwa na kijijini, ili kuwekea ramani halisi ya eneo lolote ambalo huruka kwa 3d, lakini kwa hili tulianza tangu mwanzo wa operesheni ya njia ya pembe tatu ya laser ya skanning au ujenzi wa 3d na pembetatu ya laser kimsingi inajumuisha kupitisha boriti ya laser kupitia prism ambayo hutengeneza mstari wa laser kupata laini nzima ya laser ambayo itakadiriwa kwenye kitu kinachopaswa kuchunguzwa, na mara tu makadirio haya ya laser yamepatikana kwenye uso wa uso Kutoka mahali pa kuchanganua, picha lazima ichukuliwe na aina fulani ya kamera na ikiwezekana kujua pembe ambayo imeundwa kwa kuzingatia pembe ya makadirio ya laini ya laser iliyotolewa, kwani kila moja ya picha hizi inakamata vipande vya laser vilivyotarajiwa. Juu ya uso wa kitu, zitashughulikiwa ili kutoa sifa za kipengee cha kitu kitakachotafutwa, na tu tambue ukanda kwa mstari juu ya kitu kupata maelezo ya uso wake katika sehemu hiyo ya kitu, na baadaye kukamata ukanda uliopangwa wa sehemu ifuatayo ya kitu, kuongeza kupigwa kwa makadirio pamoja Kabla ya sehemu zote za obto tunapata skana ya pande tatu ya uso wake.

Hatua ya 2:

Picha
Picha

Kwa kuwa tumetambua dhumuni letu, hatua inayofuata tukijua kuwa kuchukua mguu lazima kwanza uwe na miguu yako chini, kwa hivyo tukaanza chini na mfano wa majaribio ya skana ya laini ya 3d, ili kudhibitisha operesheni sahihi ya msingi Scanner 3d na unavyoona kwenye picha hapo juu, nilitumia PC, OpenCV, Glut ya OpenGL, kamera ya wavuti, laser, jenereta ya shamba la laser (katika kesi hii kupitia kioo cha kuzunguka) mfumo wa elektroniki wa kuhamisha (uliofanywa na reli na mfumo uliotolewa kutoka kwa printa ya zamani) kutoka kwa msingi ambao ninaweka vitu vitakavyotafutwa, kuni na plastiki na kama unaweza kuona kwenye picha, kwenye kompyuta: Niliweza kutengeneza na kuonyesha na Glut kutoka OpenGL tatu- mfano wa kuzalishwa uliozalishwa kwa msingi wa kitu halisi kilichokaguliwa (katika kesi hii buibui ya kuchezea)

kwa hivyo ni dhahiri zaidi kwamba kanuni ya utendaji inafanya kazi, na kwamba pamoja na marekebisho na marekebisho yake kwa mfumo wa kuruka itaweza kuchanganua na kuzaa ramani ya 3d ya eneo ambalo inaruka.

Lakini mfumo huu utatumika tu kupata ramani za 3D za uso wa nje wa maeneo ambayo inaruka juu… ???

Hatua ya 3:

Picha
Picha

ramani ya mambo ya ndani ya mapango na mifereji ya maji (kama vile kwenye sinema ya Prometeus) Mfumo huu wa utaftaji wa 3D pia hutumikia kujenga vielelezo vitatu vya mambo ya ndani ya vitu vikubwa na visivyo na maana kama mapango, majengo, mahandaki, n.k kanuni yake ya utendaji ni sawa sawa na ilivyoelezwa tayari na ambayo kimsingi ina yafuatayo:

  1. kunasa picha ya kila makadirio ya mstari wa laser juu ya uso ili kuchunguzwa
  2. chujio na uondoe rangi kutoka kwenye picha
  3. paka rangi na kizingiti cha picha chenye nguvu
  4. weka kigunduzi cha pembeni kutambua maelezo mafupi yaliyokamatwa ya kila sehemu ya msalaba ya makadirio ya laser
  5. na kutumia segmentation chagua mpaka unaofaa kwa uwakilishi wa 3d wa sehemu hiyo ya msalaba ya kitu kitakachochanganuliwa na kujengwa upya kwenye ramani ya 3D
  6. basi hatua hizi zinarudiwa tu kwa kila picha iliyochukuliwa kwa njia ndogo ya kupigwa kwa laser inayoendelea kutabiriwa na kila sehemu ndogo katika sehemu ndogo.
  7. safu na safu ya uwakilishi wa sehemu za msalaba zinaongezwa mfululizo hadi kupata wingu la uhakika linaloundwa na viwakilishi vingi vya sehemu za msalaba za kitu kinachopangwa ramani

Hatua ya 4:

Picha
Picha

Kisha mimi hupitisha programu za usindikaji wa picha ya makadirio ya vipande vya juu vya laser. na ujenzi mpya wa 3d wa uwakilishi huu wa pande zote katika muundo wa ramani wa pande tatu:

usindikaji wa picha:

n

# pamoja na # pamoja na "cv.h" # pamoja na "highgui.h" # pamoja na // # ni pamoja na #jumuisha # pamoja na # pamoja

char f = 0; jina la char = {"0.jpg"}; int n = 0, s, x, y; CvScalar sp; FILE * NuPu;

Utupu wa maandishi () {char bufferx [33], bafa [33]; itoa (x, bufferx, 10); itoa (y, mkate, 10); fprintf (NuPu, bufferx); fprintf (NuPu, "\ t"); fprintf (NuPu, buffery); fprintf (NuPu, "\ n"); }

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

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

IplImage * img0 = cvLoadImage ("00.jpg", 0); ikiwa (f == '0') {for (y = 1; yheight-2; y ++) {for (x = 1; xwidth-2; x ++) {sp = cvGet2D (img0, y, x); ikiwa (sp.val [0]> 50) {Writepoints (); n ++;}}}}} mwingine {for (y = 1; yheight-2; y ++) {for (x = 1; xwidth-2; x ++) { sp = cvGet2D (img1, y, x); ikiwa (sp.val [0]> 50) {Writepoints (); n ++;}}}} char bafa [33]; itoa (n, bafa, 10); fprintf (NuPu, "Fin:"); fprintf (NuPu, bafa); fprintf (NuPu, "\ n"); fclose (NuPu);

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

Ujenzi wa 3D:

# pamoja # ///////////////// #ifdef _APPLE_ #jumlisha #jingine #jumlisha #jumlisha #isha ikiwa ni pamoja na #jumuisha #pamoja na #jumlisha #jumuisha #jumuisha

#fafanua violeta glColor3f (1, 0, 1) #fafanua azul glColor3f (0, 0, 1) #fafanua turkeza glColor3f (0, 1, 1) #fafanua verde glColor3f (0, 1, 0) #fafanua amarillo glColor3f (1, 1, 0) #fafanua naranja glColor3f (1,.3, 0) #fafanua rojo glColor3f (1, 0, 0) kutumia namespace std; int s, Boton = 1, Pulbut = 1; kuelea mx = 0, yangu = 0, mtx = 0, mty = 0, mtz = -5.0; Const int Avance = 1; mstari wa kamba, Aux; char Tabia = 'H'; FILE * NuPu; int NP, h, w; kuelea G = 0, n = 0, cx [5000], cy [5000], x, y, shoka, ay, az; fonti ya ndani = (int) GLUT_BITMAP_8_BY_13; lebo ya static char [100]; bafa ya char [3]; GLfloat anguloCuboX = 0.0f; GLfloat anguloCuboY = 0.0f; GLfloat anguloEsfera = 0.0f; GLint ancho = 500; GLint alto = 500; int hazPerspectiva = 0; urekebishaji batili (upana wa int, urefu wa int) {glViewport (0, 0, upana, urefu); glMatrixMode (GL_PROJECTION); GlLoadIdentity (); ikiwa (hazPerspectiva) gluPerspective (23.0f, (GLfloat) upana / (GLfloat) urefu, 1.0f, 20.0f); mwingine glOrtho (-1, 1, -1, 1, -10, 10); glMatrixMode (GL_MODELVIEW); ancho = upana; alto = urefu; } utupu Kolorear (int K) {kuelea Hip; x = (cx [s] -320) / 480; y = (cy [s] -240) / 640; Kiboko = sqrt (poda (x, 2) + poda (y, 2)); ikiwa ((Hip> = 0) && (Hip =.07) && (Hip =.14) && (Hip =.21) && (Hip =.28) && (Hip =.35) && (Hip =.42) && (Hip <=. 49)) {violeta;}} batili drawNuPu (batili) {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); kwa (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);, y); kwa (c = kamba; * c! = '\ 0'; c ++) {glutBitmapCharacter (font, * c);}} onyesho batili () {// mx = 468; glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // glLoadIdentity (); glColor3f (1.0, 1.0, 1.0); glRasterPos2f (-1,.9);; <3; 1.0f, 0.0f); choraNuPu (); /*glColor3f (1.0, 1.0, 1.0); glRasterPos2f (.5,.5); *; / / * glColor3f (1. 0f, 1.0f, 1.0f); kuwekaOrthographicProjection (); glPushMatrix (); GlLoadIdentity (); renderBitmapString (30, 15, (void *) font, "GLUT Tutorial ---_ ------ _ @ 3D Tech"); * / glFlush (); glutSwapBuffers (); anguloCuboX + = 0.1f; anguloCuboY + = 0.1f; anguloEsfera + = 0.2f; } batili init () {glClearColor (0, 0, 0, 0); kuwezeshwa (GL_DEPTH_TEST); ancho = 500; jumla = 500; } leer leer () {ifstream myfile ("A: / Respaldo sept 2016 / D / Respaldos / Respaldo compu CICATA abril 2015 / usb1 / rekostruccion 3D en Especialidad CICATA / Software / Reconstruccion 3D / R3d_0 / bin / Debug / NuPu.txt"); ikiwa (myfile.is_open ()) {s = 0; wakati (getline (myfile, line)) {if ((line [0]! = 'N') && (line [0]! = 'F')) {Aux = line; mstari [0] = 48; mstari [1] = 48; mstari [2] = 48; mstari [3] = 48; cy [s] = atoi (mstari.c_str ()); Aux [4] = 48; Aux [5] = 48; Aux [6] = 48; // Aux [7] = 48; cx [s] = atoi (Aux.c_str ()); s ++; }} faili yangu. karibu (); } mwingine cout <1780) NP = 1700; cout <utupu wavivu () {onyesha (); } kibodi tupu (kitufe cha saini ambacho hakijasainiwa, int x, int y) {kubadili (ufunguo) {kesi 'p': kesi 'P': hazPerspectiva = 1; kuunda upya (ancho, alto); kuvunja; kesi 'o': kesi 'O': hazPerspectiva = 0; kuunda upya (ancho, alto); kuvunja; kesi 27: // kutoroka kutoka (0); kuvunja; }} raton batili (kitufe cha int, hali ya int, int x, int y) {/ * GLUT_LEFT_BUTTON 0 GLUT_MIDDLE_BUTTON 1 GLUT_RIGHT_BUTTON 2 GLUT_DOWN 0 GLUT_UP 1 * / Boton = kifungo; Pulbut = hali; // mx = y; onyesha (); } batili ratmov (int x, int y) {if ((Boton == 0) & (Pulbut == 0)) {mx = y; yangu = x; } ikiwa ((Boton == 2) & (Pulbut == 0)) {mtx = (y / 200) -1; mty = (x / 200) -1; } ikiwa ((Boton == 1) & (Pulbut == 0)) {mtz = - (y / 40) -5; } onyesha (); } int kuu (int argc, char ** argv) {/ * glutAddMenuEntry () glutAddSubMenu () glutAttachMenu () glutCreateMenu () glutSetMenu () glutStrokeCharacter () glutStrokeLength () * / / * glReadPixels () soma kizuizi cha saizi kutoka kwa saizi kutoka kwa saizi kutoka kwa saizi kutoka kwa saizi fremu bafa ya glGetPixelMapfv () rudisha ramani maalum ya pikseli glGetPixelMapuiv () rudisha ramani maalum ya pikseli glGetPointerv () Inarudisha anwani ya kiashiria kilichoainishwa. * / Init (); leer (); glutInit (& argc, argv); glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); Nafasi ya GlitInitWindow (50, 50); glutInitWindowSize (ancho, alto); GlindCreateWindow ("Cubo 1"); ndani yake(); glutDisplayFunc (onyesha); glutReshapeFunc (reshape); glutIdleFunc (wavivu); glutMouseFunc (panya); glutMotionFunc (ratmov); glutKeyboardFunc (kibodi); glutMainLoop (); kurudi 0; }

Hatua ya 5:

Picha
Picha

kwa sasa lazima nisitishe! … Lakini katika sura inayofuata nakuahidi kwamba nitaitekeleza kwenye rasipiberi yangu pi 3 au jetson nanoboard yangu, ambayo tayari imewekwa kwenye ndege zinazodhibitiwa na kijijini, au kwenye roboti ya buibui ili kuchunguza mambo ya ndani ya mapango

Ilipendekeza: