সুচিপত্র:

ডিজিটাল 3D ম্যাপিং এর জন্য বেসিক 3D স্ক্যানার: 5 টি ধাপ
ডিজিটাল 3D ম্যাপিং এর জন্য বেসিক 3D স্ক্যানার: 5 টি ধাপ

ভিডিও: ডিজিটাল 3D ম্যাপিং এর জন্য বেসিক 3D স্ক্যানার: 5 টি ধাপ

ভিডিও: ডিজিটাল 3D ম্যাপিং এর জন্য বেসিক 3D স্ক্যানার: 5 টি ধাপ
ভিডিও: কিভাবে একটি এক্সেল সম্পূর্ণ স্বয়ংক্রিয় কর্মচারী সময় ঘড়ি তৈরি করবেন [কর্মচারী ব্যবস্থাপক Pt. 10] 2024, জুন
Anonim
ডিজিটাল 3D ম্যাপিং এর জন্য বেসিক 3D স্ক্যানার
ডিজিটাল 3D ম্যাপিং এর জন্য বেসিক 3D স্ক্যানার

এই প্রকল্পে, আমি 3D স্ক্যানিং এবং পুনর্গঠনের প্রাথমিক ভিত্তিগুলি বর্ণনা করব এবং ব্যাখ্যা করব যা প্রাথমিকভাবে ছোট আধা-সমতল বস্তুর স্ক্যানিংয়ের জন্য প্রয়োগ করা হয়, এবং যার ক্রিয়াকলাপ স্ক্যানিং এবং পুনর্গঠন ব্যবস্থায় বাড়ানো যেতে পারে যা রিমোট কন্ট্রোল বিমানগুলিতে ইনস্টল করা যেতে পারে একটি 3D মডেল। যেসব স্থানে বিমান তাদের ইনস্টল করে সেখানে উড়ে যায়

চূড়ান্ত ধারণা হল কোন স্থান বা এলাকার একটি 3D স্ক্যান, তার বাহ্যিক বা অভ্যন্তর, এটি একটি ডিজিটাল মানচিত্র হিসাবে ব্যবহার করার জন্য

ধাপ 1:

ছবি
ছবি

ধারণাটি হল একটি রিমোট-নিয়ন্ত্রিত সমতলে সম্পূর্ণ 3 ডি স্ক্যানিং সিস্টেম ইনস্টল করা, যাতে যেকোনো এলাকার ভার্চুয়াল ম্যাপ ডিজিটালাইজ করা যায় যার উপর দিয়ে এটি 3 ডি তে উড়ে যায়, কিন্তু এর জন্য আমরা লেজার ট্রায়াঙ্গুলেশন পদ্ধতির অপারেশনের শুরু থেকে শুরু করেছি লেজার ট্রায়াঙ্গুলেশন দ্বারা স্ক্যানিং বা 3 ডি পুনর্গঠন মূলত একটি প্রিজমের মাধ্যমে একটি লেজার রশ্মি তৈরি করে যা একটি লেজার স্ট্রাইপ তৈরি করে যা একটি সম্পূর্ণ লেজার স্ট্রাইপ অর্জন করে যা স্ক্যান করার জন্য একটি বস্তুর উপর প্রজেক্ট করা হবে, এবং একবার এই লেজার প্রজেকশনটি পেয়ে গেলে পৃষ্ঠতল স্থান থেকে স্ক্যান করার জন্য, ছবিটি অবশ্যই কিছু ধরণের ক্যামেরা দিয়ে ধারণ করতে হবে এবং নির্গত লেজার স্ট্রাইপের অভিক্ষেপ কোণের ক্ষেত্রে যে কোণটি তৈরি হয় তা জেনে রাখা উচিত, যেহেতু এই ছবিগুলির প্রত্যেকটি প্রক্ষিপ্ত লেজার স্ট্রিপগুলি ধারণ করে। বস্তুর পৃষ্ঠে, সেগুলি স্ক্যান করার জন্য বস্তুর মাত্রিক বৈশিষ্ট্যগুলি বের করার জন্য প্রাকপ্রক্রিয়া করা হবে, এবং বস্তুর উপরে থাকা স্ট্রিপ দ্বারা স্ট্রিপটি স্ক্যান করে বস্তুর সেই ট্রান্সভার্স সেগমেন্টে তার পৃষ্ঠের প্রোফাইল পেতে এবং পরবর্তীতে ক্যাপচার করতে হবে বস্তুর নিচের ক্রস সেকশনের প্রজেক্টেড স্ট্রিপ, সব প্রজেক্টেড স্ট্রাইপ একসাথে যোগ করার জন্য obto এর সমস্ত ক্রস সেকশনের আগে আমরা এর পৃষ্ঠের একটি ত্রিমাত্রিক স্ক্যান পাই

ধাপ ২:

ছবি
ছবি

যেহেতু আমরা আমাদের উদ্দেশ্য চিহ্নিত করেছি, পরের ধাপে জেনেছি যে আপনাকে নামাতে হলে প্রথমে আপনার পা মাটিতে দৃ have়ভাবে রাখতে হবে, তাই আমরা একটি রৈখিক 3 ডি স্ক্যানারের পরীক্ষামূলক প্রোটোটাইপ দিয়ে মাটিতে শুরু করেছি, যাতে মৌলিকটির সঠিক অপারেশন যাচাই করা যায়। 3 ডি স্ক্যানার এবং উপরের ছবিতে আপনি দেখতে পাচ্ছেন, আমি একটি পিসি, ওপেনসিভি, গ্লুট অফ ওপেনজিএল, একটি ওয়েবক্যাম, একটি লেজার, লেজার ফার্ম জেনারেটর (এই ক্ষেত্রে একটি ঘূর্ণমান আয়নার মাধ্যমে) ব্যবহার করেছি একটি ইলেকট্রনিক লিনিয়ার ডিসপ্লেসমেন্ট সিস্টেম (একটি রেল দিয়ে তৈরি) এবং একটি পুরানো প্রিন্টার থেকে বের করা সিস্টেম) একটি বেস থেকে যার উপর আমি স্ক্যান করা বস্তু, কাঠ এবং প্লাস্টিসিন রাখি এবং যেমন আপনি ছবিতে দেখতে পাচ্ছেন, কম্পিউটারে: আমি ওপেনজিএল থেকে গ্লুট দিয়ে তিনটি তৈরি করতে এবং প্রদর্শন করতে পরিচালিত করেছি স্ক্যান করা বাস্তব বস্তুর উপর ভিত্তি করে পুনরুত্পাদন করা মাত্রিক মডেল (এই ক্ষেত্রে একটি খেলনা মাকড়সা)

তাই এটি স্পষ্ট যে অপারেটিং নীতিটি কার্যকরী, এবং এটি একটি উড়ন্ত ব্যবস্থার সাথে তার নিজ নিজ সমন্বয় এবং অভিযোজনের সাথে এটি যে এলাকায় উড়ে যায় তার একটি 3 ডি মানচিত্র স্ক্যান এবং পুনরুত্পাদন করতে সক্ষম হবে।

কিন্তু এই সিস্টেমটি শুধুমাত্র যে জায়গাগুলো দিয়ে উড়ে যায় তার বাহ্যিক পৃষ্ঠের 3D মানচিত্র পাওয়ার জন্য কাজ করবে ???…

ধাপ 3:

ছবি
ছবি

গুহা এবং নালীগুলির অভ্যন্তরের ম্যাপিং (ঠিক প্রোমিটাস মুভির মতো) এই থ্রিডি স্ক্যানিং সিস্টেমটি গুহা, ভবন, টানেল ইত্যাদির মতো বড় এবং ফাঁপা বস্তুর অভ্যন্তরের ত্রিমাত্রিক মডেল পুনর্গঠনের কাজ করে। ঠিক যেমনটি ইতিমধ্যে বর্ণিত হয়েছে এবং যা মূলত নিম্নলিখিতগুলি নিয়ে গঠিত:

  1. স্ক্যান করার জন্য পৃষ্ঠের লেজার স্ট্রাইপের প্রতিটি অভিক্ষেপের ছবি ক্যাপচার করুন
  2. ফিল্টার করুন এবং ছবি থেকে রঙ সরান
  3. একটি ডাইনামিক ইমেজ থ্রেশহোল্ড দিয়ে রঙকে বাইনারাইজ করুন
  4. প্রতিটি লেজার প্রজেকশন ক্রস সেকশনের ক্যাপচার করা প্রোফাইল চিনতে একটি এজ ডিটেক্টর প্রয়োগ করুন
  5. এবং বিভাজন ব্যবহার করে বস্তুর সেই ক্রস বিভাগের 3 ডি উপস্থাপনার জন্য উপযুক্ত সীমানা নির্বাচন করুন যা ভার্চুয়াল 3D মানচিত্রে স্ক্যান এবং পুনর্গঠন করা হবে
  6. তারপর লেজার স্ট্রাইপগুলির একটি উপ-পদ্ধতিতে তোলা প্রতিটি ছবির জন্য এই ধাপগুলি কেবল পুনরাবৃত্তি করা হয় যা উপ-বিভাগে প্রতিটি উপ-বিভাগ দ্বারা ক্রমাগত প্রজেক্ট করা হয়।
  7. ক্রস সেকশনের প্রতিনিধিত্বের স্তর স্তর পরপর যোগ করা হয় যতক্ষণ না বস্তুর ক্রস বিভাগের অনেক উপস্থাপনা দ্বারা গঠিত একটি বিন্দু মেঘ না পাওয়া যায়

ধাপ 4:

ছবি
ছবি

তারপর আমি পৃষ্ঠতল লেজার স্ট্রিপগুলির অনুমানের চিত্র প্রক্রিয়াকরণের জন্য প্রোগ্রামগুলি পাস করি। এবং বিস্তৃত ত্রিমাত্রিক মানচিত্রের মডেলে এই তীব্র উত্তেজনাপূর্ণ উপস্থাপনার ভার্চুয়াল 3 ডি পুনর্গঠনের:

চিত্র প্রক্রিয়াকরণ:

n

#অন্তর্ভুক্ত #অন্তর্ভুক্ত "cv.h" #অন্তর্ভুক্ত "highgui.h" #অন্তর্ভুক্ত // #অন্তর্ভুক্ত #অন্তর্ভুক্ত #অন্তর্ভুক্ত #অন্তর্ভুক্ত

char f = 0; চার নাম = {"0.jpg"}; int n = 0, s, x, y; CvScalar sp; ফাইল *NuPu;

অকার্যকর Writepoints () {char bufferx [33], buffery [33]; itoa (x, বাফারক্স, 10); itoa (y, বাফারি, 10); fprintf (NuPu, বাফারক্স); 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 << "টেকলিয়া!…:" f; নাম [0] = চ; cout <

IplImage* img0 = cvLoadImage ("00.jpg", 0); যদি (f == '0') {for (y = 1; yheight-2; y ++) {for (x = 1; xwidth-2; x ++) {sp = cvGet2D (img0, y, x); যদি (sp.val [0]> 50) {Writepoints (); n ++;}}}} অন্য {{(= = 1; yheight-2; y ++) {জন্য (x = 1; xwidth-2; x ++) { sp = cvGet2D (img1, y, x); যদি (sp.val [0]> 50) {Writepoints (); n ++;}}}} চর বাফার [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; }

3D পুনর্গঠন:

#অন্তর্ভুক্ত ////////////////// #ifdef _APPLE_ #অন্তর্ভুক্ত করুন

#সংজ্ঞায়িত ভায়োলেট 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) #সংজ্ঞায়িত করুন naranja glColor3f (1,.3, 0) #সংজ্ঞায়িত করুন 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; স্ট্রিং লাইন, অক্স; C 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; GLint alto = 500; int hazPerspectiva = 0; অকার্যকর আকার পরিবর্তন (int width, int height) {glViewport (0, 0, width, height); glMatrixMode (GL_PROJECTION); glLoadIdentity (); যদি (hazPerspectiva) gluPerspective (23.0f, (GLfloat) width/(GLfloat) height, 1.0f, 20.0f); অন্যথায় glOrtho (-1, 1, -1, 1, -10, 10); glMatrixMode (GL_MODELVIEW); ancho = প্রস্থ; আল্টো = উচ্চতা; } অকার্যকর Kolorear (int K) {ভাসমান নিতম্ব; x = (cx [s] -320)/480; y = (cy [s] -240)/640; হিপ = sqrt (pow (x, 2)+pow (y, 2)); যদি ((হিপ> = 0) && (হিপ =.07) && (হিপ =.14) && (হিপ =.21) এবং && (হিপ <=। 49)) {ভায়োলেট;}} void drawNuPu (void) {glColor3f (1, 1, 1); গ্লবেগিন (GL_LINES); glVertex3f (.2, 0, 0); glVertex3f (-। 2, 0, 0); glVertex3f (0,.2, 0); glVertex3f (0, -2, 0); glEnd (); রোজো; গ্লবেগিন (GL_POINTS); জন্য (n = 0; n <10; n ++) {for (s = 0; s void setOrthographicProjection () {glMatrixMode (GL_PROJECTION); (১, -1, ১); glTranslatef (0, -h, 0); glMatrixMode (GL_MODELVIEW);, 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); s গুলি 1.0f, 0.0f); drawNuPu (); /*glColor3f (1.0, 1.0, 1.0); glRasterPos2f (.5,.5); // glutBitmapString (GLUT_BITMAP_TIMES_ROMAN_24, "হ্যালো টেক্সট"); * / /*glColor3f (1। 0f, 1.0f, 1.0f); setOrthographicProjection (); glPushMatrix (); glLoadIdentity (); renderBitmapString (30, 15, (void *) font, "GLUT Tutorial ---_ ------ _@ 3D Tech"); */ glFlush (); glutSwapBuffers (); anguloCuboX+= 0.1f; anguloCuboY+= 0.1f; anguloEsfera+= 0.2f; } অকার্যকর 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 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 ()); অক্স [4] = 48; অক্স [5] = 48; অক্স [6] = 48; // অক্স [7] = 48; cx [s] = atoi (Aux.c_str ()); s ++; }} myfile.close (); } অন্য cout <1780) NP = 1700; cout <void idle () {display (); } অকার্যকর কীবোর্ড (স্বাক্ষরহীন চার কী, int x, int y) {সুইচ (কী) {কেস 'পি': কেস 'পি': হ্যাজপারস্পেক্টিভা = 1; পুনরায় আকার দিন (অ্যাঙ্কো, আল্টো); বিরতি; case 'o': case 'O': hazPerspectiva = 0; পুনরায় আকার দিন (অ্যাঙ্কো, আল্টো); বিরতি; কেস 27: // এসকেপ এক্সিট (0); বিরতি; }} অকার্যকর 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; প্রদর্শন (); } অকার্যকর ratmov (int x, int y) {if ((Boton == 0) & (Pulbut == 0)) {mx = y; আমার = x; } যদি ((Boton == 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 () glutStrokeRexLex /a ফ্রেম বাফার glGetPixelMapfv () নির্দিষ্ট পিক্সেল মানচিত্র প্রদান করুন leer (); glutInit (& argc, argv); glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); glutInitWindowPosition (50, 50); glutInitWindowSize (ancho, alto); glutCreateWindow ("Cubo 1"); এটা(); glutDisplayFunc (প্রদর্শন); glutReshapeFunc (নতুন আকার); glutIdleFunc (অলস); glutMouseFunc (raton); glutMotionFunc (ratmov); glutKeyboardFunc (কীবোর্ড); glutMainLoop (); রিটার্ন 0; }

ধাপ 5:

ছবি
ছবি

মুহূর্তের জন্য আমাকে থামতে হবে! … কিন্তু পরবর্তী অধ্যায়ে আমি আপনাকে প্রতিশ্রুতি দিচ্ছি যে আমি আমার রাস্পবেরি পাই 3 বা আমার জেটসন ন্যানোবোর্ডে এটি বাস্তবায়ন করব, ইতিমধ্যে কিছু দূরবর্তী নিয়ন্ত্রিত বিমান, অথবা গুহার অভ্যন্তর স্ক্যান করার জন্য কিছু মাকড়সা রোবট

প্রস্তাবিত: