فهرست مطالب:

اسکنر سه بعدی پایه برای نقشه برداری سه بعدی دیجیتال: 5 مرحله
اسکنر سه بعدی پایه برای نقشه برداری سه بعدی دیجیتال: 5 مرحله

تصویری: اسکنر سه بعدی پایه برای نقشه برداری سه بعدی دیجیتال: 5 مرحله

تصویری: اسکنر سه بعدی پایه برای نقشه برداری سه بعدی دیجیتال: 5 مرحله
تصویری: لزبازی لیلا اوتادی چه لبی میگیره (نبینی از دستت رفته) 2024, سپتامبر
Anonim
اسکنر سه بعدی اولیه برای نقشه برداری سه بعدی دیجیتال
اسکنر سه بعدی اولیه برای نقشه برداری سه بعدی دیجیتال

در این پروژه ، من اصول اولیه اسکن و بازسازی سه بعدی را که عمدتا برای اسکن اجسام نیمه هواپیما کوچک استفاده می شود ، توضیح می دهم و توضیح می دهم ، و عملیات آنها را می توان به سیستم های اسکن و بازسازی که می توان بر روی هواپیماهای کنترل از راه دور نصب کرد ، گسترش داد. یک مدل سه بعدی از مکانهایی که هواپیمایی که آنها را سوار کرده است پرواز می کند

ایده نهایی این است که یک اسکن سه بعدی از یک مکان یا ناحیه ، بیرونی یا داخلی آن ، برای استفاده از آن به عنوان یک نقشه دیجیتالی (مانند فیلم پرومتئوس) بدست آورید.

مرحله 1:

تصویر
تصویر

ایده این است که کل سیستم اسکن سه بعدی را بر روی یک صفحه کنترل از راه دور نصب کنید تا بتوانید نقشه مجازی هر ناحیه ای را که به صورت سه بعدی پرواز می کند دیجیتالی کنید ، اما برای این کار ما از ابتدای عمل مثلث سازی لیزری اسکن یا بازسازی سه بعدی با مثلث سازی لیزری اساساً شامل عبور یک پرتو لیزر از منشوری است که یک نوار لیزری ایجاد می کند تا یک نوار لیزری کامل را که بر روی شی مورد اسکن قرار گرفته است بدست آورد ، و هنگامی که این طرح لیزری بر روی سطح سطح از محل اسکن ، تصویر باید با نوعی دوربین گرفته شود و ترجیحاً از زاویه ای که نسبت به زاویه طرح نوار لیزری ساطع شده ایجاد می شود ، استفاده شود ، زیرا هر یک از این تصاویر نوارهای لیزر پیش بینی شده را ضبط می کند. در سطح جسم ، آنها برای استخراج ویژگی های ابعادی شی مورد اسکن پیش پردازش می شوند و به سادگی نوار به نوار بالای جسم را اسکن می کنند تا مشخصات سطح آن را در آن قسمت عرضی جسم بدست آورند و متعاقباً ضبط می شوند. نوار پیش بینی شده از سطح مقطع زیر شی ، برای افزودن همه نوارهای پیش بینی شده به یکدیگر قبل از تمام مقاطع انتهایی ، یک اسکن سه بعدی از سطح آن بدست می آوریم

گام 2:

تصویر
تصویر

از آنجا که ما هدف خود را مشخص کرده ایم ، گام بعدی این است که بدانید برای بلند شدن ابتدا باید پاهای خود را محکم بر روی زمین قرار دهید ، بنابراین ما با یک نمونه اولیه آزمایشی از یک اسکنر سه بعدی خطی ، برای تأیید صحت عملکرد صحیح پایه ، روی زمین کار کردیم. اسکن سه بعدی و همانطور که در تصویر بالا مشاهده می کنید ، من از کامپیوتر ، OpenCV ، Glut of OpenGL ، وب کم ، لیزر ، ژنراتور مزرعه لیزری (در این مورد از طریق آینه چرخشی) از یک سیستم جابجایی خطی الکترونیکی (ساخته شده با ریل) استفاده کردم. و سیستم استخراج شده از یک چاپگر قدیمی) از پایه ای که من اشیاء مورد اسکن ، چوب و پلاستیلین و همانطور که در عکس می بینید را در رایانه قرار می دهم: من موفق شدم با Glut از OpenGL سه نوع تولید و نمایش دهم مدل بعدی که بر اساس شی واقعی اسکن شده (در این مورد عنکبوت اسباب بازی) تکثیر شده است

بنابراین بیش از همه آشکار است که اصل عملکرد عملکردی است و اینکه با تنظیمات و تطبیق های مربوط به آن در سیستم پرواز ، می توان نقشه سه بعدی منطقه ای را که در آن پرواز می کند اسکن و بازتولید کرد.

اما این سیستم تنها برای به دست آوردن نقشه های سه بعدی از سطح خارجی مکانهایی که در آن پرواز می کند ، عمل می کند ……

مرحله 3:

تصویر
تصویر

نقشه برداری از داخل غارها و مجاری (درست مانند فیلم پرومتئوس) این سیستم اسکن سه بعدی همچنین به بازسازی مدلهای سه بعدی فضای داخلی اجسام بزرگ و توخالی مانند غارها ، ساختمانها ، تونلها و غیره کمک می کند. دقیقاً مشابه آنچه قبلاً توضیح داده شد و اساساً شامل موارد زیر است:

  1. عکس هر یک از برآمدگی های نوار لیزر روی سطح مورد اسکن را بگیرید
  2. فیلتر کنید و رنگ را از تصویر حذف کنید
  3. با آستانه تصویر پویا ، رنگ را دوتایی کنید
  4. از یک آشکارساز لبه برای تشخیص مشخصات ثبت شده از هر سطح لیزری طرح لیزری استفاده کنید
  5. و با استفاده از تقسیم بندی ، حاشیه مناسب را برای نمایش سه بعدی آن سطح مقطع شی مورد بررسی و بازسازی بر روی نقشه سه بعدی مجازی انتخاب کنید.
  6. سپس این مراحل به سادگی برای هر عکس گرفته شده به شیوه ای فرعی از نوارهای لیزری که به طور مداوم توسط هر بخش فرعی در بخش فرعی نشان داده می شوند ، تکرار می شوند.
  7. لایه به لایه نمایشی از مقاطع به صورت پی در پی اضافه می شوند تا به دست آوردن یک ابر نقطه ای که توسط بسیاری از نمایش های مقطع جسم موردنظر ایجاد می شود

مرحله 4:

تصویر
تصویر

سپس برنامه های پردازش تصویر برآمدگی نوارهای لیزری سطحی را می گذرانم. و بازسازی سه بعدی مجازی این بازنمایی های عرضی در مدل نقشه سه بعدی توسعه یافته:

پردازش تصویر:

n

#شامل #شامل #cv.h " #شامل" highgui.h " #شامل // #شامل #شامل #شامل #شامل #

char f = 0؛ char name = {"0.jpg"}؛ int n = 0 ، s ، x ، y ؛ CvScalar sp؛ فایل *NuPu ؛

void Writepoints () {char bufferx [33] ، buffery [33]؛ itoa (x ، bufferx ، 10) ؛ itoa (y ، buffery ، 10) ؛ fprintf (NuPu ، bufferx) ؛ fprintf (NuPu ، "\ t") ؛ fprintf (NuPu ، بافری) ؛ 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) {نقاط نوشتاری () ؛ n ++؛}}}} else {for (y = 1؛ yheight-2؛ y ++) {for (x = 1؛ xwidth-2؛ x ++) { sp = cvGet2D (img1 ، y ، x) ؛ if (sp.val [0]> 50) {نقاط نوشتاری () ؛ n ++؛}}}} char buffer [33] ؛ itoa (n ، بافر ، 10) ؛ fprintf (NuPu ، "Fin:") ؛ fprintf (NuPu ، بافر) ؛ fprintf (NuPu ، "\ n") ؛ fclose (NuPu) ؛

cvWaitKey (0) ؛ //_execlp("calc.exe "،" calc.exe "، argstr ، NULL) ؛ cvDestroyAllWindows ()؛ cvReleaseImage (& تصویر) ؛ cvReleaseImage (& img)؛ cvReleaseImage (& img0)؛ cvReleaseImage (& img1) ؛ cvReleaseImage (& img2) ؛ بازگشت 0 ؛ }

بازسازی سه بعدی:

#شامل ///////////////////ifdef _APPLE_ #شامل #دیگر #شامل #شامل #شامل #endif #شامل #شامل #شامل #شامل #شامل #شامل #

#تعریف بنفشه glColor3f (1، 0، 1) #azul glColor3f (0، 0، 1) #تعریف turkeza glColor3f (0، 1، 1) #dedeine verde glColor3f (0، 1، 0) #تعریف amarillo glColor3f (1 ، 1 ، 0) #deranine naranja glColor3f (1 ،.3 ، 0) #dejoine rojo glColor3f (1 ، 0 ، 0) با استفاده از فضای نام std ؛ int s ، Boton = 1 ، Pulbut = 1 ؛ شناور mx = 0 ، my = 0 ، mtx = 0 ، mty = 0 ، mtz = -5.0 ؛ const int Avance = 1؛ رشته رشته ، Aux؛ char Caracter = 'H'؛ فایل *NuPu ؛ int NP ، h ، w ؛ شناور G = 0 ، n = 0 ، cx [5000] ، cy [5000] ، x ، y ، ax ، ay ، az ؛ int font = (int) GLUT_BITMAP_8_BY_13؛ برچسب شار استاتیک [100]؛ char buffer [3]؛ GLfloat anguloCuboX = 0.0f ؛ GLfloat anguloCuboY = 0.0f ؛ GLfloat anguloEsfera = 0.0f ؛ GLint ancho = 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) ؛ ancho = عرض؛ آلتو = ارتفاع ؛ } 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؛}} void drawNuPu (باطل) {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 = 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_)، ؛ 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، "Hello Text")؛ glutBitmAPCharacter (GLUT_AP_WARES، GLUT ') ؛* / /*glColor3f (1. 0f ، 1.0f ، 1.0f) ؛ setOrthographicProjection ()؛ glPushMatrix ()؛ glLoadIdentity ()؛ renderBitmapString (فونت 30 ، 15 ، (void *) ، "GLUT Tutorial ---_ ------ _@ 3D Tech")؛ */ glFlush () ؛ glutSwapBuffers ()؛ anguloCuboX+= 0.1f ؛ anguloCuboY+= 0.1f ؛ anguloEsfera+= 0.2f ؛ } void init () {glClearColor (0 ، 0 ، 0 ، 0) ؛ glEnable (GL_DEPTH_TEST) ؛ ancho = 500 ؛ آلتو = 500 ؛ } void leer () {ifstream myfile ("A:/Respaldo sept 2016/D/Respaldos/Respaldo compu CICATA abril 2015/usb1/rekostruccion 3D en Special Special CICATA/Software/Reconstruccion 3D/R3d_0 / bin/Debug/NuPu.t")؛ if (myfile.is_open ()) {s = 0؛ while (getline (myfile، line)) {if ((خط [0]! = 'N') && (خط [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 ؛ // Aux [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) {switch (key) {case 'p': case 'P': hazPerspectiva = 1؛ تغییر شکل (آنچو ، آلتو) ؛ زنگ تفريح؛ مورد 'o': مورد '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 = button؛ پلبوت = حالت ؛ // 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؛ } نمایش دادن()؛ } int main (int argc، char ** argv) { /*glutAddMenuEntry () glutAddSubMenu () glutAttachMenu () glutCreateMenu () glutSetMenu () glutStrokeCharacter () glutStrokeLength ()* /gl*سرعت خواندن* / /** فریم بافر glGetPixelMapfv () نقشه پیکسل مشخص شده را باز می گرداند glGetPixelMapuiv () نقشه پیکسل مشخص شده را باز می گرداند glGetPointerv () آدرس اشاره گر مشخص شده را برمی گرداند.*/ Init ()؛ leer ()؛ glutInit (& argc، argv)؛ glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB) ؛ glutInitWindowPosition (50 ، 50) ؛ glutInitWindowSize (آنچو ، آلتو) ؛ glutCreateWindow ("Cubo 1") ؛ init ()؛ glutDisplayFunc (نمایش) ؛ glutReshapeFunc (تغییر شکل) ؛ glutIdleFunc (بیکار) ؛ glutMouseFunc (راتون) ؛ glutMotionFunc (ratmov) ؛ glutKeyboardFunc (صفحه کلید) ؛ glutMainLoop ()؛ بازگشت 0 ؛ }

مرحله 5:

تصویر
تصویر

فعلا باید متوقف شوم! … اما در فصل بعدی به شما قول می دهم که آن را روی تمشک pi 3 یا نانوبورد جتسون خود ، که قبلاً روی هواپیماهای کنترل از راه دور نصب شده است ، یا روی برخی از ربات های عنکبوتی برای اسکن داخلی غارها ، پیاده سازی می کنم.

توصیه شده: