جدول المحتويات:
فيديو: الماسح الضوئي الأساسي ثلاثي الأبعاد لرسم الخرائط الرقمية ثلاثية الأبعاد: 5 خطوات
2024 مؤلف: John Day | [email protected]. آخر تعديل: 2024-01-30 07:37
في هذا المشروع ، سأشرح وأشرح الأسس الأساسية للمسح الضوئي ثلاثي الأبعاد وإعادة البناء المطبق بشكل أساسي على مسح الأجسام شبه المستوية الصغيرة ، والتي يمكن أن تمتد عملياتها لتشمل أنظمة المسح وإعادة البناء التي يمكن تثبيتها على طائرات التحكم عن بعد للحصول عليها. نموذج ثلاثي الأبعاد. من الأماكن التي تم تركيب الذباب فيها بالطائرة التي تقلهم
الفكرة النهائية هي الحصول على مسح ثلاثي الأبعاد لمكان أو منطقة ما ، سواء كانت خارجية أو داخلية ، لاستخدامها كخريطة رقمية (كما في فيلم بروميتوس)
الخطوة 1:
الفكرة هي تثبيت نظام المسح ثلاثي الأبعاد بالكامل على طائرة يتم التحكم فيها عن بعد ، من أجل رقمنة الخريطة الافتراضية لأي منطقة تطير فوقها بشكل ثلاثي الأبعاد ، ولكن لهذا بدأنا من بداية تشغيل طريقة التثليث بالليزر. المسح أو إعادة البناء ثلاثي الأبعاد عن طريق التثليث بالليزر يتكون أساسًا من تمرير شعاع ليزر عبر منشور يولد شريط ليزر للحصول على شريط ليزر كامل سيتم عرضه على كائن ليتم مسحه ضوئيًا ، وبمجرد الحصول على إسقاط الليزر هذا على السطح السطحي من مكان المسح الضوئي ، يجب التقاط الصورة بنوع من الكاميرات ويفضل معرفة الزاوية التي يتم تشكيلها فيما يتعلق بزاوية الإسقاط لشريط الليزر المنبعث ، لأن كل صورة من هذه الصور تلتقط شرائط الليزر المسقطة. على سطح الكائن ، ستتم معالجتها مسبقًا لاستخراج الخصائص الأبعاد للكائن المراد مسحه ضوئيًا ، وببساطة مسح الشريط بشريط فوق الكائن للحصول على ملف تعريف سطحه في هذا المقطع العرضي للكائن ، ثم التقاطه لاحقًا الشريط المسقط للمقطع العرضي التالي من الكائن ، لإضافة جميع الخطوط المسقطة معًا قبل جميع المقاطع العرضية للقطعة ، نحصل على مسح ثلاثي الأبعاد لسطحه
الخطوة 2:
نظرًا لأننا حددنا هدفنا ، فإن الخطوة التالية مع العلم أنه من أجل الإقلاع ، يجب أولاً وضع قدميك بثبات على الأرض ، لذلك بدأنا على الأرض بنموذج أولي تجريبي لماسحة ضوئية خطية ثلاثية الأبعاد ، للتحقق من صحة التشغيل الصحيح للأساسيات ماسح ضوئي ثلاثي الأبعاد وكما ترون في الصورة أعلاه ، لقد استخدمت جهاز كمبيوتر ، OpenCV ، Glut of OpenGL ، كاميرا ويب ، ليزر ، مولد مزرعة ليزر (في هذه الحالة من خلال مرآة دوارة) نظام إزاحة خطي إلكتروني (مصنوع من سكة حديدية) ونظام مستخرج من طابعة قديمة) من قاعدة أضع عليها الأشياء المراد مسحها ضوئيًا ، من الخشب والبلاستيك وكما ترون في الصورة ، على الكمبيوتر: تمكنت من إنشاء وعرض Glut من OpenGL وهو ثلاثة- نموذج الأبعاد المعاد إنتاجه بناءً على الكائن الحقيقي الممسوح ضوئيًا (في هذه الحالة لعبة العنكبوت)
لذلك فمن الواضح أكثر من أن مبدأ التشغيل وظيفي ، وأنه من خلال التعديلات والتكيفات الخاصة به مع نظام الطيران ، فإنه سيكون قادرًا على مسح وإعادة إنتاج خريطة ثلاثية الأبعاد للمنطقة التي يطير فيها.
لكن هذا النظام لن يعمل إلا في الحصول على خرائط ثلاثية الأبعاد للسطح الخارجي للأماكن التي يطير فوقها ؟؟؟ …
الخطوه 3:
رسم الخرائط الداخلية للكهوف والقنوات (تمامًا كما في فيلم Prometeus) يعمل نظام المسح ثلاثي الأبعاد هذا أيضًا على إعادة بناء نماذج ثلاثية الأبعاد للأجسام الكبيرة والجوفاء مثل الكهوف والمباني والأنفاق وما إلى ذلك. تمامًا كما تم وصفه بالفعل والذي يتكون أساسًا مما يلي:
- التقط صورة كل إسقاط لشريط الليزر على السطح ليتم مسحه ضوئيًا
- تصفية وإزالة اللون من الصورة
- قم بترميز اللون باستخدام عتبة صورة ديناميكية
- تطبيق كاشف الحافة للتعرف على المظهر الجانبي الملتقط لكل مقطع عرضي لإسقاط الليزر
- وباستخدام التجزئة ، حدد الحد المناسب للتمثيل ثلاثي الأبعاد لهذا المقطع العرضي للكائن المراد مسحه ضوئيًا وإعادة بنائه على الخريطة الافتراضية ثلاثية الأبعاد
- ثم يتم تكرار هذه الخطوات ببساطة لكل صورة تم التقاطها بطريقة فرعية من خطوط الليزر المسقطة بشكل مستمر بواسطة كل قسم فرعي في القسم الفرعي.
تتم إضافة طبقة تلو الأخرى لتمثيل المقاطع العرضية على التوالي حتى الحصول على نقطة سحابة تتكون من العديد من تمثيلات المقاطع العرضية للكائن المراد تعيينه
الخطوة الرابعة:
ثم أجتاز برامج معالجة الصور لإسقاطات شرائط الليزر السطحية. وإعادة الإعمار الافتراضية ثلاثية الأبعاد لهذه التمثيلات المستعرضة المتقاطعة في نموذج الخريطة ثلاثي الأبعاد المفصل:
معالجة الصورة:
ن
# تضمين # تضمين "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 أو لوحتي النانوية النانوية ، المثبت بالفعل على بعض الطائرات التي يتم التحكم فيها عن بُعد ، أو على روبوت عنكبوتي لفحص الكهوف من الداخل
موصى به:
نصائح لرسم الخرائط: 3 خطوات
نصائح لرسم الخرائط: مهما كان نشاطك ، سواء كان المشي أو المشي لمسافات طويلة أو ركوب الدراجات أو حتى القيادة ، يمكنك تسجيل الطرق التي تسلكها. ثم يمكنك مشاركة تلك الطرق مع الأصدقاء والعائلة. بالإضافة إلى ذلك ، يمكنك استخدام المسار المسجل لإضافة مواقع إلى أي صور قد ترغب فيها
كلب آلي مطبوع ثلاثي الأبعاد (روبوتات وطباعة ثلاثية الأبعاد للمبتدئين): 5 خطوات
الكلب الآلي المطبوع ثلاثي الأبعاد (الروبوتات والطباعة ثلاثية الأبعاد للمبتدئين): الروبوتات والطباعة ثلاثية الأبعاد هي أشياء جديدة ، ولكن يمكننا استخدامها! يعد هذا المشروع مشروعًا جيدًا للمبتدئين إذا كنت في حاجة إلى فكرة مهمة مدرسية ، أو كنت تبحث فقط عن مشروع ممتع للقيام به
مخطط الخرائط - نظام الخرائط + الإخطار: 9 خطوات
The Mappifier - Mapping + Notification System: القيادة الليلية ممتعة للغاية. لكن في كثير من الأحيان ، يتضح أنه كابوس ، في شكل حيوانات تعبر الطريق (خاصة تلك القطط والكلاب الضالة ، التي تنتظرك للقيادة بالقرب منها حتى تتمكن من العبور !!). لذلك فكرت في جعل ذلك
حاوية حرارية للطابعة ثلاثية الأبعاد: إصلاح الالتفاف على المطبوعات ثلاثية الأبعاد: 4 خطوات
العلبة الحرارية للطابعة ثلاثية الأبعاد: إصلاح الالتواء على المطبوعات ثلاثية الأبعاد: واجه كل شخص لديه طابعة ثلاثية الأبعاد في وقت ما مشكلة الالتواء. المطبوعات التي تستغرق ساعات ينتهي بها الأمر للتلف لأن القاعدة تقشر بعيدًا عن السرير. قد تكون هذه المشكلة محبطة وتستغرق وقتًا طويلاً. إذن ما cau
مروحية ثلاثية الأبعاد مطبوعة ثلاثية الأبعاد FPV يتم التحكم فيها عبر شبكة Wifi Micro: 7 خطوات (مع صور)
مروحية Micro Wifi ثلاثية الأبعاد مطبوعة FPV مطبوعة ثلاثية الأبعاد: بعد أول كتابين لي & quot؛ WifiPPM & quot؛ و & quot؛ Lowcost 3d Fpv Camera لنظام Android & quot؛ أريد أن أظهر كوادكوبتر الصغير مع كلا الجهازين المرفقين. لا تحتاج إلى أي أجهزة إضافية مثل جهاز إرسال RC أو نظارات FPV لذلك