Obsah:

Základný 3D skener pre digitálne 3D mapovanie: 5 krokov
Základný 3D skener pre digitálne 3D mapovanie: 5 krokov

Video: Základný 3D skener pre digitálne 3D mapovanie: 5 krokov

Video: Základný 3D skener pre digitálne 3D mapovanie: 5 krokov
Video: НЕФИЛИМ И СТРАЖИ (Связь с пришельцами) - Л.А. Марзулли 2024, November
Anonim
Základný 3D skener pre digitálne 3D mapovanie
Základný 3D skener pre digitálne 3D mapovanie

V tomto projekte popíšem a vysvetlím základné základy 3D skenovania a rekonštrukcie aplikované predovšetkým na skenovanie malých polorovinných predmetov a ktorých činnosť je možné rozšíriť na skenovacie a rekonštrukčné systémy, ktoré je možné nainštalovať do lietadla na diaľkové ovládanie a získať tak 3D model. z miest, kde lietadlo, ktoré ich vezme, nainštalované letí

Konečnou myšlienkou je získať 3D sken nejakého miesta alebo oblasti, exteriéru alebo interiéru, a použiť ho ako digitálnu mapu (ako vo filme Prometeus).

Krok 1:

Obrázok
Obrázok

myšlienkou je nainštalovať celý 3D skenovací systém na diaľkovo ovládané lietadlo s cieľom digitalizovať virtuálnu mapu akejkoľvek oblasti, nad ktorou letí, v 3D, ale na tento účel sme začali od začiatku prevádzky laserovej triangulácie metóda skenovania alebo 3D rekonštrukcie laserovou trianguláciou v zásade pozostáva z prechodu laserového lúča hranolom, ktorý generuje laserový prúžok, aby sa získal celý laserový prúžok, ktorý bude premietaný na skenovaný predmet, a akonáhle sa táto laserová projekcia získa na povrchový povrch Z miesta na skenovanie musí byť obraz zachytený nejakým typom kamery, pričom je najlepšie poznať uhol, ktorý je vytvorený vzhľadom na projekčný uhol vyžarovaného laserového prúžku, pretože každý z týchto snímok zachytáva premietané laserové pásy. Na povrchu objektu budú predspracované, aby sa extrahovali rozmerové charakteristiky skenovaného objektu, a jednoducho sa naskenuje pásik po páse nad objektom, aby sa získal profil jeho povrchu v tomto priečnom segmente objektu, a následne sa zachytia premietaný pás nasledujúceho prierezu objektu, aby sa všetky premietané pruhy spojili Pred všetkými prierezmi obta získame trojrozmerné skenovanie jeho povrchu

Krok 2:

Obrázok
Obrázok

Keďže sme identifikovali náš cieľ, ďalším krokom s vedomím, že na vzlet musíte byť najskôr nohami pevne na zemi, a tak sme začali na zemi s experimentálnym prototypom lineárneho 3D skenera, aby sme overili správnu činnosť základného 3D skener a ako vidíte na obrázku vyššie, použil som počítač, OpenCV, Glut of OpenGL, webovú kameru, laser, generátor laserovej farmy (v tomto prípade cez rotačné zrkadlo), elektronický lineárny výtlakový systém (vyrobený s koľajnicou) a systém extrahovaný zo starej tlačiarne) zo základne, na ktorú umiestnim objekty na skenovanie, drevo a plastelínu a ako vidíte na fotografii, na počítači: Podarilo sa mi vygenerovať a zobraziť pomocou Glut z OpenGL tri- rozmerový model reprodukovaný na základe naskenovaného skutočného objektu (v tomto prípade pavúka)

je teda viac než zrejmé, že princíp činnosti je funkčný a že s príslušnými úpravami a úpravami lietajúceho systému bude schopný skenovať a reprodukovať 3D mapu oblasti, v ktorej letí.

Tento systém však bude slúžiť iba na získavanie 3D máp vonkajšieho povrchu miest, nad ktorými lieta ???…

Krok 3:

Obrázok
Obrázok

mapovanie interiéru jaskýň a kanálov (rovnako ako vo filme Prometeus) Tento 3D skenovací systém slúži aj na rekonštrukciu trojrozmerných modelov interiéru veľkých a dutých predmetov, ako sú jaskyne, budovy, tunely atď., Jeho princíp činnosti je presne to isté, ako už bolo popísané a ktoré v zásade pozostáva z nasledujúceho:

  1. nasnímajte fotografiu každého priemetu laserového prúžku na skenovaný povrch
  2. filtrovať a odstrániť farbu z obrázku
  3. binarizujte farbu pomocou dynamického prahu obrazu
  4. aplikujte detektor hrán na rozpoznanie zachyteného profilu každého prierezu laserovej projekcie
  5. a pomocou segmentácie vyberte príslušný okraj pre 3D reprezentáciu tohto prierezu objektu, ktorý sa má skenovať a rekonštruovať na virtuálnej 3D mape
  6. potom sa tieto kroky jednoducho zopakujú pre každú fotografiu zhotovenú podoblasťou laserových prúžkov, ktoré sú nepretržite premietané každou podsekciou v podsekcii.
  7. postupne sa pridávajú zobrazenie prierezov po vrstvách, až kým sa nedosiahne bodový oblak tvorený mnohými znázorneniami prierezov objektu, ktorý sa má mapovať

Krok 4:

Obrázok
Obrázok

Potom odovzdám programy na spracovanie obrazu projekcií povrchových laserových pásov. a virtuálnej 3D rekonštrukcie týchto sussívnych priečnych znázornení v vypracovanom trojrozmernom modeli mapy:

spracovanie obrazu:

n

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

znak f = 0; char name = {"0.jpg"}; int n = 0, s, x, y; CvScalar sp; SÚBOR *NuPu;

void Writepoints () {char bufferx [33], buffery [33]; itoa (x, bufferx, 10); itoa (y, pufrovaný, 10); fprintf (NuPu, bufferx); fprintf (NuPu, "\ t"); fprintf (NuPu, nárazník); fprintf (NuPu, "\ n"); }

neplatné 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; meno [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 buffer [33]; itoa (n, pufer, 10); fprintf (NuPu, "Fin:"); fprintf (NuPu, buffer); fprintf (NuPu, "\ n"); fclose (NuPu);

cvWaitKey (0); //_execlp("calc.exe "," calc.exe ", argstr, NULL); cvDestroyAllWindows (); cvReleaseImage (& obrázok); cvReleaseImage (& img); cvReleaseImage (& img0); cvReleaseImage (& img1); cvReleaseImage (& img2); návrat 0; }

3D rekonštrukcia:

#include ////////////////// #ifdef _APPLE_ #include #else #include #include #endif #include #include #include #include #include #include

#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) pomocou priestoru názvov std; int s, Boton = 1, Pulbut = 1; float mx = 0, my = 0, mtx = 0, mty = 0, mtz = -5,0; const int Avance = 1; strunový riadok, Aux; char Caracter = 'H'; SÚBOR *NuPu; int NP, h, w; float G = 0, n = 0, cx [5000], cy [5000], x, y, ax, ay, az; int font = (int) GLUT_BITMAP_8_BY_13; štítok so statickým znakom [100]; char buffer [3]; GLfloat anguloCuboX = 0,0f; GLfloat anguloCuboY = 0,0f; GLfloat anguloEsfera = 0,0f; GLint ancho = 500; GLint alt=500; int hazardPerspectiva = 0; void reshape (vnútorná šírka, vnútorná výška) {glViewport (0, 0, šírka, výška); glMatrixMode (GL_PROJECTION); glLoadIdentity (); if (hazPerspectiva) gluPerspective (23.0f, (GLfloat) width/(GLfloat) height, 1.0f, 20.0f); inak glOrtho (-1, 1, -1, 1, -10, 10); glMatrixMode (GL_MODELVIEW); ancho = šírka; alt=výška; } prázdny Kolorear (int K) {float Hip; x = (cx [s] -320)/480; y = (cy [s] -240)/640; Hip = sqrt (pow (x, 2)+pow (y, 2)); ak ((Hip> = 0) && (Hip =.07) && (Hip = 0,14) && (Hip = 0,21) && (Hip = 0,28) && (Hip = 0,35) && (Hip = 0,42) && (Hip <=. 49)) {violeta;}} neplatné drawNuPu (neplatné) {glColor3f (1, 1, 1); glBegin (GL_LINES); glVertex3f (.2, 0, 0); glVertex3f (-. 2, 0, 0); glVertex3f (0, 0,2, 0); glVertex3f (0, -2,2, 0); glEnd (); rojo; glBegin (GL_POINTS); for (n = 0; n <10; n ++) {for (s = 0; s neplatný 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 (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_BITM; 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_BITMAP ');* / /*glColor3f (1. 0f, 1,0f, 1,0f); setOrthographicProjection (); glPushMatrix (); glLoadIdentity (); renderBitmapString (30, 15, (void *) písmo, „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; alt=500; } neplatný súbor () {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 ((riadok [0]! = 'N') && (riadok [0]! = 'F')) {Aux = riadok; riadok [0] = 48; riadok [1] = 48; riadok [2] = 48; riadok [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 (); } prázdna klávesnica (nepodpísaný kláves char, int x, int y) {prepínač (kláves) {case 'p': case 'P': hazardPerspectiva = 1; pretvoriť (ancho, alt); prestávka; prípad 'o': prípad 'O': hazardPerspectiva = 0; pretvoriť (ancho, alt); prestávka; prípad 27: // escape exit (0); prestávka; }} neplatný raton (tlačidlo int, stav int, int x, int y) { / * GLUT_LEFT_BUTTON 0 GLUT_MIDDLE_BUTTON 1 GLUT_RIGHT_BUTTON 2 GLUT_DOWN 0 GLUT_UP 1 * / Boton = tlačidlo; Pulbut = stav; // mx = y; displej (); } neplatný 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; } zobrazenie (); } int main (int argc, char ** argv) { /*glutAddMenuEntry () glutAddSubMenu () glutAttachMenu () glutCreateMenu () glutSetMenu () glutStrokeCharacter () glutStrokeLength ()* / /*glReadPixels () načítať blok pixelov z vyrovnávacia pamäť rámca glGetPixelMapfv () vráti zadanú mapu pixelov glGetPixelMapuiv () vráti zadanú mapu pixelov glGetPointerv () Vráti adresu zadaného ukazovateľa.*/ Init (); leer (); glutInit (& argc, argv); glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); glutInitWindowPosition (50, 50); glutInitWindowSize (ancho, alt); glutCreateWindow ("Cubo 1"); init (); glutDisplayFunc (zobrazenie); glutReshapeFunc (pretvoriť); glutIdleFunc (nečinný); glutMouseFunc (raton); glutMotionFunc (ratmov); glutKeyboardFunc (klávesnica); glutMainLoop (); návrat 0; }

Krok 5:

Obrázok
Obrázok

na moment musím prestať! … ale v ďalšej kapitole vám sľubujem, že to implementujem na svojom malinovom pi 3 alebo nanoboarde jetson, ktorý už je namontovaný na nejakom diaľkovo ovládanom lietadle, alebo na nejakom pavúčom robotovi na skenovanie interiéru jaskýň.

Odporúča: