Daftar Isi:
Video: Pemindai 3D Dasar untuk Pemetaan 3D Digital: 5 Langkah
2024 Pengarang: John Day | [email protected]. Terakhir diubah: 2024-01-30 09:54
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:
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:
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:
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:
- ambil foto setiap proyeksi garis laser di permukaan yang akan dipindai
- filter dan hapus warna dari gambar
- binerisasi warna dengan ambang gambar dinamis
- terapkan detektor tepi untuk mengenali profil yang diambil dari setiap penampang proyeksi laser
- dan menggunakan segmentasi pilih batas yang sesuai untuk representasi 3d dari penampang objek yang akan dipindai dan direkonstruksi pada peta 3D virtual
- 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.
lapis demi lapis representasi penampang ditambahkan berturut-turut hingga diperoleh titik awan yang terbentuk dari banyak representasi penampang objek yang akan dipetakan
Langkah 4:
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:
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:
Komponen Pemasangan Permukaan Solder - Dasar-dasar Solder: 9 Langkah (dengan Gambar)
Komponen Pemasangan Permukaan Solder | Dasar-dasar Solder: Sejauh ini dalam Seri Dasar Solder saya, saya telah membahas dasar-dasar yang cukup tentang penyolderan untuk Anda mulai berlatih. Dalam Instructable ini, apa yang akan saya diskusikan sedikit lebih maju, tetapi ini adalah beberapa dasar untuk menyolder Surface Mount Compo
Menyolder Kabel ke Kabel - Dasar-dasar Solder: 11 Langkah
Menyolder Kabel ke Kabel | Dasar-dasar Solder: Untuk Instruksi ini, saya akan membahas cara umum untuk menyolder kabel ke kabel lain. Saya akan berasumsi bahwa Anda telah memeriksa 2 Instructables pertama untuk seri Soldering Basics saya. Jika Anda belum melihat Instruksi saya tentang Menggunakan
Dasar-Dasar Perangkat Lunak Bordir Digital Sewart: 4 Langkah
Dasar-dasar Perangkat Lunak Bordir Digital Sewart: Menggunakan perangkat lunak bordir digital mungkin tampak menakutkan dan membuat frustrasi pada awalnya, tetapi dengan beberapa latihan dan kesabaran dan panduan praktis SUPER ini, Anda akan menjadi master dalam waktu singkat. Panduan ini akan fokus pada penggunaan perangkat lunak, SewArt Embroidery Digitize
Dasar-dasar Mikro:bit untuk Guru Bagian 1 - Perangkat Keras: 8 Langkah
Dasar-dasar Mikro:bit untuk Guru Bagian 1 - Perangkat Keras: Apakah Anda seorang guru yang ingin menggunakan mikro:bit di kelas Anda, tetapi tidak tahu harus mulai dari mana? Kami akan menunjukkan caranya
Dasar-dasar Breadboard untuk Pemula Mutlak: 10 Langkah (dengan Gambar)
Dasar-dasar Breadboard untuk Pemula Mutlak: Tujuan dari instruksi ini bukan untuk memberi Anda panduan lengkap tentang papan tempat memotong roti, tetapi untuk menunjukkan dasar-dasarnya, dan setelah dasar-dasar ini dipelajari, Anda cukup tahu semua yang Anda butuhkan, jadi saya rasa Anda bisa menyebutnya lengkap panduan tetapi dalam arti yang berbeda. Setiap