Thumbnail Project voortgang

Door: Thijs Zumbrink
20-07-2012 18:19

Sinds lange tijd weer een update! Ik ben met van alles druk geweest en heb het Schalpoen een beetje uit het oog verloren. Vooral het appartement heeft veel tijd gekost en de studie is ook nog steeds dringend! Nu ik wat voortgang in mijn project geboekt heb neem ik even de tijd om er wat over te vertellen.

Als onderdeel van Video-Based Material Editing ben ik momenteel bezig met het implementeren van een techniek [1] om een mathematisch model van een omgeving te modelleren. Dit is best omvangrijk en ik heb nogal wat vertraging opgelopen, dus de spanning loopt al aardig op. Omdat het even tegen zat verloor ik mijn motivatie, waardoor de voortgang niet zo snel ging, en... je raadt het al, ging het nog meer tegenzitten. Ik heb nu sinds een paar dagen weer voortgang en de hoop is weer teruggekeerd! Tijd om wat screenshots te showen.

Momenteel ga ik van dit:
Geplaatste afbeelding
Invoer plus annotatie

Naar dit:
Geplaatste afbeelding
Uitvoer

Het resultaat is nog niet erg overtuigend, en de meesten die dit lezen zullen zich afvragen waarom ik de afbeelding lelijker maak, maar technisch gezien gaat er veel moois schuil achter dit resultaat!

Camera calibration

Allereerst de rode en groene lijnen in de eerste afbeelding. Deze lijnen, die op de 2D foto getekend worden, geven parallelle lijnen aan in de 3D wereld. Als je de lijnen doortrekt komt je bij de verdwijnpunten aan. Die punten worden gebruikt om te bepalen hoe de camera geörienteerd is [2] zodat we de gang kunnen gaan "meten". Deze stap heeft best veel tijd gekost omdat er vijf coördinatenstelsels zijn welke met transformaties aan elkaar hangen. Dat was een zooitje en moest eerst opgehelderd worden.

De box (witte stippellijnen) wordt vervolgens met het toetsenbord op maat gemaakt om netjes in de gang te passen.

Lichten

De lichten in de scene worden gemarkeerd met de blauwe lijnen. Deze lijnen worden op de scene geprojecteerd om de 3D locaties van de lichtbronnen te contrueren. Ook de kleuren van de lichtbronnen worden uit de afbeelding gehaald door de pixelwaarden te inspecteren.

Deze stap heb ik net pas af, dus er is nog ruimte voor verbetering. Met name de sterkte van lichtbronnen wordt nog niet ingesteld. Ik denk dat dat één van de grootste redenen is waarom mijn uitvoer zo lelijk is.

Materialen

Naast geometrie (de box met goede afmetingen en oriëntatie) en de lichten is er nog één aspect nodig om een scene te renderen: materiaal/texture. We kunnen niet simpelweg de muren, het tapijt e.d. uit de originele foto nemen. Die zijn namelijk al belicht, we zijn juist geïnteresseerd in de originele kleuren. Hiervoor gebruik ik een techniek die de geometrische eigenschappen van de kamer kan meenemen in de berekening. Allereerst nemen we met een eerste ruwe versie van de texture map (albedo) met het Retinex [3] algoritme:

Geplaatste afbeelding
De afbeelding na het uitvoeren van het Retinex algoritme. Dit algoritme gebruikt kennis over hoe een mens een afbeelding ziet, om een afbeelding te produceren die (idealiter) invariant is aan belichting.

Tevens bereken ik een irradiance map, hierbij wordt het geometrische aspect gebruikt. Op elk punt in de 3D wereld wordt bekeken hoeveel licht daarop valt.

Geplaatste afbeelding
De irradiance map laat zien wat voor licht (kleur en intensiteit) er op elk stukje van de scene valt.

Dus zoals je ziet is de onderkant van de muren een beetje rood, terwijl het tapijt juist wit is. De reden hiervoor is dat het tapijt geen rood licht ontvangt, het "schijnt" niet op zichzelf. Ookal is het resultaat een beetje korrelig, ik ben toch best tevreden met dit resultaat. De irradiance map is een belangrijk stukje informatie om verdere licht berekeningen te doen.

Aan de hand van de irradiance map ga ik de initiële albedo map verbeteren. Maar ik ben nog in het proces om dat te implementeren en de resultaten zijn nog niet zo goed.

Renderen

Wanneer ik de geometrie, materialen en lichten heb, is alles klaar om gerenderd te worden. Hierbij wordt de originele afbeelding dus niet meer gebruikt, alleen een 3D wereld waar alle informatie in zit. Het is dus mogelijk om als een first-person shooter door de gang heen te wandelen, terwijl het uiterlijk van de gang nog correct blijft! (Behalve de twee zij-gangen, want die worden beschouwd als onderdeel van de muur.)

Het renderen gebeurt met LuxRender, een softwarepakket dat natuurkunde als uitgangspunt neemt voor het renderen van afbeeldingen. De renders kunnen dus erg lang duren (dat is een instelling) en ook erg mooi worden! Bijvoorbeeld, het "korrelige" effect dat op mijn uitvoer te zien is, zal verdwijnen als ik maar lang genoeg blijf renderen. Bekijk de galerij eens als je wilt zien waar LuxRender (plus een getalenteerde designer) toe in staat is!

Het doel

Wat dit programma uiteindelijk moet gaan doen is het mogelijk maken om synthetische objecten in een ruimte te renderen, waarbij die objecten interactie met de omgeving vertonen. Denk aan schaduwen en reflecties die op realistische wijze in de kamer opgenomen worden. Bekijk zeker eens deze video van de oorspronkelijke auteurs!

Als ik dan klaar ben met de implementatie van dit programma ga ik kijken of het haalbaar is om deze technieken te gebruiken in een video-gebaseerde aanpak. Het uiteindelijke doel is om dit te integreren in een material-editing programma waarmee materialen van objecten veranderd kunnen worden, in video's. (Beginnetje daarmee is hier te zien.)

Referenties:
[1] Karsch et al: Rendering Synthetic Objects into Legacy Photographs
[2] Guillou et al: Using vanishing points for camera calibration and coarse 3D reconstruction from a single image
[3] Land, McCann: Lightness and retinex theory

Reacties
Log in of registreer om reacties te plaatsen.