Daftar Isi:

Pemindai 3D Dasar untuk Pemetaan 3D Digital: 5 Langkah
Pemindai 3D Dasar untuk Pemetaan 3D Digital: 5 Langkah

Video: Pemindai 3D Dasar untuk Pemetaan 3D Digital: 5 Langkah

Video: Pemindai 3D Dasar untuk Pemetaan 3D Digital: 5 Langkah
Video: Obral (ilmu) 3D Scanner 2024, November
Anonim
Pemindai 3D Dasar untuk Pemetaan 3D Digital
Pemindai 3D Dasar untuk Pemetaan 3D Digital

Dalam proyek ini, saya akan menjelaskan dan menjelaskan dasar dasar pemindaian dan rekonstruksi 3D yang diterapkan terutama pada pemindaian objek semi-pesawat kecil, dan yang operasinya dapat diperluas ke sistem pemindaian dan rekonstruksi yang dapat dipasang pada pesawat kendali jarak jauh untuk memperoleh sebuah model 3D. tempat-tempat di mana pesawat terbang yang membawa mereka dipasang terbang

Ide akhirnya adalah untuk mendapatkan scan 3D dari suatu tempat atau area, baik eksterior maupun interiornya, untuk menggunakannya sebagai peta digital (seperti dalam film Prometeus)

Langkah 1:

Gambar
Gambar

idenya adalah untuk menginstal seluruh sistem pemindaian 3d pada pesawat yang dikendalikan dari jarak jauh, untuk mendigitalkan peta virtual dari area mana pun yang dilewatinya dalam 3d, tetapi untuk ini kami memulai dari awal pengoperasian metode triangulasi laser pemindaian atau rekonstruksi 3d dengan triangulasi laser pada dasarnya terdiri dari melewatkan sinar laser melalui prisma yang menghasilkan garis laser untuk mendapatkan seluruh garis laser yang akan diproyeksikan ke objek yang akan dipindai, dan setelah proyeksi laser ini diperoleh pada permukaan permukaan Dari tempat yang akan dipindai, gambar harus ditangkap dengan beberapa jenis kamera dan sebaiknya mengetahui sudut yang terbentuk sehubungan dengan sudut proyeksi garis laser yang dipancarkan, karena masing-masing gambar ini menangkap garis laser yang diproyeksikan. Pada permukaan objek, mereka akan diproses sebelumnya untuk mengekstrak karakteristik dimensi objek yang akan dipindai, dan cukup memindai strip demi strip di atas objek untuk mendapatkan profil permukaannya di segmen melintang objek tersebut, dan selanjutnya menangkap strip yang diproyeksikan dari penampang objek berikut, untuk menambahkan semua garis yang diproyeksikan bersama Sebelum semua penampang obto, kita memperoleh pemindaian tiga dimensi dari permukaannya

Langkah 2:

Gambar
Gambar

Karena kami telah mengidentifikasi tujuan kami, langkah selanjutnya mengetahui bahwa untuk lepas landas Anda harus terlebih dahulu meletakkan kaki Anda dengan kuat di tanah, jadi kami mulai di tanah dengan prototipe eksperimental pemindai 3d linier, untuk memvalidasi operasi dasar yang benar. Pemindai 3ddan seperti yang Anda lihat pada gambar di atas, saya menggunakan PC, OpenCV, Glut of OpenGL, webcam, laser, generator pertanian laser (dalam hal ini melalui cermin rotasi) sistem perpindahan linier elektronik (dibuat dengan rel dan sistem diekstraksi dari printer lama) dari pangkalan tempat saya menempatkan objek yang akan dipindai, kayu dan plastisin dan seperti yang Anda lihat di foto, di komputer: Saya berhasil membuat dan menampilkan dengan Glut dari OpenGL tiga- model dimensi yang direproduksi berdasarkan objek nyata yang dipindai (dalam hal ini laba-laba mainan)

jadi lebih dari jelas bahwa prinsip operasinya berfungsi, dan dengan penyesuaian dan adaptasinya masing-masing pada sistem terbang, ia akan dapat memindai dan mereproduksi peta 3d dari area di mana ia terbang.

Tetapi sistem ini hanya akan berfungsi untuk mendapatkan peta 3D dari permukaan luar tempat ia terbang???…

Langkah 3:

Gambar
Gambar

pemetaan interior gua dan saluran (seperti di film Prometeus)Sistem pemindaian 3D ini juga berfungsi untuk merekonstruksi model tiga dimensi interior objek besar dan berongga seperti gua, bangunan, terowongan, dll. prinsip operasinya adalah sama persis seperti yang sudah dijelaskan dan yang pada dasarnya terdiri dari:

  1. ambil foto setiap proyeksi garis laser di permukaan yang akan dipindai
  2. filter dan hapus warna dari gambar
  3. binerisasi warna dengan ambang gambar dinamis
  4. terapkan detektor tepi untuk mengenali profil yang diambil dari setiap penampang proyeksi laser
  5. dan menggunakan segmentasi pilih batas yang sesuai untuk representasi 3d dari penampang objek yang akan dipindai dan direkonstruksi pada peta 3D virtual
  6. kemudian langkah-langkah ini diulangi untuk setiap foto yang diambil dalam sub-cara garis laser yang terus menerus diproyeksikan oleh setiap sub-bagian dalam sub-bagian.
  7. lapis demi lapis representasi penampang ditambahkan berturut-turut hingga diperoleh titik awan yang terbentuk dari banyak representasi penampang objek yang akan dipetakan

Langkah 4:

Gambar
Gambar

Kemudian saya melewati program untuk pemrosesan gambar proyeksi strip laser superfisial. dan rekonstruksi 3d virtual dari representasi transversal sussive ini dalam model peta tiga dimensi yang diuraikan:

pengolahan citra:

n

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

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

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

void 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; nama[0]=f; cout<

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

cvTungguKey(0); //_execlp("calc.exe", "calc.exe", argstr, NULL); cvDestroyAllWindows(); cvReleaseImage(&gambar); cvReleaseImage(&img); cvReleaseImage(&img0); cvReleaseImage(&img1); cvReleaseImage(&img2); kembali 0; }

Rekonstruksi 3D:

#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) using namespace std; int s, Boton=1, Pulbut=1; float mx=0, my=0, mtx=0, mty=0, mtz=-5.0; const int Avance=1; garis string, Aux; karakter Karakter = 'H'; FILE *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; label char statis[100]; penyangga karakter[3]; GLfloat anguloCuboX = 0,0f; GLfloat anguloCuboY = 0,0f; GLfloat anguloEsfera = 0,0f; Jangkar GLint=500; GLint alto=500; int hazPerspektiva = 0; void reshape(int lebar, int tinggi) { glViewport(0, 0, lebar, tinggi); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if(hazPerspectiva) gluPerspective(23.0f, (GLfloat)width/(GLfloat)height, 1.0f, 20.0f); else glOrtho(-1, 1, -1, 1, -10, 10); glMatrixMode(GL_MODELVIEW); jangkar = lebar; alto = tinggi; } void Kolorear(int K) { float Hip; x=(cx[s]-320)/480; y=(cy[s]-240)/640; Pinggul=sqrt(pow(x, 2)+pow(y, 2)); if((Pinggul>=0)&&(Pinggul=.07)&&(Pinggul=.14)&&(Pinggul=.21)&&(Pinggul=.28)&&(Pinggul=.35)&&(Pinggul=.42) &&(Pinggul<=.49)){violeta;} } void drawNuPu(void) { glColor3f(1, 1, 1); glMulai(GL_LINES); glVertex3f(.2, 0, 0); glVertex3f(-.2, 0, 0); glVertex3f(0,.2, 0); glVertex3f(0, -.2, 0); glEnd(); rojo; glMulai(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); for (c=string; *c != '\0'; c++) { glutBitmapCharacter(font, *c); } } void tampilan() { //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(GLUT_BITMAP_TIMES_ROMAN_24, "Halo = 0"_24,;s<3;s++) { glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24, buffer[s]); } glTranslatef(mty, -mtx, mtz); glRotatef(mx, 1.0f, 0.0f, 0.0f); glRotatef(saya, 0.0f, 1.0f, 0.0f); drawNuPu(); /*glColor3f(1.0, 1.0, 1.0); glRasterPos2f(.5,.5); //glutBitmapString(GLUT_BITMAP_TIMES_ROMAN_24, "Halo Teks"); glutBitmapCharacter(GLUT_BITMAP_TIMES'7'ROMAN_24, ');*/ /*glWarna3f(1. 0f, 1.0f, 1.0f); setOrthographicProjection(); glPushMatrix(); glLoadIdentity(); renderBitmapString(30, 15, (void *)font, "Tutorial GLUT ---_------_@ 3D Tech");*/ glFlush(); glutSwapBuffers(); anguloCuboX+=0.1f; anguloCuboY+=0.1f; anguloEsfera+=0.2f; } void init() { glClearColor(0, 0, 0, 0); glEnable(GL_DEPTH_TEST); jangkar = 500; alto = 500; } void leer() { ifstream myfile("A:/Respaldo sept 2016/D/Respaldos/Respaldo compu CICATA abril 2015/usb1/rekostruccion 3D dan Khusus CICATA/Software/Reconstruccion 3D/R3d_0\bin/Debug/NuPu.txt"); if (filesaya.is_open()) { s=0; while(getline(file saya, baris)) { if((baris[0]!='N')&&(baris[0]!='F')) { Aux=baris; baris[0]=48; baris[1]=48; baris[2]=48; baris[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++; } } file saya.close(); } else cout <1780)NP=1700; cout< void idle() { tampilan(); } void keyboard(kunci karakter yang tidak ditandatangani, int x, int y) { switch(key) { case 'p': case 'P': hazPerspectiva=1; membentuk kembali (ancho, alto); merusak; case 'o': case 'O': hazPerspectiva=0; membentuk kembali (ancho, alto); merusak; kasus 27: // keluar dari exit(0); merusak; } } void raton(tombol int, status int, int x, int y) { /* GLUT_LEFT_BUTTON 0 GLUT_MIDDLE_BUTTON 1 GLUT_RIGHT_BUTTON 2 GLUT_DOWN 0 GLUT_UP 1 */ Boton=tombol; Pulbut = keadaan; //mx=y; menampilkan(); } void ratmov(int x, int y) { if((Boton==0)&(Pulbut==0)) { mx=y; saya=x; } if((Boton==2)&(Pulbut==0)) { mtx=(y/200)-1; mty=(x/200)-1; } if((Boton==1)&(Pulbut==0)) { mtz=-(y/40)-5; } menampilkan(); } int main(int argc, char **argv) { /*glutAddMenuEntry() glutAddSubMenu() glutAttachMenu() glutCreateMenu() glutSetMenu() glutStrokeCharacter() glutStrokeLength()*/ /*glReadPixels() membaca blok piksel dari frame buffer glGetPixelMapfv() mengembalikan peta piksel yang ditentukan glGetPixelMapuiv() mengembalikan peta piksel yang ditentukan glGetPointerv() Mengembalikan alamat pointer yang ditentukan.*/ Init(); lirik(); glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); glutInitWindowPosition(50, 50); glutInitWindowSize(ancho, alto); glutCreateWindow("Kubo 1"); init(); glutDisplayFunc(tampilan); glutReshapeFunc(membentuk ulang); glutIdleFunc(menganggur); glutMouseFunc(raton); glutMotionFunc (ratmov); glutKeyboardFunc(keyboard); glutMainLoop(); kembali 0; }

Langkah 5:

Gambar
Gambar

untuk saat ini aku harus berhenti! …tetapi di bab berikutnya saya berjanji kepada Anda bahwa saya akan menerapkannya pada raspberry pi 3 atau jetson nanoboard saya, yang sudah terpasang pada beberapa pesawat yang dikendalikan dari jarak jauh, atau pada beberapa robot laba-laba untuk memindai bagian dalam gua

Direkomendasikan: