Mundarija:
Video: 3D raqamli xaritalash uchun asosiy 3D skaner: 5 qadam
2024 Muallif: John Day | [email protected]. Oxirgi o'zgartirilgan: 2024-01-30 13:24
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:
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:
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:
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:
- skaner qilinadigan sirtdagi lazer chizig'ining har bir proektsiyasini suratga oling
- filtrlang va rasmdagi rangni olib tashlang
- rangni dinamik tasvir chegarasi bilan binarizatsiya qilish
- har bir lazer proektsiyasi kesimining olingan profilini tanib olish uchun chekka detektorini qo'llang
- va segmentatsiyadan foydalanib, virtual 3D xaritada skaner qilinadigan va rekonstruksiya qilinadigan ob'ektning kesimining 3D tasviri uchun mos chegarani tanlang.
- 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.
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:
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:
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:
Asosiy ma'lumotlarga qaytish: Bolalar uchun lehim: 6 qadam (rasmlar bilan)
Asosiy ma'lumotlarga qaytish: Bolalar uchun lehim: Siz robot qurayapsizmi yoki Arduino bilan ishlaysizmi, "qo'l bilan" shaklini tuzing. elektronika, qanday qilib lehim qilishni bilish, loyiha g'oyasini prototiplashga yordam beradi. Agar kimdir chindan ham elektr bilan shug'ullansa, lehimlashni o'rganish juda muhim mahoratdir
Mappifier - xaritalash + bildirishnoma tizimi: 9 qadam
Mappifier - Mapping + Xabarnoma tizimi: Kechasi haydash juda qiziqarli. Ammo tez -tez, bu yo'lni kesib o'tayotgan hayvonlar ko'rinishidagi dahshatli tush bo'lib chiqadi (ayniqsa, ular sizning yoningizdan haydab o'tishingizni kutib turgan adashgan mushuk va itlar !!). Shunday qilib, men shunday qilishni o'yladim
Raqamli va ikkilik soat 8 raqamli X 7 segmentli LED displeyda: 4 qadam (rasmlar bilan)
Raqamli va ikkilik soat 8 ta raqamli X 7 segmentli LED displeyda: Bu mening raqamli & 8 dyuymli x 7 segmentli LED displey yordamida ikkilik soat. Men odatiy qurilmalar, xususan, soatlar uchun yangi xususiyatlar berishni yaxshi ko'raman va bu holda ikkilik soat uchun 7 segmentli displeydan foydalanish noan'anaviy va
Robotika: Rover 5 -ning asosiy versiyasi, robotning asosiy bosqichi: 18 qadam (rasmlar bilan)
Robotika: Rover 5 -ning eng yaxshi robotlari:
Lazerli skaner ma'lumotlarini tozalash va yig'ish uchun Meshlab -dan foydalanish: 8 qadam
Meshlab -dan lazerli skanerlash ma'lumotlarini tozalash va yig'ish uchun foydalanish: Meshlab - bu tarmoq ma'lumotlarini o'zgartirish va tahrirlash uchun ishlatiladigan ochiq kodli dastur. Ushbu qo'llanmada 3D lazerli skanerdan ma'lumotlarni qanday yig'ish, tozalash va rekonstruksiya qilish ko'rsatiladi. Bu erda ishlatiladigan skanerda qo'llaniladigan usullar kerak