İçindekiler:

Dijital 3D Haritalama için Temel 3D Tarayıcı: 5 Adım
Dijital 3D Haritalama için Temel 3D Tarayıcı: 5 Adım

Video: Dijital 3D Haritalama için Temel 3D Tarayıcı: 5 Adım

Video: Dijital 3D Haritalama için Temel 3D Tarayıcı: 5 Adım
Video: Surfer’in 3D Görünüm’ünün Temel İlkeleri /3D Haritalama Sanatı: Software Surfer ile Pratik Bilgiler 2024, Eylül
Anonim
Dijital 3D Haritalama için Temel 3D Tarayıcı
Dijital 3D Haritalama için Temel 3D Tarayıcı

Bu projede, öncelikle küçük yarı-düzlem nesnelerin taranmasına uygulanan ve çalışması uzaktan kumandalı uçaklara kurulabilen tarama ve yeniden yapılandırma sistemlerine genişletilebilen 3B tarama ve yeniden yapılandırmanın temel temellerini anlatacağım ve açıklayacağım. 3 boyutlu bir model. onları alan uçağın uçtuğu yerlerin

Son fikir, dijital bir harita olarak kullanmak için (Prometeus filminde olduğu gibi) bir yerin veya alanın dış veya iç 3D taramasını elde etmektir.

Aşama 1:

resim
resim

fikir, üzerinde uçtuğu herhangi bir alanın sanal haritasını 3 boyutlu olarak sayısallaştırmak için tüm 3 boyutlu tarama sistemini uzaktan kumandalı bir düzleme kurmaktır, ancak bunun için lazer üçgenleme işleminin başlangıcından başladıkyöntem Lazer üçgenleme ile tarama veya 3 boyutlu yeniden oluşturma, temel olarak, taranacak bir nesneye yansıtılacak tüm bir lazer şeridini elde etmek için bir lazer şeridi oluşturan bir prizmadan bir lazer ışınının geçirilmesinden oluşur ve bu lazer projeksiyonu Yüzey yüzeyi Taranacak yerden, görüntünün bir tür kamera ile yakalanması ve tercihen bu görüntülerin her biri yansıtılan lazer şeritlerini yakaladığından, yayılan lazer şeridinin projeksiyon açısına göre oluşturulan açıyı bilmesi gerekir. Nesnenin yüzeyinde, taranacak nesnenin boyutsal özelliklerini çıkarmak için ön işleme tabi tutulacaklar ve nesnenin o enine bölümünde yüzeyinin profilini elde etmek için nesnenin üzerindeki şerit şerit tarayacak ve ardından yakalanacaklar. tüm yansıtılan şeritleri bir araya toplamak için nesnenin aşağıdaki enine kesitinin yansıtılan şeridi Obto'nun tüm enine kesitlerinden önce yüzeyinin üç boyutlu bir taramasını elde ederiz

Adım 2:

resim
resim

Hedefimizi belirlediğimizden, bir sonraki adım, kalkış yapmak için önce ayaklarınızı yere sıkıca basmanız gerektiğini bilerek, bu nedenle, temelin doğru çalışmasını doğrulamak için doğrusal bir 3d tarayıcının deneysel bir prototipi ile yere başladık. 3d tarayıcıve yukarıdaki resimde de görebileceğiniz gibi, bir PC, OpenCV, Glut of OpenGL, bir web kamerası, bir lazer, lazer çiftlik jeneratörü (bu durumda bir döner ayna aracılığıyla) bir elektronik doğrusal yer değiştirme sistemi (ray ile yapılmış) kullandım. ve eski bir yazıcıdan çıkarılan sistem) taranacak nesneleri, ahşap ve hamuru yerleştirdiğim bir tabandan ve fotoğrafta gördüğünüz gibi bilgisayarda: OpenGL'den Glut ile üç tane oluşturmayı ve görüntülemeyi başardım. taranan gerçek nesneye dayalı olarak üretilen boyutlu model (bu durumda bir oyuncak örümcek)

bu nedenle, çalışma prensibinin işlevsel olduğu ve uçan bir sisteme ilgili ayarlamaları ve uyarlamaları ile uçtuğu alanın 3 boyutlu bir haritasını tarayabilecek ve yeniden üretebilecek olduğu çok açıktır.

Ancak bu sistem sadece üzerinden uçtuğu yerlerin dış yüzeyinin 3 boyutlu haritalarını çıkarmaya hizmet edecek???…

Aşama 3:

resim
resim

mağaraların ve kanalların içinin haritalanması (tıpkı Prometeus filmindeki gibi)Bu 3D tarama sistemi aynı zamanda mağara, bina, tünel vb. büyük ve içi boş nesnelerin içlerinin üç boyutlu modellerini yeniden oluşturmaya hizmet eder. çalışma prensibi tam olarak daha önce açıklandığı gibi ve temel olarak aşağıdakilerden oluşur:

  1. taranacak yüzeydeki lazer şeridinin her bir projeksiyonunun fotoğrafını çekin
  2. filtreleyin ve görüntüden rengi kaldırın
  3. rengi dinamik bir görüntü eşiğiyle ikili hale getirin
  4. her lazer projeksiyon kesitinin yakalanan profilini tanımak için bir kenar detektörü uygulayın
  5. ve segmentasyonu kullanarak, sanal 3B harita üzerinde taranacak ve yeniden oluşturulacak nesnenin bu kesitinin 3B temsili için uygun sınırı seçin
  6. daha sonra bu adımlar, alt bölümdeki her bir alt bölüm tarafından sürekli olarak yansıtılan lazer şeritlerinin bir alt tarzında çekilen her fotoğraf için basitçe tekrarlanır.
  7. Haritalanacak nesnenin enine kesitlerinin birçok temsilinden oluşan bir nokta bulutu elde edilene kadar, enine kesitlerin temsilinin katman katman art arda eklenir

4. Adım:

resim
resim

Daha sonra yüzeysel lazer şeritlerinin izdüşümlerinin görüntü işleme programlarına geçiyorum. ve ayrıntılı üç boyutlu harita modelinde bu belirsiz enine temsillerin sanal 3 boyutlu yeniden yapılandırılması:

görüntü işleme:

n

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

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

void Writepoints() { char arabellekx[33], arabellek[33]; itoa (x, tamponx, 10); itoa (y, tamponlu, 10); fprintf(NuPu, tamponx); fprintf(NuPu, "\t"); fprintf(NuPu, arabellek); 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; isim[0]=f; cout<

IplImage* img0=cvLoadImage("00.jpg", 0); if(f=='0') { for(y=1;yyükseklik-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++;} } } } karakter arabelleği[33]; itoa (n, arabellek, 10); fprintf(NuPu, "Son:"); fprintf(NuPu, arabellek); fprintf(NuPu, "\n"); fclose(NuPu);

cvWaitKey(0); //_execlp("calc.exe", "calc.exe", argstr, NULL); cvDestroyAllWindows(); cvReleaseImage(&image); cvReleaseImage(&img); cvReleaseImage(&img0); cvReleaseImage(&img1); cvReleaseImage(&img2); 0 döndür; }

3D rekonstrüksiyon:

#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) std ad alanını kullanarak; int s, Boton=1, Pulbut=1; float mx=0, my=0, mtx=0, mty=0, mtz=-5.0; const int Avance=1; dize satırı, Aux; karakter Karakter='H'; DOSYA *NuPu; int NP, h, w; float G=0, n=0, cx[5000], cy[5000], x, y, ax, ay, az; int yazı tipi=(int)GLUT_BITMAP_8_BY_13; statik karakter etiketi[100]; karakter arabelleği[3]; GLfloat anguloCuboX = 0.0f; GLfloat anguloCuboY = 0.0f; GLfloat anguloEsfera = 0.0f; GLint ancho=500; GLint alto=500; int hazPerspektif = 0; void yeniden şekillendirme(int genişlik, int yükseklik) { glViewport(0, 0, genişlik, yükseklik); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if(hazPerspectiva) gluPerspective(23.0f, (GLfloat)width/(GLfloat)height, 1.0f, 20.0f); yoksa glOrtho(-1, 1, -1, 1, -10, 10); glMatrixMode(GL_MODELVIEW); ancho = genişlik; alto = yükseklik; } void Kolorear(int K) { float Hip; x=(cx[s]-320)/480; y=(cy[s]-240)/640; Kalça=sqrt(pow(x, 2)+pow(y, 2)); if((Kalça>=0)&&(Kalça=.07)&&(Kalça=.14)&&(Kalça=.21)&&(Kalça=.28)&&(Kalça=.35)&&(Kalça=.42) &&(Hip<=.49)){violeta;} } void 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); 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 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(GLUT_BITMAP_TIMES_ROMAN_24,(H) için";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, "Merhaba Metin"); glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN'24, '7);*/ /*glColor3f(1. 0f, 1.0f, 1.0f); setOrthographicProjection(); glPushMatrix(); glLoadIdentity(); renderBitmapString(30, 15, (void *)font, "GLUT Eğitimi ---_------_@ 3D Tech");*/ glFlush(); glutSwapBuffers(); anguloCuboX+=0.1f; anguloCuboY+=0.1f; anguloEsfera+=0.2f; } geçersiz init() { 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 nisan 2015/usb1/rekostruccion 3D en Especialidad CICATA/Software/Reconstruccion 3D/R3d_0\bin/Debug/NuPu.txt"); if (dosyam.is_open()) { s=0; while(getline(myfile, line)) { if((line[0]!='N')&&(line[0]!='F')) { Aux=line; satır[0]=48; satır[1]=48; satır[2]=48; satır[3]=48; cy[s]=atoi(line.c_str()); Yardımcı[4]=48; Yardımcı[5]=48; Yardımcı[6]=48; //Aux[7]=48; cx[s]=atoi(Aux.c_str()); s++; } } dosyam.close(); } başka cout <1780)NP=1700; cout< void boşta() { display(); } void klavye(işaretsiz karakter tuşu, int x, int y) { anahtar(anahtar) { case 'p': case 'P': hazPerspectiva=1; yeniden şekillendir(ancho, alto); kırmak; 'o' durumu: 'O' durumu: hazPerspectiva=0; yeniden şekillendir(ancho, alto); kırmak; durum 27: // kaçış çıkış (0); kırmak; } } void raton(int buton, int durum, int x, int y) { /* GLUT_LEFT_BUTTON 0 GLUT_MIDDLE_BUTTON 1 GLUT_RIGHT_BUTTON 2 GLUT_DOWN 0 GLUT_UP 1 */ Boton=button; Pulbut=durum; //mx=y; Görüntüle(); } void ratmov(int x, int y) { if((Boton==0)&(Pulbut==0)) { mx=y; benim=x; } if((Boton==2)&(Pulbut==0)) { mtx=(y/200)-1; mty=(x/200)-1; } if((Boton==1)&(Pulbut==0)) { mtz=-(y/40)-5; } Görüntüle(); } int main(int argc, char **argv) { /*glutAddMenuEntry() glutAddSubMenu() glutAttachMenu() glutCreateMenu() glutSetMenu() glutStrokeCharacter() glutStrokeLength()*/ /*glReadPixels() çerçeve arabelleği glGetPixelMapfv() belirtilen piksel haritasını döndürür glGetPixelMapuiv() belirtilen piksel haritasını döndürür glGetPointerv() Belirtilen işaretçinin adresini döndürür.*/ Init(); leer(); glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); glutInitWindowPosition(50, 50); glutInitWindowSize(ancho, alto); glutCreateWindow("Kübo 1"); içinde(); glutDisplayFunc(ekran); glutReshapeFunc(yeniden şekillendir); glutIdleFunc(boş); glutMouseFunc(raton); glutMotionFunc(ratmov); glutKeyboardFunc(klavye); glutMainLoop(); 0 döndür; }

Adım 5:

resim
resim

şu an için durmak zorundayım! …ama bir sonraki bölümde size söz veriyorum, onu ahududu pi 3'ümde veya halihazırda uzaktan kumandalı bir uçağa monte edilmiş jetson nanoboard'umda veya mağaraların içini taramak için bir örümcek robotunda uygulayacağım.

Önerilen: