Агуулгын хүснэгт:

3D дижитал зураглалын үндсэн 3D сканнер: 5 алхам
3D дижитал зураглалын үндсэн 3D сканнер: 5 алхам

Видео: 3D дижитал зураглалын үндсэн 3D сканнер: 5 алхам

Видео: 3D дижитал зураглалын үндсэн 3D сканнер: 5 алхам
Видео: Камера-ЛАМПА со слежением и определением человека. 2024, Есдүгээр
Anonim
3D дижитал зураглалын үндсэн 3D сканнер
3D дижитал зураглалын үндсэн 3D сканнер

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

Эцсийн санаа бол гаднах эсвэл дотор талын аль нэг газар, талбайг 3D сканнердах замаар дижитал газрын зураг болгон ашиглах явдал юм (Prometeus киноны нэгэн адил).

1-р алхам:

Зураг
Зураг

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

Алхам 2:

Зураг
Зураг

Бид зорилгоо тодорхойлсон тул хөөрөхийн тулд эхлээд хөлөө газар дээр нь чангалсан байх ёстойг мэдэх дараагийн алхам бол үндсэн үйлдлийн зөв эсэхийг баталгаажуулахын тулд шугаман 3d сканнерын туршилтын загварыг ашиглан газар дээр нь эхлэв. 3d сканнер </b> Дээрх зураг дээр харагдаж байгаа шиг би компьютер, OpenCV, Glut of OpenGL, вэбкамер, лазер, лазер фермийн генератор (энэ тохиолдолд эргэлтийн толин тусгалаар) электрон шугаман шилжилтийн системийг (төмөр замаар хийсэн) ашигласан. болон хуучин принтерээс гаргаж авсан систем) сканнердах объект, мод, хуванцар зэргийг компьютер дээр байрлуулсан суурин дээрээс: би OpenGL-аас Glut ашиглан гурван сканнердсан бодит объект дээр үндэслэн хуулбарласан хэмжээст загвар (энэ тохиолдолд тоглоом аалз)

Тиймээс үйл ажиллагааны зарчим нь ажиллагаатай бөгөөд нисдэг системд тохируулан тохируулснаар нисч буй газрынхаа 3d газрын зургийг сканнердах, хуулбарлах боломжтой болох нь тодорхой байна.

Гэхдээ энэ систем нь нисч буй газрынхаа гаднах гадаргуугийн 3D газрын зургийг авахад л туслах болно.…

Алхам 3:

Зураг
Зураг

Агуй, сувгийн дотор талын зураглалыг (яг л Prometeus кинон дээр гардаг шиг) энэхүү 3D сканнердах систем нь агуй, барилга, хонгил гэх мэт том, хөндий объектуудын дотор талын гурван хэмжээст загварыг сэргээн засварлахад үйлчилдэг. Өмнө дурдсантай яг ижил бөгөөд үндсэндээ дараахь зүйлээс бүрдэнэ.

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

Алхам 4:

Зураг
Зураг

Дараа нь би өнгөц лазер туузны проекцийг дүрс боловсруулах програмуудыг дамжуулдаг. Гурван хэмжээст газрын зургийн боловсруулсан загварт эдгээр хөндлөн огтлолын дүрслэлийг виртуал 3d хэлбэрээр сэргээн засварлах.

зураг боловсруулах:

n

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

char f = 0; char нэр = {"0.jpg"}; int n = 0, s, x, y; CvScalar sp; Файл *NuPu;

хүчингүй Writepoints () {char bufferx [33], буфер [33]; itoa (x, bufferx, 10); itoa (y, buffery, 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 << "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 буфер [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 сэргээн босголт:

#оруулах/

#violeta glColor3f (1, 0, 1) #azul glColor3f (0, 0, 1) #define turkeza glColor3f (0, 1, 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'; Файл *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 өргөн, int өндөр) {glViewport (0, 0, өргөн, өндөр); glMatrixMode (GL_PROJECTION); glLoadIdentity (); хэрэв (hazPerspectiva) gluPerspective (23.0f, (GLfloat) өргөн/(GLfloat) өндөр, 1.0f, 20.0f); өөр glOrtho (-1, 1, -1, 1, -10, 10); glMatrixMode (GL_MODELVIEW); зангуу = өргөн; alto = өндөр; } хүчингүй Kolorear (int K) {float Hip; x = (cx [s] -320)/480; y = (cy [s] -240)/640; Хип = sqrt (pow (x, 2)+pow (y, 2)); if ((Hip> = 0) && (Hip =.07) && (Hip =.14) && (Hip =.21) && (Hip =.28) && (Hip =.35) && (Hip =.42) && (Хип <=. 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 (); рожо; 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 (фонт, *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_TIM); 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 ((мөр [0]! = 'N') && (шугам [0]! = 'F')) {Aux = мөр; мөр [0] = 48; мөр [1] = 48; мөр [2] = 48; мөр [3] = 48; cy [s] = atoi (line.c_str ()); Туслах [4] = 48; Туслах [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) {шилжүүлэгч (түлхүүр) {case 'p': case 'P': hazPerspectiva = 1; дахин хэлбэржүүлэх (зангуу, альто); завсарлага; тохиолдол 'o': тохиолдол 'O': hazPerspectiva = 0; дахин хэлбэржүүлэх (зангуу, альто); завсарлага; тохиолдол 27: // гарах гарц (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; миний = 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 эсвэл алсын удирдлагатай зарим онгоцонд суурилуулсан, эсвэл аалзны робот дээр агуйн дотор скан хийх зориулалттай нанобоард дээрээ хэрэгжүүлэх болно гэдгээ амлаж байна.

Зөвлөмж болгож буй: