informace ze zákulisí vývoje

Jak správně oříznout fotku do čtverce

17. 2. 2014 12:10
Rubrika: Pod pokličkou

Ono to není vůbec snadné oříznout automaticky fotku tak, aby to nevypadalo blbě. Jak jsem naznačil v předchozím blogpostu, nemůžete moc řezat automaticky. Zejména u fotky na výšku a formátu 16:9 (čím dál rozšířenější) bývá obličej v různých pozicích.

Základem je detekce obličeje ve fotografii. Existují na to algoritmy, nicméně tím nejzásadnějším je definice daných, zjednodušeně řekněme, vzorců, které mají algoritmy hledat. Tyto vzorce jsou vytvořeny empiricky a jsou, naštěstí, dostupné online. Vyzkoušením na 10 fotkách jsem nakonec vybral tento: https://github.com/Itseez/opencv/blob/master/data/haarcascades/haarcascade_frontalface_alt.xml (dost pravděpodobně vám to nic neřekne...)

Program vrací seznam souřadnic čtverců a jejich velikostí, tj. informace, kde jsou ve fotografii umístěny obličeje. S těmito daty se dá už vymyslet nějaký chytřejší ořez.

Našim zadáním je udělat čtvercový náhled fotografie. Situace si zjednodušíme tak, že u fotografie budeme ořezávat vždy jen tu delší stranu, tj. při fotografii na výšku zůstane šířka stejná, ořízneme jen něco nahoře a dole. Takovýto čtvercový výsledek pak zmenšíme na potřebnou velikost.

Nejprve spočítáme obdélník, ve kterém jsou všechny obličeje, které detektor nalezl. Pokud tento obdélní je menší, než potřebná velikost na oříznutí, vycentrujeme jej a necháme nad ním i pod ním stejně místa.

Ukázka na následujícím obrázku: žlutě je obtažená část, kde program detekoval obličej. Tato část je zároveň obdélníkem, kde se nachází všechny nalezené obličeje. Vzhledem k tomu, že tento obdélník má menší velikost než je hrana námi vyřezávané části, vertikálně ho vycenterujeme. Na šířku nic ořezávat nebudeme, protože se jedná o kratší hranu. Červeně je tedy vyznačena oříznutá fotografie do čtverce.

Bohužel může nastat situace, kdy je na fotografii více osob a tyto osoby se do výřezu nevejdou - tato situace nastane tehdy, pokud je obdélník se všemi obličeji větší než hrana výřezu.

Aby bylo chování co nejlepší, naprogramoval jsem ho tak, že bude oříznuta ta část obličejů, kde je jich méně. Snažím se tedy spočítat, zda je více obličejů vpravo, či vlevo, respektive nahoře či dole. Pokud je jich stejně, provedu centrování. Podívejte se na další ukázku.

Takováto fotografie nejde korektně ožíznout do čtverce tak, aby se tam všichni vlezli. Proto někdo musí z kola ven. Bohužel, algoritmus neumí detekovat pohlaví, abychom mohli oříznout dle společenské etikety. Výsledek je tedy očekávatelný:

Největším problémem stále ale zůstává nerozeznání obličeje. Díky tomu může být ořez značně podivuhodný.

Těším se, až to nasadím! Čtvercové fotky čekejte v horizontu asi jednoho měsíce :)

Zobrazeno 7387×

Komentáře

herby

"Bohužel, algoritmus neumí detekovat pohlaví, abychom mohli oříznout dle společenské etikety." :D:D

StanikKolarik

čtverec je základ státu a nejdokonalejší formát...

Zobrazit 6 komentářů »

Pro přidání komentáře se musíš přihlásit nebo registrovat na signály.cz.

Autor blogu Grafická šablona Ondřej Válka