Мазмұны:

Цифрлық 3D картаға арналған негізгі 3D сканері: 5 қадам
Цифрлық 3D картаға арналған негізгі 3D сканері: 5 қадам

Бейне: Цифрлық 3D картаға арналған негізгі 3D сканері: 5 қадам

Бейне: Цифрлық 3D картаға арналған негізгі 3D сканері: 5 қадам
Бейне: Сабақты қызықты бастау 2024, Қараша
Anonim
Цифрлық 3D картасына арналған негізгі 3D сканері
Цифрлық 3D картасына арналған негізгі 3D сканері

Бұл жобада мен 3D сканерлеу мен реконструкциялаудың негізгі негіздерін сипаттаймын және түсіндіремін, бұл негізінен шағын жартылай жазықтық объектілерді сканерлеуге қолданылады, ал олардың жұмысы қашықтан басқару ұшақтарына орнатуға болатын сканерлеу мен реконструкциялау жүйелерінде қолданылуы мүмкін. 3D үлгісі. оларды орнататын ұшақ ұшатын жерлер

Ақырғы идея - бұл сандық карта ретінде пайдалану үшін қандай да бір жерді немесе аумақты 3D сканерлеуді алу (Прометей фильміндегідей).

1 -қадам:

Кескін
Кескін

3d сканерлеудің барлық жүйесін қашықтан басқарылатын жазықтыққа орнату керек, ол 3d-де ұшатын кез келген аймақтың виртуалды картасын цифрландыру үшін, бірақ бұл үшін біз лазерлік триангуляция әдісінің жұмысының басынан бастадық. Лазерлік триангуляция әдісімен сканерлеу немесе 3D қайта құру негізінен лазерлік сәулені призмадан өткізуден тұрады, ол сканерленетін объектіге проекцияланатын лазерлік жолақты алу үшін лазер жолағын жасайды және осы лазерлік проекция алынғаннан кейін беттің беті Сканерлейтін жерден суретті фотокамераның қандай да бір түрімен түсіру керек және шығарылған лазер жолағының проекция бұрышына қатысты түзілетін бұрышты білуі керек, өйткені бұл суреттердің әрқайсысы жобаланған лазерлік жолақтарды түсіреді. Нысанның бетінде олар сканерленетін объектінің өлшемдік сипаттамаларын алу үшін алдын ала өңделеді және объектінің көлденең сегментінде оның бетінің профилін алу үшін жай ғана жолақты жолақпен сканерлейді, содан кейін түсіреді. объектінің келесі көлденең қимасының жобаланған жолағы, барлық проекцияланған жолақтарды қосу үшін, обто барлық көлденең қималарының алдында біз оның бетінің үш өлшемді сканерлеуін аламыз.

2 -қадам:

Кескін
Кескін

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

оның жұмыс принципі функционалды екені және ұшатын жүйеге сәйкес түзетулер мен бейімделулермен ол ұшатын аймақтың 3d картасын сканерлеуге және жаңғыртуға мүмкіндік беретіні анық.

Бірақ бұл жүйе ол ұшатын жерлердің сыртқы бетінің 3D картасын алуға ғана қызмет етеді ме?…

3 -қадам:

Кескін
Кескін

Үңгірлер мен каналдардың интерьерін картаға түсіру (дәл Prometeus фильміндегідей) Бұл 3D сканерлеу жүйесі үңгірлер, ғимараттар, туннельдер сияқты үлкен және қуыс объектілердің интерьерінің үш өлшемді модельдерін қайта құруға қызмет етеді. жоғарыда сипатталғандай және негізінен төмендегілерден тұрады:

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

4 -қадам:

Кескін
Кескін

Содан кейін мен беткі лазерлік жолақтардың проекцияларын кескін өңдеуге арналған бағдарламалардан өтемін. және үш өлшемді карта үлгісінде осы көлденең көлденең ұсыныстарды виртуалды 3d қайта құру:

суретті өңдеу:

n

#қосу #қосу «cv.h» #include «highgui.h» #қосу // #қосу #қосу #қосу #қосу

char f = 0; char аты = {«0.jpg»}; int n = 0, s, x, y; CvScalar sp; FILE *NuPu;

жарамсыз Writepoints () {char bufferx [33], буферлік [33]; itoa (x, bufferx, 10); itoa (у, буферлік, 10); fprintf (NuPu, bufferx); fprintf (NuPu, «\ t»); fprintf (NuPu, буферлік); fprintf (NuPu, «\ n»); }

жарамсыз noteblockInit () {NuPu = fopen («NuPu.txt», «w»); fseek (NuPu, 0, 0); fprintf (NuPu, «NP:»); fprintf (NuPu, «\ n»); }

int main () {char argstr [128]; noteblockInit (); cout << «Теклеа!…:» 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 буфері [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); қайтару 0; }

3D қайта құру:

#қосу //////////////////ifdef _APPLE_ #қосу #басқа #қосу #қосу #endif #қосу #қосу #қосу #қосу #қосу #қосу

#анықтайтын шегіргүл glColor3f (1, 0, 1) #анықта 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) #std аттар кеңістігін қолдану арқылы rojo glColor3f (1, 0, 0) анықтаңыз; 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 қаріп = (int) GLUT_BITMAP_8_BY_13; статикалық таңбалар таңбасы [100]; char буфері [3]; GLfloat anguloCuboX = 0.0f; GLfloat anguloCuboY = 0.0f; GLfloat anguloEsfera = 0.0f; GLint анчо = 500; GLint alto = 500; int hazPerspectiva = 0; жарамсыз қайта пішімдеу (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); анчо = ені; альто = биіктік; } 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 (); роджо; 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 = жол; *c! = '\ 0'; c ++) {glutBitmapCharacter (қаріп, *c);}} void display () {// mx = 468; itoa (mx, буфер, 10)); glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // glLoadIdentity (); glColor3f (1.0, 1.0, 1.0); glRasterPos2f (-1,.9);; 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, «Сәлем мәтіні»); 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; альто = 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; Көмекші [6] = 48; // көмекші [7] = 48; cx [s] = atoi (Aux.c_str ()); s ++; }} myfile.close (); } else cout <1780) NP = 1700; cout <void idle () {display (); } жарамсыз пернетақта (таңбасыз char пернесі, int x, int y) {қосқыш (перне) {регистр 'p': регистр 'P': hazPerspectiva = 1; қайта пішіндеу (зәкір, альт); үзіліс; case 'o': case 'O': hazPerspectiva = 0; қайта пішіндеу (зәкір, альт); үзіліс; жағдай 27: // шығу (0); үзіліс; }} void raton (int түймесі, int күйі, 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; менің = x; } if ((Boton == 2) & (Pulbut == 0)) {mtx = (y/200) -1; mty = (x/200) -1; } if ((Boton == 1) & (Pulbut == 0)) {mtz =-(y/40) -5; } дисплей (); } 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 («Cubo 1»); ішінде(); glutDisplayFunc (дисплей); glutReshapeFunc (қайта пішімдеу); glutIdleFunc (бос); glutMouseFunc (raton); glutMotionFunc (ratmov); glutKeyboardFunc (пернетақта); glutMainLoop (); қайтару 0; }

5 -қадам:

Кескін
Кескін

бір сәтте мен тоқтатуым керек! … Бірақ келесі тарауда мен оны таңқурай pi 3-те немесе үңгірлердің ішкі бөлігін сканерлеу үшін кейбір қашықтан басқарылатын ұшақтарға немесе өрмекші роботқа орнатылған jetson нанободамда енгізетінімді уәде беремін.

Ұсынылған: