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 ellenben 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 telepítéstől függően más-más fájl formátumot tud olvasni, ami miatt esetleg konvertálnunk kell.
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
kb 4000 kep * 2 kontrol pont * 2 nezet (elolrol oldalrol) + elromlot az egerem :)
de jo moka volt :)
Én is szórakoztam az OpenCV-vel. Viszonylag könnyen használható, de a 2.2-es verziónál még nem tűnt elég kiforrottnak. Meg a legtöbb cucc nem éppen gyors (bár pár dologból van benne IPP (fizetős) és CUDA (csak nVidia) optimalizált verzió). Arra jó, hogy az ember kikisérletezzen dolgokat.
“Mac alatt be kell érni QuickTime-al.”
-QuickTime alá viszont van ffmpeg-alapú kodekcsomag.
Ha lehet, akkor IPP. Ha nem, akkor el gondolkodnek azon, h valoban kell-e a “cucc”. :)
travis a dazzle korretto, én ilyen bennxülöttnek öltözök az tuti, az nemzetközi reptereken nem feltünö =), bevixnek, átvizsgálnak, de legalább az arcfelismerö progit kikerültem =).
[…] OpenCV képfeldolgozás cikksorozat első része után itt a folytatás, de csak a tovább […]