Identifikácia robotov na zákalde špecifických objektov pomocou webkamery - Dominik Knechta

From RoboWiki
Jump to: navigation, search

Cieľ projektu

Cieľom projektu je aby robot so zariadením Raspberry PI a webkamerou umiestnenou na svojom tele identifikoval a určil ostatné roboty, prípadne objekty vedľa seba. Na základe tohto budeme vedieť určiť kde sa robot nachádza. Robotov alebo objekty budeme určovať na základe farebných obdĺžnikov, ktoré budú mať rôzne farebné kombinácie.

Postup

Na zariadení Raspberry PI pripojíme webkameru, na ktorej spustíme príkaz, ktorý robí snímky z webkamery v určitom intervale. Tieto snímky môj program číta a hľadá či sa na snímke nachádza špecifický objekt. Objekt reprezentuje nejaký farebný obdĺžnik, rôznej farebnej kombinácie. Obdĺžniky budú mať špecifické a výrazné farby aby sa ľahšie odlíšili od okolia.

1. Do programu zadám akú farbu hľadám. (Vo formáte RGB)

2. Farba sa konvertuje do modelu YUV, pomocou ktorého ľahšie nájdem podobné farby na obrázku.

3. Algoritmom do hĺbky prehľadám celý obrázok a zistím koľko štvorcov danej farby sa v obdĺžniku sa nachádza.


Príklad: Zadám programu, že hľadám štvorce ružovej farby. Program môže nájsť 0 až 3 štvorce f obdĺžniku. Ak program nenájde, žiadny vieme, že robot nevidí žiadny objekt. Ak program nájde jeden ružový štvorec, vieme že to reprezentuje napr. robota číslo 5. Dva ružové štvorce reprezentujú nejaký objekt, napr. nejaký beacon, ktorý hovorí že tu je koniec plochy. Program, ešte môžeme vylepšiť aby hľadal viac farieb naraz čím nám vznikne viac kombinácií.

Zdrojový kód

Ukážka, zdrojového kódu pre spracovanie obrázku.

void process_file(double r, double g, double b) { pocitadlo = 0;

     	int pocet_objektov  = 0;

memset(visited,0,sizeof(visited));

y_value2 = (0.299*r) + (0.587*g) + (0.114*b); u_value2 = r * -0.168736 + g * -0.331264 + b * 0.50000 + 128; v_value2 = r * 0.50000 + g * -0.418688 + b * -0.081312 + 128;

       for (y=0; y<height; y++) {
               png_byte* row = row_pointers[y];
               for (x=0; x<width; x++) {
                       png_byte* ptr = &(row[x*3]);
                       /*printf("Pixel at position [ %d - %d ] has RGBA values: %d - %d - %d - %d\n",
                              x, y, ptr[0], ptr[1], ptr[2], ptr[3]);*/
                       double y_value = (0.299*ptr[0]) + (0.587*ptr[1]) + (0.114*ptr[2]);
                       double u_value = ptr[0] * -0.168736 + ptr[1] * -0.331264 + ptr[2] * 0.50000 + 128;
                       double v_value = ptr[0] * 0.50000 + ptr[1] * -0.418688 + ptr[2] * -0.081312 + 128;
                       pole[y][x][0] = y_value;
                       pole[y][x][1] = u_value;
                       pole[y][x][2] = v_value;
               }
       }
       for (y=0; y<height; y++){
           for(x=0; x<width; x++){
               if(visited[y][x] != 1){
                   doHlbky(y,x);
                   // ak doHlbky najde objekt ktory ma cca 40x40 pixelov predpokladam ze to je stvorec pozadovanej farby.
                   if(pocitadlo>=1600){
                       // zvysim pocet najdenych stvorcov a zresetujem pocitadlo aby som mohol ist odznova
                       pocet_objektov += 1;
                       pocitadlo = 0;
                       // nainicializuj pole jeFarba zase na 0;
                   }
                   else{
                       // nenasiel som dostatocne velky objekt, zresetuj pocitadlo a hladame znova
                       pocitadlo = 0;
                       // nainicializuj pole jeFarba zase na 0;
                   }
               }
           }
       }
   printf("Nasiel som  pocet objektov [ %d ] \n", pocet_objektov);

}


Zazipovaný zdorojový kód zdrojový kód projektu.

Ukážka výstupu

Robot objekty.png