İçindekiler:
Video: Dijital 3D Haritalama için Temel 3D Tarayıcı: 5 Adım
2024 Yazar: John Day | [email protected]. Son düzenleme: 2024-01-30 13:17
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:
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:
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:
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:
- taranacak yüzeydeki lazer şeridinin her bir projeksiyonunun fotoğrafını çekin
- filtreleyin ve görüntüden rengi kaldırın
- rengi dinamik bir görüntü eşiğiyle ikili hale getirin
- her lazer projeksiyon kesitinin yakalanan profilini tanımak için bir kenar detektörü uygulayın
- 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
- 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.
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:
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:
ş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:
Haritalama İpuçları: 3 Adım
Haritalama İpuçları: Yürümek, yürüyüş yapmak, bisiklete binmek ve hatta araba sürmek olsun, etkinliğiniz ne olursa olsun, gittiğiniz rotaları kaydedebilirsiniz. Ardından bu rotaları arkadaşlarınızla ve ailenizle paylaşabilirsiniz. Ek olarak, kaydettiğiniz herhangi bir fotoğrafa konum eklemek için kayıtlı rotayı kullanabilirsiniz
Proje 4 - Bir Elektronik Haritalama: 9 Adım
Proje 4 - Bir Elektronik Haritalama: Bu proje Goodwill'de bulduğum Raptor New Bright F-150 RC oyuncağına odaklanmıştır. Bu projede oyuncağın içinde neler olup bittiğine bakacağım ve oyuncağın her bir parçasını nasıl demonte ettiğimi göstereceğim. Unutulmamalıdır ki bu oyuncağın yanlış
Harita Oluşturucu - Haritalama + Bildirim Sistemi: 9 Adım
Harita Oluşturucu - Haritalama + Bildirim Sistemi: Gece sürüşü oldukça eğlencelidir. Ancak çoğu zaman, yolun karşısına geçen hayvanlar şeklinde bir kabus olduğu ortaya çıkıyor (özellikle de karşıya geçebilmeleri için yanlarına gitmenizi bekleyen başıboş kedi ve köpekler!!). Bu yüzden öyle yapmayı düşündüm
Bir Ticaret Kartı Makinesi için Kart Tarayıcı: 13 Adım (Resimlerle)
Bir Ticaret Kartı Makinesi için Kart Tarayıcı: Bir Ticaret Kartı Makinesi için Kart TarayıcıDeğişim Günlüğü son adımda bulunabilir.Arka PlanProjemin ana motivasyonunu Kart Besleyici Giriş bölümünde açıkladım. Ama kısacası, çocuklarım ve ben çok miktarda Ticaret Kartı biriktirdik ve
Uçuş Haritalama Verilerini Kullanarak Erken Uyarı Raspberry PI Pist Işığı: 14 Adım (Resimlerle)
Uçuş Haritalama Verilerini Kullanan Erken Uyarı Raspberry PI Pist Işığı: Bu lamba, her zaman tepeden uçan uçaklarla ilgilendiğim için birkaç nedenden dolayı ortaya çıktı ve yaz aylarında hafta sonları genellikle etrafta uçan oldukça heyecan verici uçaklar var. Onları yalnızca ilerledikçe duyma eğiliminde olsanız da