HTML

Az élet kódjai

Csináld maga. Senki nem csinálja meg helyetted.

Friss topikok

OpenCV, avagy mit csináljon az a csapat, amelyiknek nem tagja Aha? (1. rész)

2012.07.16. 14:40 Travis.CG

Amikor először hallottam, hogyan készült a Moove című Fresh!Mindworkz produkció, nagyon elcsodálkoztam. A felvételt ugyanis Aha kézzel processzálta. Minden egyes képkockánál megjelölte, hol van táncos keze. Már pontosan nem emlékszem, mennyi klikkelést kellett végrehajtania, de nekem már az egy százaléka is sok lett volna.

Felvetődik a kérdés, mit csináljanak azok a demócsapatok, ahol nincsenek ilyen elhivatott tagok, csak lusta kóderek? A válasz egyszerű: bízzuk ezt a munkát is számítógépre.

Az OpenCV egy olyan API, ami rengeteg hasznos módszerrel igyekszik segíteni a képfeldolgozást. Nem kell nekünk megvalósítani a bonyolult algoritmusokat, hanem csak használni azokat. Miként használhatjuk ezt a demosceneben? Csak nézzünk meg néhány ASD demót! Ők már 2006 óta használják olyan produkciókban, mint az Evolution of vision vagy a Happiness is around the bend.

Mielőtt elkezdeném tárgyalni, mit is tudunk kezdeni ezzel az API-val, kicsit részletezem saját tapasztalataim alapján, hogy mit is várhatunk el a számítógépes látástól. Közhely, hogy a számítógép csak pixel információkat dolgoz fel, míg az ember formákat, de nagyon könnyű erről megfeledkezni. Ha nem akarunk kedvenc videónk feldolgozása alatt kiguvadó szemmel meredni a monitorra, miközben azt üvöltjük: Miért nem látod azt az intenzitás változást! Akkor érdemes megjegyezni a következőket:

- Ami az ember számára egyforma színűnek tűnik, az a gép számára lehet eltérő. Például készítettem egy felvételt homogén fal előtt, de az árnyékom halványan rávetült a falra, a program már másik színnek látta.

- Ha csökkentjük programunk érzékenységét, olyan helyek is egyformává válhatnak, amiket mi szemmel meg tudunk különböztetni. Például a Livin' in a box című demónk készítése közben az egyik jelenet felvételénél a távolban volt egy fa, aminek az árnyéka olyan sötét volt a program számára, mint a ruhám. Ez zajként jelentkezett.

- A színeket a számítógép több komponensben látja (pl. RGB vagy HSL), ami a feldolgozásnál meglepetéseket okozhat. Pl. egy alkalommal zöld korongokat akartam detektálni, minden mást kiszűrni. Azt gondoltam, elég a zöld csatornával játszanom, de a ruhámon egy sárga minta folyton bezavart. Egyébként sok algoritmus az OpenCV-ben csak szürke árnyalatos képpel működik.

- A kamera fényérzékenysége eltér szemünkétől. Ez szintén trivialitás, de ha arra kényszerülünk, hogy mobiltelefon felvételt dolgozzunk fel, ne lepődjünk meg semmin.

- A video kódolás hibákat okozhat a feldolgozásban. Ez sem rakéta-tudomány, de az OpenCV nem minden telepítés esetén olvas minden fájl formátumot. Esetenként konvertálnunk kell, ami megváltoztathatja a feldolgozandó pixeleket.

Most, hogy túlvagyunk az "én szóltam" részen, lássuk, mit képes olvasni az OpenCV? Alapvetően a következő képformátumokat támogatja: BMP, JPG, PNG, TIFF. A videoformátumok már rendszerfüggőek. Windows alatt mindent olvasni tudunk, amihez van Video for Windows kodek. Linux alatt a dokumentáció az ffmpeget említi, de Ubuntu és Fedora esetén olvassa a GStreamer támogatta videókat. Mac alatt be kell érni QuickTime-al.

Ha valós idejű képfeldolgozásra adjuk a fejünket, akkor használhatunk webkamerákat. Jó eséllyel nem lesz gondunk vele, ha a rendszer tudja kezelni. Sok tapasztalatom nincs ez ügyben, a laptopom beépített webkameráját kezeli mindenféle hókuszpókusz nélkül.

Az OpenCV tartalmaz még egy kicsi, lebutított keresztplatformos grafikai felületet, amit HighGUI néven szoktak emlegetni. A lényege, hogy platformfüggetlen módon egyszerű felületeket fejleszthetünk. Az eszközkészlete elég szegényes, csak ablakokat, képeket és csúszkákat hozhatunk létre.

Ennyi bevezető után lássunk egy kis kódot, ami alig csinál valamit, de ismerkedni jó lesz:

#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <stdio.h>

void processImage(IplImage *raw){
   cvSmooth(raw, raw, CV_GAUSSIAN, 17, 0, 0, 0);
}

int main(){
   CvCapture *capture;
   IplImage *frame;
   IplImage *proc;
   int key;

   capture = cvCaptureFromCAM(CV_CAP_ANY);
   cvNamedWindow("win", CV_WINDOW_AUTOSIZE);

   while(1){
      frame = cvQueryFrame(capture);
      processImage(frame);
      cvShowImage("win", frame);
      if(cvWaitKey(10) != -1) break;
   }

   cvReleaseCapture(&capture);
   cvDestroyWindow("win");
}

A kód a következő módon fordítható GNU/Linux rendszeren:

gcc simplecapture.c `pkg-config --libs opencv`

Végezetül a könnyed műfajok kedvelőinek itt van néhány tipp, miként rejtőzködjünk el a kamerák arcfelismerő algoritmusai elől divatos, de extravagáns frizurákban: CVDazzle

Szólj hozzá!

Címkék: programozás opencv

A bejegyzés trackback címe:

https://cybernetic.blog.hu/api/trackback/id/tr574642203

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.
süti beállítások módosítása