kategorie:

menu:


Softwarové vyvážení bílé v libv4l

04.10.2008   ::    topic: Programování

Z kamery již dostávám použitelný obraz. Pořád je ale co zlepšovat. Při zkoumání oficiálního ovladače pro Windows jsem zjitil že tento driver dělá hodně věcí softwarově, jak je u levných web kamer běžné. V linuxu ale není moc možností jak obraz z v4l zařízení softwarově upravovat a tento upravený obraz v reálném čase posílat aplikaci. První vlaštovkou je upravená v4l knihovna od Hanse de Goede o které jsem psal v souvisloti s převodem video formátu pro Skype.

Libv4l se nabízí k implementaci mnohem více funkcí než „jen“ převod do jiného formátu. Např. rotace obrazu již byly impementovány. I když teda rotace v barevném prostoru yuv420 zatím nefungují tak jak by měli…

Nejvíce mi u m5602 chybělo vyvážení bílé barvy. Bez něj z této kamery teče za různých světelných podmínek rozličně zbarvený obraz. Tak jsem jsem si řekl že jej zkusím napsat sám. Zprvu jsem si na implementaci netroufl. Se zpracováním obrazu jsem neměl žádné zkušenosti. Ztrávil jsem tedy asi půl dne googlením a procházením zdrojáků různých knihoven v naději že najdu jednoduchý a jasný algoritmus implementující vyvážení bílé.

Nakonec jsem hledání vzdal a řekl jsem si že na tom nemůže být nic zas tak těžkého. Vždyť „vyvážený“ obraz by měl splňovat jednu jednoduchou podmínku. Poměr různých složek spektra (r:g:b) by měl být 1:1:1. Takže by mělo stačit zjistit průměrné hodnoty barev a pak tu které je tam málo trochu zesílit a ostatní ubrat… S touto úvahou jsem se vrhnul do nitra libv4l aniž bych tušil jak to dopadne. Nakonec mi mnohem větší problém než implementace samotného algoritmu dělalo pochopení bayer formátu. Konečný výsledek mě mile překvapil.

porovnání různých obrazů z kamery

Ovládání obrazu přes sdílenou paměť

Další drobností, která používání kamery na linuxu značně znepříjemňuje je fakt, že žádná aplikace (já žádnou nenašel) neumožňuje ovládat všechny dostupné parametry. Takže vývojáři ovladačů hackují ovládání různých parametrů přímo na hardwaru, jako zrcadlení obrazu, kontrast, vyvážení barevných kanálů… aby nakonec v aplikaci v uživatelském protoru šel upravovat třeba jenom jas.

Z toho důvodu jsem se pustil do implementace ovládání kamery přes sdílenou paměť. Moje idea byla následující: Ve Skypu si pustím video s použitím libv4l a v konzoli ovládacím prográmkem budu moci měnit parametry obrazu. Protože v4l zařízení může být otevřeno pouze jedním programem (pokud je mi známo), tak ovládací program bude komunikovat s knihovnou přes dílenou paměť, nikoliv přímo se zařízením.

Výsledek můžete vidět na screencastu (x264 avi, 2.6MB).
 libv4l control via shm - screencast

A tady jsou zdrojové kódy: