Mündəricat:
Video: Rəqəmsal 3D Xəritəçəkmə üçün Əsas 3D Skaner: 5 Addım
2024 Müəllif: John Day | [email protected]. Son dəyişdirildi: 2024-01-30 07:44
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:
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:
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:
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:
- taranacaq səthdə lazer şeridinin hər bir proyeksiyasının şəklini çəkin
- süzün və şəkildəki rəngi silin
- rəngi dinamik görüntü eşikiylə ikiqatlaşdırın
- Hər bir lazer proyeksiyasının kəsilmiş hissəsinin çəkilmiş profilini tanımaq üçün bir kənar detektor tətbiq edin
- 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.
- 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.
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:
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:
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ə:
Xəritəçəkmə göstərişləri: 3 addım
Xəritəçəkmə haqqında göstərişlər: Hansı fəaliyyətiniz olursa olsun, gəzinti, yürüyüş, velosiped sürmək və ya hətta avtomobil sürmək olsun, aldığınız marşrutları qeyd edə bilərsiniz. Sonra bu yolları dostlarınız və ailənizlə paylaşa bilərsiniz. Əlavə olaraq, qeyd edə biləcəyiniz hər hansı bir fotoşəkilə yer əlavə etmək üçün qeyd olunan marşrutdan istifadə edə bilərsiniz
PC Oyun Nəzarətçisi Xəritəçəkmə (Linux və Windows): 5 addım
PC Oyun Nəzarətçisinin Xəritəçəkməsi (Linux və Windows): Fərdi kompüterdə oyun sahəsinə başlamısınızsa, ora çatmaq üçün bir neçə addımınız ola bilər. Bu gün sizə ən köhnə PC oyunları ilə pulsuz olaraq bir USB oyun idarəedicisini necə istifadə edəcəyinizi göstərəcəyəm. Texnika
Mappifier - Xəritəçəkmə + Bildiriş Sistemi: 9 Addım
Mappifier - Xəritəçəkmə + Bildiriş Sistemi: Gecə sürmək olduqca əyləncəlidir. Ancaq tez -tez, yolu keçən heyvanlar şəklində bir kabus olduğu ortaya çıxır (xüsusən də keçmək üçün yaxınlıqda maşın sürməyinizi gözləyən sahibsiz pişiklər və itlər !!). Buna görə də belə etməyi düşündüm
Análogo Xəritəçəkmə: Manual Mascarilla De Proyector: 14 Addım
Xəritəçəkmə: Manual Mascarilla De Proyector: Para və eacute; bir á loqotipini xəritələmək? Düzgün düzbucaqlı formatlarda hacer istifadə etmək olarmı? Əlbətdə ki, heç bir problem yoxdur; təsəvvür edilməyən düzbucaqlı (dəniz luz negra y que en
Pi Cap ilə Projeksiyon Xəritəçəkmə necə edilir: 9 addım (şəkillərlə)
Pi Cap ilə Projeksiyon Xəritəçəkmə necə edilir: Biz layihələrinizdən ilham aldıq və Pi Cap istifadə edərək proyeksiya xəritələşdirmə dərsliyi yaratdıq. Layihənizin WiFi üzərindən simsiz işləməsini istəyirsinizsə, bu sizin üçün bir təlimatdır. MadMapper -dən proyeksiya Xəritəçəkmə proqramı olaraq istifadə etdik