Mundarija:

3D raqamli xaritalash uchun asosiy 3D skaner: 5 qadam
3D raqamli xaritalash uchun asosiy 3D skaner: 5 qadam

Video: 3D raqamli xaritalash uchun asosiy 3D skaner: 5 qadam

Video: 3D raqamli xaritalash uchun asosiy 3D skaner: 5 qadam
Video: First full-size scan reveals Titanic wreck as never seen before 2024, Iyun
Anonim
Raqamli 3D xaritalash uchun asosiy 3D skaner
Raqamli 3D xaritalash uchun asosiy 3D skaner

Ushbu loyihada men 3D skanerlash va rekonstruktsiya qilishning asosiy poydevorlarini tasvirlayman va tushuntiraman, bu asosan kichik yarim tekisliklarni skanerlashda qo'llaniladi va ularning ishini masofadan boshqarish plyonkalariga o'rnatish uchun skanerlash va rekonstruksiya qilish tizimlarida qo'llash mumkin. 3D model. samolyot ularni olib ketadigan joylar

Yakuniy fikr - bu har qanday joyni yoki uning tashqi yoki ichki qismini 3D -skanerdan o'tkazish, uni raqamli xarita sifatida ishlatish (Prometeus filmidagi kabi).

1 -qadam:

Rasm
Rasm

G'oya shundaki, uch o'lchovli uchadigan har qanday hududning virtual xaritasini raqamlashtirish uchun butun 3D skanerlash tizimini masofadan boshqariladigan tekislikka o'rnatish, lekin biz buni lazer uchburchagi ishlashining boshidan boshladik. Lazer uchburchagi yordamida skanerlash yoki 3D -rekonstruktsiya qilish, asosan, lazer nurini prizma orqali o'tkazishdan iborat bo'lib, u lazer chizig'ini hosil qiladi, u skaner qilinadigan ob'ektga proektsiyalanadi va bu lazer proyeksiyasi olinganidan so'ng. Yuzaki sirt Skaner qilinadigan joydan tasvirni har qanday turdagi kamera yordamida olish kerak va tercihen chiqariladigan lazer chizig'ining proektsion burchagiga nisbatan hosil bo'lgan burchakni bilish kerak, chunki bu tasvirlarning har biri proektsiyalangan lazer chiziqlarini oladi. Ob'ekt yuzasida ular skaner qilinadigan ob'ektning o'lchovli xususiyatlarini ajratib olish uchun oldindan qayta ishlanadi va ob'ektning ko'ndalang segmentida uning yuzasining profilini olish uchun ob'ekt ustidagi chiziqli chiziq bilan skanerdan o'tkaziladi. Ob'ektning barcha kesmalarini birlashtirish uchun ob'ektning keyingi kesimining proektsion chizig'i, biz uning sirtini uch o'lchovli skanerdan o'tkazamiz.

2 -qadam:

Rasm
Rasm

Biz o'z maqsadimizni aniqlaganimiz uchun, keyingi qadam, birinchi navbatda, siz oyoqlaringizni erga mahkam bog'lab qo'yishingiz kerakligini bilib, biz asosiy chiziqning to'g'ri ishlashini tekshirish uchun, chiziqli 3d skanerining tajriba prototipini ishga tushirdik. 3d skaner va yuqoridagi rasmda ko'rib turganingizdek, men kompyuter, OpenCV, Glut of OpenGL, veb -kamera, lazer, lazer fermasi generatorini (bu holatda aylanma oynadan) elektron chiziqli joy almashish tizimini (temir yo'l bilan yasalgan) ishlatardim. va eski printerdan olingan tizim), men skaner qilinadigan narsalarni, yog'och va plastilinni joylashtiradigan bazadan va fotosuratda ko'rib turganingizdek, kompyuterda: men OpenGL-dan Glut-ni ishlab chiqarishga va ko'rsatishga muvaffaq bo'ldim. o'lchovli model skaner qilingan haqiqiy ob'ektga asoslangan holda takrorlanadi (bu holda o'rgimchak o'yinchoq)

ish printsipi funktsional ekanligi va uchish tizimiga moslashtirilgan o'zgarishlar va moslamalar yordamida u uchadigan uch o'lchovli xaritani skanerlash va ko'paytirish imkoniyatiga ega bo'lishi aniq.

Ammo bu tizim faqat u uchadigan joylarning tashqi yuzasining 3D xaritalarini olish uchun xizmat qiladi ??? …

3 -qadam:

Rasm
Rasm

G'or va kanallarning ichki xaritasini (xuddi Prometeus filmidagi kabi) bu 3D skanerlash tizimi, shuningdek, g'orlar, binolar, tunnellar va boshqalar kabi katta va ichi bo'sh narsalarning ichki uch o'lchovli modellarini rekonstruksiya qilish uchun xizmat qiladi. yuqorida aytib o'tilganidek, aynan bir xil va asosan quyidagilardan iborat:

  1. skaner qilinadigan sirtdagi lazer chizig'ining har bir proektsiyasini suratga oling
  2. filtrlang va rasmdagi rangni olib tashlang
  3. rangni dinamik tasvir chegarasi bilan binarizatsiya qilish
  4. har bir lazer proektsiyasi kesimining olingan profilini tanib olish uchun chekka detektorini qo'llang
  5. va segmentatsiyadan foydalanib, virtual 3D xaritada skaner qilinadigan va rekonstruksiya qilinadigan ob'ektning kesimining 3D tasviri uchun mos chegarani tanlang.
  6. keyin bu bosqichlar har bir bo'linma tomonidan har bir bo'linma tomonidan doimiy ravishda proektsiya qilingan lazer chiziqlarining pastki uslubida olingan har bir fotosurat uchun takrorlanadi.
  7. tasavvurlar qatlamining qatlamli qatlamlari xaritaga olinadigan ob'ektning kesmalarining ko'plab tasvirlari natijasida hosil bo'lgan nuqta buluti olinmaguncha ketma -ket qo'shiladi

4 -qadam:

Rasm
Rasm

Keyin men yuzaki lazer chiziqlarining proektsiyalarini tasvirni qayta ishlash dasturlarini o'tkazaman. va ishlab chiqilgan uch o'lchovli xaritalar modelida bu ko'ndalang transvers tasvirlarning virtual 3d qayta qurilishi:

tasvirni qayta ishlash:

n

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

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

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

bo'sh 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; ism [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 bufer [33]; itoa (n, bufer, 10); fprintf (NuPu, "Fin:"); fprintf (NuPu, bufer); fprintf (NuPu, "\ n"); fclose (NuPu);

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

3D qayta qurish:

#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) nomlar maydoni yordamida std; int s, Boton = 1, Pulbut = 1; float mx = 0, mening = 0, mtx = 0, mty = 0, mtz = -5,0; const int Avance = 1; simli chiziq, Aux; char Karakter = 'H'; FILE *NuPu; int NP, h, w; float G = 0, n = 0, cx [5000], cy [5000], x, y, ax, ay, az; int shrift = (int) GLUT_BITMAP_8_BY_13; statik char yorlig'i [100]; char bufer [3]; GLfloat anguloCuboX = 0.0f; GLfloat anguloCuboY = 0.0f; GLfloat anguloEsfera = 0.0f; GLint ancho = 500; GLint alto = 500; int hazPerspectiva = 0; bo'sh shaklni o'zgartirish (int kengligi, int balandligi) {glViewport (0, 0, kenglik, balandlik); glMatrixMode (GL_PROJECTION); glLoadIdentity (); if (hazPerspectiva) gluPerspective (23.0f, (GLfloat) eni/(GLfloat) balandligi, 1.0f, 20.0f); boshqa glOrtho (-1, 1, -1, 1, -10, 10); glMatrixMode (GL_MODELVIEW); burchak = kenglik; alto = balandlik; } bo'sh Kolorear (int K) {float Hip; x = (cx [s] -320)/480; y = (cy [s] -240)/640; Hip = sqrt (pow (x, 2)+pow (y, 2)); agar ((Hip> = 0) && (Hip =.07) && (Hip =.14) && (Hip =.21) && (Hip =.28) && (Hip =.35) && (Hip =.42) && (Hip <=. 49)) {violeta}}} drawNuPu bekor (bekor) {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);} vender renderBitmapString (float x, float y, void *shrift, char *string) {char *c; glRasterPos2f (x, y); (c = string; *c! = '\ 0'; c ++) {glutBitmapCharacter (shrift, *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); s <3; s ++) {glutBitmapCharacter (GLUT_BITMAP_TIMES_ROMAN_24, bufer [s]);} glTranslatef (mty, -mtx, mtz); glRotatef (mx, 1.0f, 0.0f, 0.0f); 1.0F, 0.0f); drawNuPu (); /*glColor3f (1.0, 1.0, 1.0); glRasterPos2f (.5,.5); // glutBitmapString (GLUT_BITMAP_TIMES_ROMAN_24, "Salom matn"); glutBitmapCARIT 'GLUT_ * / /*glColor3f (1. 0f, 1.0f, 1.0f); setOrthographicProjection (); glPushMatrix (); glLoadIdentity (); renderBitmapString (30, 15, (void *) shrift, "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); ancho = 500; pastki = 500; } void leer () {ifstream myfile ("A:/Respaldo sept 2016/D/Respaldos/Respaldo compu CICATA abril 2015/usb1/rekostruccion 3D va CICATA/Software/Reconstruccion 3D/R3d_0 / bin/Debug/NuPu.txt")); agar (myfile.is_open ()) {s = 0; while (getline (myfile, line)) {if ((line [0]! = 'N') && (line [0]! = 'F')) {Aux = chiziq; qator [0] = 48; qator [1] = 48; qator [2] = 48; qator [3] = 48; cy [s] = atoi (line.c_str ()); Aux [4] = 48; Aux [5] = 48; Aux [6] = 48; // Yordamchi [7] = 48; cx [s] = atoi (Aux.c_str ()); s ++; }} myfile.close (); } else cout <1780) NP = 1700; cout <void bo'sh () {ko'rsatish (); } bo'sh klaviatura (belgisiz char tugmachasi, int x, int y) {switch (key) {case 'p': case 'P': hazPerspectiva = 1; qayta shakllantirish (ancho, alto); tanaffus; holat 'o': holat 'O': hazPerspectiva = 0; qayta shakllantirish (ancho, alto); tanaffus; ish 27: // qochish chiqishi (0); tanaffus; }} void raton (int tugmasi, int holati, int x, int y) { / * GLUT_LEFT_BUTTON 0 GLUT_MIDDLE_BUTTON 1 GLUT_RIGHT_BUTTON 2 GLUT_DOWN 0 GLUT_UP 1 * / Boton = tugmasi; Pulbut = davlat; // mx = y; ko'rsatish (); } void ratmov (int x, int y) {if ((Boton == 0) & (Pulbut == 0)) {mx = y; mening = x; } if ((Boton == 2) & (Pulbut == 0)) {mtx = (y/200) -1; mty = (x/200) -1; } agar ((Boton == 1) & (Pulbut == 0)) {mtz =-(y/40) -5; } ko'rsatish (); } int main (int argc, char ** argv) { /*glutAddMenuEntry () glutAddSubMenu () glutAttachMenu () glutCreateMenu () glutSetMenu () glutStrokeCharacter () glutStrokeLength ()* / /*glReadPixellardan ramka buferi glGetPixelMapfv () belgilangan piksel xaritasini qaytaradi glGetPixelMapuiv () belgilangan piksel xaritasini qaytaradi glGetPointerv () Belgilangan ko'rsatgich manzilini qaytaradi.*/ Init (); leer (); glutInit (& argc, argv); glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); glutInitWindowPosition (50, 50); glutInitWindowSize (qarang, baland); glutCreateWindow ("Cubo 1"); boshlang'ich (); glutDisplayFunc (ko'rsatish); glutReshapeFunc (qayta shakllantirish); glutIdleFunc (bo'sh); glutMouseFunc (raton); glutMotionFunc (ratmov); glutKeyboardFunc (klaviatura); glutMainLoop (); qaytarish 0; }

5 -qadam:

Rasm
Rasm

hozircha to'xtashim kerak! … lekin keyingi bobda men sizga va'da beramanki, men uni malina pi 3 yoki jetsonli nanoboardimda, uzoqdan boshqariladigan samolyotlarga yoki g'orlarning ichki qismini skanerlash uchun o'rgimchak robotga o'rnataman.

Tavsiya: