Мазмуну:

Санариптик 3D карта үчүн негизги 3D сканери: 5 кадам
Санариптик 3D карта үчүн негизги 3D сканери: 5 кадам

Video: Санариптик 3D карта үчүн негизги 3D сканери: 5 кадам

Video: Санариптик 3D карта үчүн негизги 3D сканери: 5 кадам
Video: Ниндзя открытого доступа: Пиво закона 2024, Сентябрь
Anonim
Санариптик 3D картасын түзүү үчүн негизги 3D сканери
Санариптик 3D картасын түзүү үчүн негизги 3D сканери

Бул долбоордо мен 3D сканерлөөнүн жана реконструкциялоонун негизги негиздерин сүрөттөйм жана түшүндүрөм, негизинен кичинекей жарым учак объектилерин сканерлөөгө колдонулат, жана алардын иштөө алыстан башкаруу учактарына орнотулушу мүмкүн болгон сканерлөө жана реконструкциялоо системаларына жайылтылышы мүмкүн. 3D модели. учак орнотулган учактарды алуучу жерлер

Акыркы идея - санариптик карта катары колдонуу үчүн кандайдыр бир жерди же аймакты, анын сырткы же ички 3D изин алуу (Прометей тасмасындагыдай)

1 кадам:

Сүрөт
Сүрөт

идеясы, 3d учкан бардык аймактын виртуалдык картасын санариптештирүү үчүн, алыстан башкарылуучу учакка 3d сканерлөө тутумун орнотуу, бирок бул үчүн биз лазердик триангуляция иштей баштадык. Лазердик триангуляция жолу менен сканерлөө же 3d реконструкциясы негизинен лазердик нурду призмадан өткөрүүдөн турат, ал лазер тилкесин жаратат, ал сканерленүүчү объектке чагылдырыла турган лазер тилкесин алат жана бул лазер проекциясы алынганда беттин бети Сканерленүүчү жерден сүрөттү кандайдыр бир камера менен тартуу керек жана бул лазер тилкесинин проекциялык бурчуна карата түзүлгөн бурчту билүү керек, анткени бул сүрөттөрдүн ар бири проекттелген лазер тилкелерин тартып алат. Объекттин бетинде алар сканерленүүчү объекттин өлчөмдүк мүнөздөмөлөрүн алуу үчүн алдын ала иштетилет жана объекттин ошол туурасынан кесилген сегментинде анын бетинин профилин алуу үчүн объектти үстүнөн тилке менен сканерлеп, андан кийин тартып алышат объекттин кийинки кесилишинин проекттелген тилкеси, бардык проекттелген тилкелерди бирге кошуу үчүн Обтонун бардык кесилиштеринен мурун биз анын бетинин үч өлчөмдүү сканерин алабыз

2-кадам:

Сүрөт
Сүрөт

Биз өзүбүздүн максатыбызды аныктап алгандыктан, кийинки кадамды чечүү үчүн алгач бутуңарды жерге бекем кармашыңар керек экенин билүү үчүн, биз базалык системанын туура иштешин ырастоо үчүн сызыктуу 3d сканердин эксперименталдык прототиби менен жерге кирдик. 3d сканери жана жогоруда көрсөтүлгөн сүрөттө көрүнүп тургандай, мен PC, OpenCV, Glut of OpenGL, веб -камера, лазер, лазер фермасынын генераторун (бул учурда айлануучу күзгү аркылуу) электрондук линиялык жылышуу системасын (темир жол менен жасалган) колдондум жана эски принтерден алынган система), мен сканерленүүчү объекттерди, жыгачты жана пластилинди жайгаштырган базадан жана компьютерде сүрөттө көрүнүп тургандай: мен OpenGLден Glut менен үчөөнү түзүп, көрсөтө алдым. сканерленген чыныгы объекттин негизинде чыгарылган өлчөмдүү модель (бул учурда оюнчук жөргөмүш)

Ошентип, иштөө принциби функционалдуу экени жана учуучу системага тиешелүү өзгөртүүлөр жана адаптациялар менен ал учуп бара жаткан аймактын 3d картасын сканерлеп жана кайра чыгарууга жөндөмдүү экени айдан ачык.

Бирок бул система учуп бараткан жерлердин тышкы бетинин 3D карталарын алууга гана кызмат кылат ???…

3 -кадам:

Сүрөт
Сүрөт

Үңкүрлөрдүн жана каналдардын ичин картага түшүрүү (Prometeus тасмасындагыдай) Бул 3D сканерлөө системасы үңкүр, имараттар, туннелдер ж.б чоң жана көңдөй объекттердин интерьеринин үч өлчөмдүү моделдерин реконструкциялоого кызмат кылат. так эле баяндалган жана негизинен төмөнкүлөрдөн турат:

  1. сканерленүүчү бетиндеги лазер тилкесинин ар бир проекциясынын сүрөтүн тартуу
  2. чыпкалап, сүрөттөн түсүн алып салуу
  3. түстү динамикалык сүрөт босогосу менен бинаризациялоо
  4. ар бир лазердик проекция кесилишинин тартылган профилин таануу үчүн четки детекторду колдонуңуз
  5. жана сегменттөөнү колдонуу менен виртуалдык 3D картада сканерленүүчү жана реконструкциялануучу объектинин ошол кесилишинин 3d көрсөтүлүшү үчүн тиешелүү чекти тандаңыз.
  6. анда бул кадамдар ар бир бөлүмдө үзгүлтүксүз проектирленген лазер тилкелеринин суб-таризинде тартылган ар бир сүрөт үчүн кайталанат.
  7. кесилиштердин катмарынын катмарлары картага түшүрүлүүчү нерсенин кесилиштеринин көптөгөн сүрөттөлүштөрүнөн пайда болгон чекит булутун алганга чейин ырааттуу түрдө кошулат

4 -кадам:

Сүрөт
Сүрөт

Андан кийин үстүртөн лазер тилкелеринин проекцияларын сүрөт иштетүүчү программаларды тапшырам. жана иштелип чыккан үч өлчөмдүү карта моделиндеги бул шумдуктуу кайчылаш өкүлчүлүктөрдүн виртуалдык 3d реконструкциясы:

сүрөт иштетүү:

п

#кошуу #кошуу "cv.h" #include "highgui.h" #кошуу // #кошуу #кошуу #кошуу #кошуу

char f = 0; char name = {"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, buffery, 10); fprintf (NuPu, bufferx); fprintf (NuPu, "\ t"); fprintf (NuPu, buffery); 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; аты [0] = f; cout <

IplImage* img0 = cvLoadImage ("00.jpg", 0); if (f == '0') {for (y = 1; yheight-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 ++;}}}} char buffer [33]; itoa (n, буфер, 10); fprintf (NuPu, "Fin:"); fprintf (NuPu, буфер); fprintf (NuPu, "\ n"); fclose (NuPu);

cvWaitKey (0); //_execlp("calc.exe "," calc.exe ", аргстр, NULL); cvDestroyAllWindows (); cvReleaseImage (& сүрөт); cvReleaseImage (& img); cvReleaseImage (& img0); cvReleaseImage (& img1); cvReleaseImage (& img2); return 0; }

3D реконструкциясы:

#кошуу //////////////////ifdef _APPLE_ #кошуу #дагы #кошуу #кошуу #endif #кошуу #кошуу #кошуу #кошуу #кошуу #кошуу

#аныктоо 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; int s, Boton = 1, Pulbut = 1; float mx = 0, my = 0, mtx = 0, mty = 0, mtz = -5.0; const int Avance = 1; сап линиясы, Aux; char Caracter = '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; статикалык char энбелгиси [100]; char буфер [3]; GLfloat anguloCuboX = 0.0f; GLfloat anguloCuboY = 0.0f; GLfloat anguloEsfera = 0.0f; GLint анчо = 500; GLint alto = 500; int hazPerspectiva = 0; боштукту өзгөртүү (int туурасы, int бийиктиги) {glViewport (0, 0, туурасы, бийиктиги); glMatrixMode (GL_PROJECTION); glLoadIdentity (); if (hazPerspectiva) gluPerspective (23.0f, (GLfloat) туурасы/(GLfloat) бийиктиги, 1.0f, 20.0f); else glOrtho (-1, 1, -1, 1, -10, 10); glMatrixMode (GL_MODELVIEW); анчо = туурасы; alto = бийиктик; } void Kolorear (int K) {float Hip; x = (cx [s] -320)/480; y = (cy [s] -240)/640; Hip = sqrt (pow (x, 2)+pow (y, 2)); if ((Hip> = 0) && (Hip =.07) && (Hip =.14) && (Hip =.21) && (Hip =.28) && (Hip =.35) && (Hip =.42) && (Hip <=. 49)) {violeta;}} 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); (c = string; *c! = '\ 0'; c ++) {glutBitmapCharacter (шрифт, *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 (GL_T_TM) "GL_T_24"; s <3; s ++) {glutBitmapCharacter (GLUT_BITMAP_TIMES_ROMAN_24, буфер [s]);} glTranslatef (mty, -mtx, mtz); glRotatef (mx, 1.0f, 0.0f, 0.0f); glRotatef (менин, 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"); glutBitmapCARIT 'GLUT_);* / /*glColor3f (1. 0f, 1.0f, 1.0f); setOrthographicProjection (); glPushMatrix (); glLoadIdentity (); renderBitmapString (30, 15, (void *) шрифти, "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); анчо = 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"); if (myfile.is_open ()) {s = 0; while (getline (myfile, line)) {if ((line [0]! = 'N') && (line [0]! = 'F')) {Aux = line; сап [0] = 48; сап [1] = 48; сап [2] = 48; сап [3] = 48; cy [s] = atoi (line.c_str ()); Aux [4] = 48; Aux [5] = 48; Aux [6] = 48; // Жардамчы [7] = 48; cx [s] = atoi (Aux.c_str ()); s ++; }} myfile.close (); } else cout <1780) NP = 1700; cout <void idle () {display (); } жараксыз клавиатура (белгисиз char key, int x, int y) {switch (key) {case 'p': case 'P': hazPerspectiva = 1; кайра түзүү (анчо, альт); тыныгуу; case 'o': case 'O': hazPerspectiva = 0; кайра түзүү (анчо, альт); тыныгуу; case 27: // exit exit (0); тыныгуу; }} void raton (int button, int state, int x, int y) { / * GLUT_LEFT_BUTTON 0 GLUT_MIDDLE_BUTTON 1 GLUT_RIGHT_BUTTON 2 GLUT_DOWN 0 GLUT_UP 1 * / Boton = баскычы; Pulbut = мамлекет; // mx = y; дисплей (); } void ratmov (int x, int y) {if ((Boton == 0) & (Pulbut == 0)) {mx = y; my = x; } if ((Boton == 2) & (Pulbut == 0)) {mtx = (y/200) -1; mty = (x/200) -1; } if ((Boton == 1) & (Pulbut == 0)) {mtz =-(y/40) -5; } display (); } int main (int argc, char ** argv) { /*glutAddMenuEntry () glutAddSubMenu () glutAttachMenu () glutCreateMenu () glutSetMenu () glutStrokeCharacter () glutStrokeLength ()* / /*glReadPixels кадр буфери glGetPixelMapfv () көрсөтүлгөн пикселдик картаны кайтаруу glGetPixelMapuiv () көрсөтүлгөн пикселдик картаны кайтаруу glGetPointerv () Көрсөткүчтүн дарегин кайтарат.*/ Init (); leer (); glutInit (& argc, argv); glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); glutInitWindowPosition (50, 50); glutInitWindowSize (анчо, альт); glutCreateWindow ("Кубо 1"); ичинде(); glutDisplayFunc (дисплей); glutReshapeFunc (кайра түзүү); glutIdleFunc (бош); glutMouseFunc (raton); glutMotionFunc (ratmov); glutKeyboardFunc (клавиатура); glutMainLoop (); return 0; }

5 -кадам:

Сүрөт
Сүрөт

азырынча мен токтотушум керек! … бирок кийинки бөлүмдө мен аны малина pi 3 же jetson наноборумда, алыстан башкарылуучу учакта же үңкүрдүн ичин сканерлөө үчүн жөргөмүш роботто ишке ашырам деп убада берем.

Сунушталууда: