جدول المحتويات:

الماسح الضوئي الأساسي ثلاثي الأبعاد لرسم الخرائط الرقمية ثلاثية الأبعاد: 5 خطوات
الماسح الضوئي الأساسي ثلاثي الأبعاد لرسم الخرائط الرقمية ثلاثية الأبعاد: 5 خطوات

فيديو: الماسح الضوئي الأساسي ثلاثي الأبعاد لرسم الخرائط الرقمية ثلاثية الأبعاد: 5 خطوات

فيديو: الماسح الضوئي الأساسي ثلاثي الأبعاد لرسم الخرائط الرقمية ثلاثية الأبعاد: 5 خطوات
فيديو: امتحانات التوجيهي في اللغة العربية للطلاب الفلسطينيين، لدي لكم نصيحة مع مثال اسمعوها جيدًا 2024, يونيو
Anonim
الماسح الضوئي الأساسي ثلاثي الأبعاد لرسم الخرائط الرقمية ثلاثية الأبعاد
الماسح الضوئي الأساسي ثلاثي الأبعاد لرسم الخرائط الرقمية ثلاثية الأبعاد

في هذا المشروع ، سأشرح وأشرح الأسس الأساسية للمسح الضوئي ثلاثي الأبعاد وإعادة البناء المطبق بشكل أساسي على مسح الأجسام شبه المستوية الصغيرة ، والتي يمكن أن تمتد عملياتها لتشمل أنظمة المسح وإعادة البناء التي يمكن تثبيتها على طائرات التحكم عن بعد للحصول عليها. نموذج ثلاثي الأبعاد. من الأماكن التي تم تركيب الذباب فيها بالطائرة التي تقلهم

الفكرة النهائية هي الحصول على مسح ثلاثي الأبعاد لمكان أو منطقة ما ، سواء كانت خارجية أو داخلية ، لاستخدامها كخريطة رقمية (كما في فيلم بروميتوس)

الخطوة 1:

صورة
صورة

الفكرة هي تثبيت نظام المسح ثلاثي الأبعاد بالكامل على طائرة يتم التحكم فيها عن بعد ، من أجل رقمنة الخريطة الافتراضية لأي منطقة تطير فوقها بشكل ثلاثي الأبعاد ، ولكن لهذا بدأنا من بداية تشغيل طريقة التثليث بالليزر. المسح أو إعادة البناء ثلاثي الأبعاد عن طريق التثليث بالليزر يتكون أساسًا من تمرير شعاع ليزر عبر منشور يولد شريط ليزر للحصول على شريط ليزر كامل سيتم عرضه على كائن ليتم مسحه ضوئيًا ، وبمجرد الحصول على إسقاط الليزر هذا على السطح السطحي من مكان المسح الضوئي ، يجب التقاط الصورة بنوع من الكاميرات ويفضل معرفة الزاوية التي يتم تشكيلها فيما يتعلق بزاوية الإسقاط لشريط الليزر المنبعث ، لأن كل صورة من هذه الصور تلتقط شرائط الليزر المسقطة. على سطح الكائن ، ستتم معالجتها مسبقًا لاستخراج الخصائص الأبعاد للكائن المراد مسحه ضوئيًا ، وببساطة مسح الشريط بشريط فوق الكائن للحصول على ملف تعريف سطحه في هذا المقطع العرضي للكائن ، ثم التقاطه لاحقًا الشريط المسقط للمقطع العرضي التالي من الكائن ، لإضافة جميع الخطوط المسقطة معًا قبل جميع المقاطع العرضية للقطعة ، نحصل على مسح ثلاثي الأبعاد لسطحه

الخطوة 2:

صورة
صورة

نظرًا لأننا حددنا هدفنا ، فإن الخطوة التالية مع العلم أنه من أجل الإقلاع ، يجب أولاً وضع قدميك بثبات على الأرض ، لذلك بدأنا على الأرض بنموذج أولي تجريبي لماسحة ضوئية خطية ثلاثية الأبعاد ، للتحقق من صحة التشغيل الصحيح للأساسيات ماسح ضوئي ثلاثي الأبعاد وكما ترون في الصورة أعلاه ، لقد استخدمت جهاز كمبيوتر ، OpenCV ، Glut of OpenGL ، كاميرا ويب ، ليزر ، مولد مزرعة ليزر (في هذه الحالة من خلال مرآة دوارة) نظام إزاحة خطي إلكتروني (مصنوع من سكة حديدية) ونظام مستخرج من طابعة قديمة) من قاعدة أضع عليها الأشياء المراد مسحها ضوئيًا ، من الخشب والبلاستيك وكما ترون في الصورة ، على الكمبيوتر: تمكنت من إنشاء وعرض Glut من OpenGL وهو ثلاثة- نموذج الأبعاد المعاد إنتاجه بناءً على الكائن الحقيقي الممسوح ضوئيًا (في هذه الحالة لعبة العنكبوت)

لذلك فمن الواضح أكثر من أن مبدأ التشغيل وظيفي ، وأنه من خلال التعديلات والتكيفات الخاصة به مع نظام الطيران ، فإنه سيكون قادرًا على مسح وإعادة إنتاج خريطة ثلاثية الأبعاد للمنطقة التي يطير فيها.

لكن هذا النظام لن يعمل إلا في الحصول على خرائط ثلاثية الأبعاد للسطح الخارجي للأماكن التي يطير فوقها ؟؟؟ …

الخطوه 3:

صورة
صورة

رسم الخرائط الداخلية للكهوف والقنوات (تمامًا كما في فيلم Prometeus) يعمل نظام المسح ثلاثي الأبعاد هذا أيضًا على إعادة بناء نماذج ثلاثية الأبعاد للأجسام الكبيرة والجوفاء مثل الكهوف والمباني والأنفاق وما إلى ذلك. تمامًا كما تم وصفه بالفعل والذي يتكون أساسًا مما يلي:

  1. التقط صورة كل إسقاط لشريط الليزر على السطح ليتم مسحه ضوئيًا
  2. تصفية وإزالة اللون من الصورة
  3. قم بترميز اللون باستخدام عتبة صورة ديناميكية
  4. تطبيق كاشف الحافة للتعرف على المظهر الجانبي الملتقط لكل مقطع عرضي لإسقاط الليزر
  5. وباستخدام التجزئة ، حدد الحد المناسب للتمثيل ثلاثي الأبعاد لهذا المقطع العرضي للكائن المراد مسحه ضوئيًا وإعادة بنائه على الخريطة الافتراضية ثلاثية الأبعاد
  6. ثم يتم تكرار هذه الخطوات ببساطة لكل صورة تم التقاطها بطريقة فرعية من خطوط الليزر المسقطة بشكل مستمر بواسطة كل قسم فرعي في القسم الفرعي.
  7. تتم إضافة طبقة تلو الأخرى لتمثيل المقاطع العرضية على التوالي حتى الحصول على نقطة سحابة تتكون من العديد من تمثيلات المقاطع العرضية للكائن المراد تعيينه

الخطوة الرابعة:

صورة
صورة

ثم أجتاز برامج معالجة الصور لإسقاطات شرائط الليزر السطحية. وإعادة الإعمار الافتراضية ثلاثية الأبعاد لهذه التمثيلات المستعرضة المتقاطعة في نموذج الخريطة ثلاثي الأبعاد المفصل:

معالجة الصورة:

ن

# تضمين # تضمين "cv.h" # تضمين "highgui.h" # تضمين // # تضمين # تضمين # تضمين # تضمين

شار و = 0 ؛ اسم char = {"0.jpg"} ؛ int n = 0 ، s ، x ، y ؛ CvScalar sp ؛ ملف * NuPu ؛

Writepoints () باطلة {char bufferx [33] ، buffery [33] ؛ itoa (x، bufferx، 10) ؛ إيتوا (ذ ، المخزن ، 10) ؛ fprintf (NuPu ، المخزن المؤقت) ؛ 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] = و ؛ 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]؛ إيتوا (ن ، عازلة ، 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 ؛ }

إعادة الإعمار ثلاثي الأبعاد:

تضمين

#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) using namespace std؛ int s ، Boton = 1 ، Pulbut = 1 ؛ تعويم mx = 0 ، بلدي = 0 ، mtx = 0 ، mty = 0 ، mtz = -5.0 ؛ كونست أفانس = 1 ؛ خط السلسلة ، Aux ؛ char Caracter = 'H' ؛ ملف * NuPu ؛ int NP ، h ، w ؛ تعويم G = 0 ، n = 0 ، cx [5000] ، cy [5000] ، x ، y ، ax ، ay ، az ؛ الخط int = (int) GLUT_BITMAP_8_BY_13 ؛ تسمية شار ثابتة [100] ؛ شار عازلة [3] ؛ GLfloat anguloCuboX = 0.0f ؛ GLfloat anguloCuboY = 0.0f ؛ GLfloat anguloEsfera = 0.0f ؛ GLint ancho = 500 ؛ جلينت ألتو = 500 ؛ int HazPerspectiva = 0 ؛ إعادة تشكيل باطلة (عرض int ، ارتفاع int) {glViewport (0، 0، width، height) ؛ glMatrixMode (GL_PROJECTION) ، glLoadIdentity () ، إذا (hazPerspectiva) gluPerspective (23.0f ، (GLfloat) العرض / (GLfloat) الارتفاع ، 1.0f ، 20.0f) ؛ آخر glOrtho (-1 ، 1 ، -1 ، 1 ، -10 ، 10) ؛ glMatrixMode (GL_MODELVIEW) ، أنشو = عرض ؛ ألتو = ارتفاع ؛ } void Kolorear (int K) {float Hip؛ س = (cx [s] -320) / 480 ؛ y = (cy [s] -240) / 640 ؛ الورك = الجذر التربيعي (الأسرى (س ، 2) + الأسرى (ص ، 2)) ؛ إذا ((الورك = 0) && (الورك =.07) && (الورك =.14) && (الورك =.21) && (الورك =.28) && (الورك =.35) && (الورك =.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 () ، روجو. glBegin (GL_POINTS) ، لـ (n = 0 ؛ n <10 ؛ n ++) {لـ (s = 0 ؛ s void setOrthographicProject () {glMatrixMode (GL_PROJECTION)؛ glPushMatrix ()؛ glLoadIdentity ()؛ gluOrtho2D (0، w، 0، h)؛ glScalef (1، -1، 1)؛ glTranslatef (0، -h، 0)؛ glMatrixMode (GL_MODELVIEW)؛} renderBitmapString باطلة (float x، float y، void * font، char * string) {char * c؛ glRasterPos2f (x ، y)؛ لـ (c = string؛ * c! = '\ 0'؛ c ++) {glutBitmapCharacter (font، * c)؛}} عرض باطل () {// 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_R) ؛ ؛ 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 (GLUES_BITMAP)) ؛ * / / * glColor3f (1. 0f ، 1.0f ، 1.0f) ؛ setOrthographicProject () ، glPushMatrix () ، glLoadIdentity () ، RenderBitmapString (30، 15، (void *) font، "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) ، أنشو = 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") ؛ إذا (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 بدون إشارة ، int x ، int y) {switch (key) {case 'p': case 'P': hazPerspectiva = 1؛ إعادة تشكيل (أنشو ، ألتو) ؛ استراحة؛ الحالة "o": الحالة "O": hazPerspectiva = 0 ؛ إعادة تشكيل (أنشو ، ألتو) ؛ استراحة؛ الحالة 27: // مخرج الهروب (0) ؛ استراحة؛ }} معدل باطل (زر 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 = حالة ؛ // م س = ص ؛ عرض()؛ } باطل ratmov (int x، int y) {if ((Boton == 0) & (Pulbut == 0)) {mx = y؛ بلدي = س ؛ } إذا ((بوتون == 2) & (Pulbut == 0)) {mtx = (y / 200) -1 ؛ mty = (x / 200] -1 ؛ } إذا ((Boton == 1) & (Pulbut == 0)) {mtz = - (y / 40) -5 ؛ } عرض()؛ } int main (int argc، char ** argv) {/ * glutAddMenuEntry () glutAddSubMenu () glutAttachMenu () glutCreateMenu () glutSetMenu () glutStrokeCharacter () glutStrokeLength () * / / () read of pixels المخزن المؤقت للإطار glGetPixelMapfv () إرجاع خريطة البكسل المحددة glGetPixelMapuiv () إرجاع خريطة البكسل المحددة glGetPointerv () إرجاع عنوان المؤشر المحدد. * / التهيئة () ؛ لير () ؛ glutInit (& argc، argv) ؛ glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB) ، glutInitWindowPosition (50 ، 50) ؛ glutInitWindowSize (أنشو ، ألتو) ؛ glutCreateWindow ("كوبو 1") ؛ فيه()؛ glutDisplayFunc (عرض) ؛ glutReshapeFunc (إعادة تشكيل) ؛ glutIdleFunc (خامل) ؛ glutMouseFunc (راتون) ؛ glutMotionFunc (ratmov) ؛ glutKeyboardFunc (لوحة المفاتيح) ؛ glutMainLoop () ، العودة 0 ؛ }

الخطوة الخامسة:

صورة
صورة

في الوقت الحالي لا بد لي من التوقف! … ولكن في الفصل التالي ، أعدك بأنني سأقوم بتطبيقه على raspberry pi 3 أو لوحتي النانوية النانوية ، المثبت بالفعل على بعض الطائرات التي يتم التحكم فيها عن بُعد ، أو على روبوت عنكبوتي لفحص الكهوف من الداخل

موصى به: