Isi kandungan:

Pengimbas 3D Asas untuk Pemetaan 3D Digital: 5 Langkah
Pengimbas 3D Asas untuk Pemetaan 3D Digital: 5 Langkah

Video: Pengimbas 3D Asas untuk Pemetaan 3D Digital: 5 Langkah

Video: Pengimbas 3D Asas untuk Pemetaan 3D Digital: 5 Langkah
Video: xray body scaner camera application 2024, September
Anonim
Pengimbas 3D Asas untuk Pemetaan 3D Digital
Pengimbas 3D Asas untuk Pemetaan 3D Digital

Dalam projek ini, saya akan menerangkan dan menjelaskan asas-asas asas pengimbasan dan pembinaan semula 3D yang digunakan terutamanya untuk pengimbasan objek separa satah kecil, dan yang operasinya dapat diperluas ke sistem pengimbasan dan pembinaan semula yang dapat dipasang pada pesawat kawalan jauh untuk mendapatkan model 3D. tempat di mana kapal terbang yang membawa mereka dipasang terbang

Idea terakhir adalah untuk mendapatkan imbasan 3D dari beberapa tempat atau kawasan, sama ada luaran atau dalamannya, untuk menggunakannya sebagai peta digital (seperti dalam filem Prometeus)

Langkah 1:

Imej
Imej

idenya adalah untuk memasang keseluruhan sistem pengimbasan 3d pada pesawat kawalan jauh, untuk mendigitalkan peta maya dari mana-mana kawasan di mana ia terbang dalam bentuk 3d, tetapi untuk ini kami bermula dari permulaan operasi triangulasi laser kaedah pengimbasan atau rekonstruksi 3d dengan triangulasi laser pada asasnya terdiri daripada menyebarkan sinar laser melalui prisma yang menghasilkan jalur laser untuk mendapatkan keseluruhan jalur laser yang akan diproyeksikan ke objek yang akan diimbas, dan setelah unjuran laser ini diperoleh pada permukaan permukaan Dari tempat untuk mengimbas, gambar mesti diambil dengan beberapa jenis kamera dan lebih baik mengetahui sudut yang terbentuk berkenaan dengan sudut unjuran jalur laser yang dipancarkan, kerana setiap gambar ini menangkap jalur laser yang diproyeksikan. Pada permukaan objek, mereka akan diproses terlebih dahulu untuk mengekstrak ciri dimensi objek yang akan diimbas, dan hanya mengimbas jalur demi jalur di atas objek untuk mendapatkan profil permukaannya di segmen melintang objek itu, dan kemudian menangkap jalur yang diproyeksikan dari keratan rentas berikut objek, untuk menambahkan semua jalur yang diproyeksikan bersama Sebelum semua keratan rentas obto kita memperoleh imbasan tiga dimensi permukaannya

Langkah 2:

Imej
Imej

Oleh kerana kami telah mengenal pasti objektif kami, langkah seterusnya dengan mengetahui bahawa untuk melepaskan diri, pertama-tama anda mesti meletakkan kaki anda dengan kuat di atas tanah, jadi kami memulakannya dengan menggunakan prototaip eksperimental pengimbas 3d linear, untuk mengesahkan operasi asas yang betul Pengimbas 3d dan seperti yang anda lihat dalam gambar di atas, saya menggunakan PC, OpenCV, Glut of OpenGL, kamera web, laser, penjana ladang laser (dalam kes ini melalui cermin putaran) sistem perpindahan linear elektronik (dibuat dengan rel dan sistem yang diekstrak dari pencetak lama) dari pangkalan tempat saya meletakkan objek yang akan diimbas, kayu dan plastik dan seperti yang anda lihat dalam foto, di komputer: Saya berjaya menghasilkan dan memaparkan dengan Glut dari OpenGL tiga- model dimensi dihasilkan semula berdasarkan objek sebenar yang diimbas (dalam hal ini adalah labah-labah mainan)

jadi lebih jelas bahawa prinsip operasi berfungsi, dan dengan penyesuaian dan penyesuaian masing-masing ke sistem terbang, ia akan dapat mengimbas dan menghasilkan semula peta 3d kawasan di mana ia terbang.

Tetapi sistem ini hanya berfungsi untuk mendapatkan peta 3D permukaan luaran tempat yang dilaluinya ???…

Langkah 3:

Imej
Imej

memetakan bahagian dalam gua dan saluran (seperti dalam filem Prometeus) Sistem pengimbasan 3D ini juga berfungsi untuk membina semula model tiga dimensi dalaman objek besar dan berongga seperti gua, bangunan, terowong, dll. prinsip operasinya adalah sama seperti yang telah dijelaskan dan yang pada asasnya terdiri daripada yang berikut:

  1. tangkap gambar setiap unjuran jalur laser di permukaan yang akan diimbas
  2. tapis dan keluarkan warna dari gambar
  3. binari warna dengan ambang gambar dinamik
  4. sapukan alat pengesan tepi untuk mengenali profil yang ditangkap pada setiap keratan unjuran laser
  5. dan menggunakan segmentasi pilih sempadan yang sesuai untuk representasi 3d dari bahagian silang objek yang akan diimbas dan dibina semula pada peta 3D maya
  6. maka langkah-langkah ini hanya diulang untuk setiap foto yang diambil dengan cara laser jalur yang diproyeksikan secara berterusan oleh setiap sub-bahagian dalam sub-bahagian.
  7. lapisan demi lapisan representasi keratan rentas ditambahkan berturut-turut sehingga memperoleh titik titik yang dibentuk oleh banyak representasi penampang dari objek yang akan dipetakan

Langkah 4:

Imej
Imej

Kemudian saya lulus program untuk memproses gambar unjuran jalur laser dangkal. dan pembinaan semula 3d maya dari perwakilan melintang ini dalam model peta tiga dimensi yang terperinci:

pemprosesan imej:

n

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

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

batal Titik Writ () {char bufferx [33], buffer [33]; itoa (x, bufferx, 10); itoa (y, buffery, 10); fprintf (NuPu, bufferx); fprintf (NuPu, "\ t"); fprintf (NuPu, penyangga); fprintf (NuPu, "\ n"); }

batal noteblockInit () {NuPu = fopen ("NuPu.txt", "w"); fseek (NuPu, 0, 0); fprintf (NuPu, "NP:"); fprintf (NuPu, "\ n"); }

int utama () {char argstr [128]; noteblockInit (); cout << "Teklea!…:" f; nama [0] = f; cout <

IplImage * img0 = cvLoadImage ("00.jpg", 0); jika (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 ++;}}}} lain {untuk (y = 1; yheight-2; y ++) {untuk (x = 1; xwidth-2; x ++) { sp = cvGet2D (img1, y, x); if (sp.val [0]> 50) {Writepoints (); n ++;}}}} penampan char [33]; itoa (n, penyangga, 10); fprintf (NuPu, "Sirip:"); fprintf (NuPu, penyangga); fprintf (NuPu, "\ n"); fclose (NuPu);

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

Pembinaan semula 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) menggunakan ruang nama std; int s, Boton = 1, Pulbut = 1; apungan mx = 0, my = 0, mtx = 0, mty = 0, mtz = -5.0; const int Avance = 1; garis rentetan, Aux; char Caraker = 'H'; FILE * NuPu; int NP, h, w; terapung G = 0, n = 0, cx [5000], cy [5000], x, y, ax, ay, az; int font = (int) GLUT_BITMAP_8_BY_13; label char statik [100]; penampan char [3]; GLfloat anguloCuboX = 0.0f; GLfloat anguloCuboY = 0.0f; GLfloat anguloEsfera = 0.0f; GLint ancho = 500; GLint alto = 500; int hazPerspectiva = 0; bentuk semula kosong (lebar int, tinggi int) {glViewport (0, 0, lebar, tinggi); glMatrixMode (GL_PROJECTION); glLoadIdentity (); jika (hazPerspectiva) gluPerspektif (23.0f, (GLfloat) lebar / (GLfloat) tinggi, 1.0f, 20.0f); lain-lain glOrtho (-1, 1, -1, 1, -10, 10); glMatrixMode (GL_MODELVIEW); ancho = lebar; alto = tinggi; } batal Kolorear (int K) {float Hip; x = (cx [s] -320) / 480; y = (cy [s] -240) / 640; Hip = sqrt (pow (x, 2) + pow (y, 2)); jika ((Hip> = 0) && (Hip =.07) && (Hip =.14) && (Hip =.21) && (Hip =.28) && (Hip =.35) && (Hip =.42) && (Hip <=. 49)) {violeta;}} batal drawNuPu (void) {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); untuk (n = 0; n <10; n ++) {untuk (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);} kosongkan renderBitmapString (float x, float y, void * font, char * string) {char * c; glRasterPos2f (x, y); untuk (c = string; * c! = '\ 0'; c ++) {glutBitmapCharacter (font, * c);}} paparan kosong () {// 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); s <3; s ++) {glutBitmapCharacter (GLUT_BITMAP_TIMES_ROMAN_24, buffer [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, "Hello Text"); glutBitmapCharacter (7)); * / / * 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; } init kosong () {glClearColor (0, 0, 0, 0); glEnable (GL_DEPTH_TEST); ancho = 500; alto = 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"); jika (myfile.is_open ()) {s = 0; while (getline (myfile, line)) {if ((baris [0]! = 'N') && (baris [0]! = 'F')) {Aux = baris; garis [0] = 48; garis [1] = 48; garis [2] = 48; garis [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 (); } lain cout <1780) NP = 1700; cout <void idle () {paparan (); } kekosongan papan kekunci (kekunci char yang tidak ditandatangani, int x, int y) {suis (kunci) {case 'p': case 'P': hazPerspectiva = 1; membentuk semula (ancho, alto); rehat; kes 'o': kes 'O': hazPerspectiva = 0; membentuk semula (ancho, alto); rehat; kes 27: // jalan keluar (0); rehat; }} void raton (butang int, keadaan int, int x, int y) {/ * GLUT_LEFT_BUTTON 0 GLUT_MIDDLE_BUTTON 1 GLUT_RIGHT_BUTTON 2 GLUT_DOWN 0 GLUT_UP 1 * / butang = Boton; Pulbut = keadaan; // mx = y; paparan (); } void ratmov (int x, int y) {if ((Boton == 0) & (Pulbut == 0)) {mx = y; my = x; } jika ((Boton == 2) & (Pulbut == 0)) {mtx = (y / 200) -1; mty = (x / 200) -1; } jika ((Boton == 1) & (Pulbut == 0)) {mtz = - (y / 40) -5; } paparan (); } int main (int argc, char ** argv) {/ * glutAddMenuEntry () glutAddSubMenu () glutAttachMenu () glutCreateMenu () glutSetMenu () glutStrokeCharacter () glutStrokeLength () * / / * glReadPix bingkai penyangga glGetPixelMapfv () mengembalikan peta piksel yang ditentukan glGetPixelMapuiv () mengembalikan peta piksel yang ditentukan glGetPointerv () Mengembalikan alamat penunjuk yang ditentukan. * / Init (); leer (); glutInit (& argc, argv); glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); glutInitWindowPosition (50, 50); glutInitWindowSize (ancho, alto); glutCreateWindow ("Cubo 1"); di dalamnya(); glutDisplayFunc (paparan); glutReshapeFunc (membentuk semula); glutIdleFunc (terbiar); glutMouseFunc (raton); glutMotionFunc (ratmov); glutKeyboardFunc (papan kekunci); glutMainLoop (); pulangan 0; }

Langkah 5:

Imej
Imej

buat masa ini saya mesti berhenti! … tetapi pada bab berikutnya saya berjanji kepada anda bahawa saya akan melaksanakannya pada raspberry pi 3 atau nanoboard jetson saya, yang sudah dipasang pada beberapa pesawat kawalan jauh, atau pada beberapa robot labah-labah untuk mengimbas bahagian dalam gua

Disyorkan: