Mündəricat:

Rəqəmsal 3D Xəritəçəkmə üçün Əsas 3D Skaner: 5 Addım
Rəqəmsal 3D Xəritəçəkmə üçün Əsas 3D Skaner: 5 Addım

Video: Rəqəmsal 3D Xəritəçəkmə üçün Əsas 3D Skaner: 5 Addım

Video: Rəqəmsal 3D Xəritəçəkmə üçün Əsas 3D Skaner: 5 Addım
Video: 20 товаров для автомобиля с Алиэкспресс, автотовары №29 2024, Dekabr
Anonim
Rəqəmsal 3D Xəritəçəkmə üçün Əsas 3D Skaner
Rəqəmsal 3D Xəritəçəkmə üçün Əsas 3D Skaner

Bu layihədə, əsasən kiçik yarı müstəvili obyektlərin taranması üçün tətbiq olunan və istismarı uzaqdan idarə olunan təyyarələrdə quraşdırıla bilən tarama və rekonstruksiya sistemlərində tətbiq oluna bilən 3D tarama və yenidən qurmanın əsas əsaslarını təsvir edəcəyəm və izah edəcəyəm. 3D model. onları götürən təyyarənin uçduğu yerlərdən

Son fikir, hər hansı bir yerin və ya ərazinin, istər xarici, istərsə də daxili bir rəqəmsal xəritə olaraq istifadə etmək üçün 3D tarama əldə etməkdir (Prometeus filmindəki kimi).

Addım 1:

Şəkil
Şəkil

Fikir, 3d-də uçduğu hər hansı bir sahənin virtual xəritəsini rəqəmsal hala gətirmək üçün bütün 3d tarama sistemini uzaqdan idarə olunan bir təyyarəyə quraşdırmaqdır, ancaq bunun üçün lazer üçbucaqlı əməliyyatın başlanğıcından başladıq. Lazer üçbucağı ilə tarama və ya 3d yenidən qurma, əsasən taranacaq bir obyektə yansıtılacaq bütün lazer şeridi əldə etmək üçün bir lazer şeridi yaradan bir prizma boyunca bir lazer şüasının keçməsindən ibarətdir və bu lazer proyeksiyası əldə edildikdən sonra səth səthi Taranacaq yerdən, bir növ kamera ilə çəkilməli və tercihen yayılan lazer şeridinin proyeksiya bucağına görə yaranan bucağı bilməklə çəkilməlidir, çünki bu görüntülərin hər biri proqnozlaşdırılan lazer şeritlərini tutur. Obyektin səthində, taranacaq obyektin ölçülü xüsusiyyətlərini çıxarmaq üçün əvvəlcədən işlənəcək və sadəcə obyektin o eninə seqmentində səthinin profilini əldə etmək üçün cismin üstündəki zolaqla şeridi tarayacaq və sonra tutacaqlar. Obyektin bütün kəsiklərindən əvvəl, obyektin aşağıdakı kəsişməsinin proyeksiyalı zolağı, obtonun bütün kəsiklərindən əvvəl onun səthinin üçölçülü taramasını əldə edirik.

Addım 2:

Şəkil
Şəkil

Məqsədimizi təyin etdiyimiz üçün, havaya qalxmaq üçün əvvəlcə ayaqlarınızın yerə möhkəm oturması lazım olduğunu bildiyiniz üçün növbəti addım, təməlin düzgün işlədiyini yoxlamaq üçün xətti 3d skanerin təcrübi prototipi ilə yerə başladıq. 3d skaner və yuxarıdakı şəkildə gördüyünüz kimi, PC, OpenCV, Glut of OpenGL, veb kamera, lazer, lazer təsərrüfatı generatoru (bu halda fırlanan güzgü vasitəsilə) elektron xətti yerdəyişmə sistemindən (dəmir yolu ilə hazırlanmış) istifadə etdim. və köhnə bir printerdən çıxarılan sistem) taranacaq obyektləri, ağac və plastilini yerləşdirdiyim bir bazadan və fotoda gördüyünüz kimi kompüterdə: OpenGL-dən Glut ilə üç skan edilmiş həqiqi obyektə əsaslanaraq istehsal olunan ölçülü model (bu halda oyuncaq hörümçək)

iş prinsipinin işlək olduğu və uçan sistemə uyğun tənzimləmələri və uyğunlaşmaları ilə uçduğu ərazinin 3 ölçülü xəritəsini skan edə və çoxalda biləcəyi aydındır.

Ancaq bu sistem yalnız uçduğu yerlərin xarici səthinin 3D xəritələrini əldə etməyə xidmət edəcək ???…

Addım 3:

Şəkil
Şəkil

Mağaraların və kanalların içərisinin xəritələndirilməsi (eynilə Prometeus filmindəki kimi) Bu 3D tarama sistemi həm də mağaralar, binalar, tunellər və s. yuxarıda təsvir edildiyi kimi eyni və əsasən aşağıdakılardan ibarətdir:

  1. taranacaq səthdə lazer şeridinin hər bir proyeksiyasının şəklini çəkin
  2. süzün və şəkildəki rəngi silin
  3. rəngi dinamik görüntü eşikiylə ikiqatlaşdırın
  4. Hər bir lazer proyeksiyasının kəsilmiş hissəsinin çəkilmiş profilini tanımaq üçün bir kənar detektor tətbiq edin
  5. və seqmentləşdirmədən istifadə edərək, virtual 3D xəritədə taranacaq və yenidən qurulacaq obyektin o kəsiyinin 3d təsviri üçün uyğun sərhəd seçin.
  6. sonra bu addımlar, alt hissədə hər bir alt bölmə tərəfindən davamlı olaraq yansıtılan lazer şeritlərinin bir alt tərzində çəkilən hər bir fotoşəkil üçün təkrarlanır.
  7. Xəritələnəcək obyektin kəsişmələrinin bir çox təmsilçiliyindən əmələ gələn bir nöqtə buludu alınana qədər kəsişmələrin təqdimatı qat -qat artırılır

Addım 4:

Şəkil
Şəkil

Sonra səthi lazer şeritlərinin proyeksiyalarının görüntü işlənməsi proqramlarını keçirəm. və işlənmiş üçölçülü xəritə modelində bu sussive transversal təsvirlərin virtual 3d yenidən qurulması:

görüntü emalı:

n

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

char f = 0; char adı = {"0.jpg"}; int n = 0, s, x, y; CvScalar sp; DOSYA *NuPu;

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

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

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

IplImage* img0 = cvLoadImage ("00.jpg", 0); if (f == '0') {for (y = 1; yheight-2; y ++) {for (x = 1; xwidth-2; x ++) {sp = cvGet2D (img0, y, x); if (sp.val [0]> 50) {Writepoints (); n ++;}}}} else {for (y = 1; yheight-2; y ++) {for (x = 1; xwidth-2; x ++) { sp = cvGet2D (img1, y, x); if (sp.val [0]> 50) {Writepoints (); n ++;}}}} char tamponu [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 (& şəkil); cvReleaseImage (& img); cvReleaseImage (& img0); cvReleaseImage (& img1); cvReleaseImage (& img2); qaytarma 0; }

3D yenidən qurulması:

#include //////////////////ifdef _APPLE_ #include #else #include #include #endif #include #include #include #include #include #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) ad boşluğundan istifadə edərək std; int s, Boton = 1, Pulbut = 1; float mx = 0, my = 0, mtx = 0, mty = 0, mtz = -5.0; const int Avance = 1; simli xətt, Aux; char Karakter = 'H'; DOSYA *NuPu; int NP, h, w; float G = 0, n = 0, cx [5000], cy [5000], x, y, ax, ay, az; int font = (int) GLUT_BITMAP_8_BY_13; statik sim işarəsi [100]; char tamponu [3]; GLfloat anguloCuboX = 0.0f; GLfloat anguloCuboY = 0.0f; GLfloat anguloEsfera = 0.0f; GLint çapa = 500; GLint alto = 500; int hazPerspectiva = 0; boş formatı (int genişliyi, int hündürlüyü) {glViewport (0, 0, en, hündürlük); glMatrixMode (GL_PROJECTION); glLoadIdentity (); əgər (hazPerspectiva) gluPerspective (23.0f, (GLfloat) eni/(GLfloat) hündürlüyü, 1.0f, 20.0f); başqa glOrtho (-1, 1, -1, 1, -10, 10); glMatrixMode (GL_MODELVIEW); çapa = en; alto = yüksəklik; } boş Kolorear (int K) {float Hip; x = (cx [s] -320)/480; y = (cy [s] -240)/640; Kalça = sqrt (pow (x, 2)+pow (y, 2)); əgər ((Kalça> = 0) && (Kalça =.07) && (Kalça =.14) && (Kalça =.21) && (Kalça =.28) && (Kalça =.35) && (Kalça =.42) && (Kalça <=. 49)) {bənövşə;}} boşluq DrawNuPu (boşluq) {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); 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); (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 (GL_TM_GER_TM_TM_GT_G_U_24); s <3; s ++) {glutBitmapCharacter (GLUT_BITMAP_TIMES_ROMAN_24, tampon [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, "Salam Mətn"); glutBitmapCARIT 'GLUT_);* / /*glColor3f (1. 0f, 1.0f, 1.0f); setOrthographicProjection (); glPushMatrix (); glLoadIdentity (); renderBitmapString (30, 15, (void *) font, "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); çapa = 500; alt=500; } void 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")); əgər (myfile.is_open ()) {s = 0; while (getline (myfile, line)) {if ((line [0]! = 'N') && (line [0]! = 'F')) {Aux = xətt; xətt [0] = 48; xətt [1] = 48; xətt [2] = 48; xətt [3] = 48; cy [s] = atoi (line.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 (); } boş klaviatura (işarəsiz char düyməsi, int x, int y) {switch (key) {case 'p': case 'P': hazPerspectiva = 1; yenidən formalaşdırmaq (çapa, alt); fasilə; hal 'o': hal 'O': hazPerspectiva = 0; yenidən formalaşdırmaq (çapa, alt); fasilə; dava 27: // qaçış çıxışı (0); fasilə; }} void raton (int düyməsi, int vəziyyəti, int x, int y) { / * GLUT_LEFT_BUTTON 0 GLUT_MIDDLE_BUTTON 1 GLUT_RIGHT_BUTTON 2 GLUT_DOWN 0 GLUT_UP 1 * / Boton = düyməsi; Pulbut = dövlət; // mx = y; ekran (); } etibarsız ratmov (int x, int y) {if ((Boton == 0) & (Pulbut == 0)) {mx = y; mənim = x; } if ((Boton == 2) & (Pulbut == 0)) {mtx = (y/200) -1; mty = (x/200) -1; } əgər ((Boton == 1) & (Pulbut == 0)) {mtz =-(y/40) -5; } ekran (); } int main (int argc, char ** argv) { /*glutAddMenuEntry () glutAddSubMenu () glutAttachMenu () glutCreateMenu () glutSetMenu () glutStrokeCharacter () glutStrokeLength ()* / /glReadPixels -dən) çərçivə tamponu glGetPixelMapfv () göstərilən piksel xəritəsini qaytar glGetPixelMapuiv () göstərilən piksel xəritəsini qaytar glGetPointerv () Göstərilən göstəricinin ünvanını qaytarır.*/ Init (); leer (); glutInit (& argc, argv); glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); glutInitWindowPosition (50, 50); glutInitWindowSize (çapa, alt); glutCreateWindow ("Cubo 1"); içində(); glutDisplayFunc (ekran); glutReshapeFunc (yenidən formalaşdır); glutIdleFunc (boş); glutMouseFunc (raton); glutMotionFunc (ratmov); glutKeyboardFunc (klaviatura); glutMainLoop (); qaytarma 0; }

Addım 5:

Şəkil
Şəkil

bu an dayanmalıyam! … Lakin növbəti fəsildə sizə söz verirəm ki, bunu moruq pi 3-də və ya uzaqdan idarə olunan təyyarələrdə və ya mağaraların içini taramaq üçün hörümçək robotunda quraşdırılmış jetson nanobordumda tətbiq edəcəyəm.

Tövsiyə: