Archive for the ‘C++ / OpenGL / Cg’ Category

Thursday, March 23rd, 2006

Matrices en Images

En we are back in business!!

Via een tip van mijn assistent, heb ik gevonden hoe ik mijn linear system of equations kan opstellen. Deze was namelijk te vinden in het PHD thesis van Kwatra! Na een week van studie op die thesis, kon ik dus deze week beginnen aan de implementatie. JOY!!

Eerst moest ik een matrix library vinden. Na heel wat zoeken, ben ik op een fantastische vergelijkingspagina terecht gekomen. Het is een echte aanrader! Eerst wat zitten knoeien met MTL en ITL, en hoewel deze erg goed leken, wou deze zelfs na verscheidene malen proberen, niet compileren in VS.NET! :-(

Uiteindelijk ben ik dus terecht gekomen bij de newmat library! Alles ging vlot tot ik een matrix vermenigvuldiging probeerde! Deze duurde voor 256*4096 (en dat was dan een kleine afbeelding) anderhalve minuut!!! En als je dan weet dat deze 256 keer of meer in de eerste iteratie van het algoritme zou voorkomen, dan kan je al 6 en half uur wachten voor een iteratie!! Net iets te lang dus! Na bespreking met de auteur, mijn begeleider en enkele vrienden, heb ik de methode wat aangepast, zonder matrix vermingvuldigingen en nu duurt een iteratie een fractie van een seconde!!! Als output krijg ik wel nog rubbish:

Bron                           Output
Bron afbeelding  Output afbeelding

Maar ik zit in alle geval terug in de goede richting!! HALLELUJA!

Nog enkele dankwoordjes:

  • Dank aan Björn-Ove Heimsund voor de vergelijkingspagina tip!
  • Dank aan de MTL en ITL mailing list!
  • Dank aan Robert Davies, de maker van newmat, voor de tips en het snel antwoorden op mijn emails!
  • Dank aan Nele en Chris voor het testen van matrices in Java en Fortran! :-p
  • En zoals altijd thx Ares voor de tips!
Thursday, March 9th, 2006

Linear System of Equations

Momenteel zit ik diep in de paper Texture Optimization for Example-Based Synthesis van Kwatra et all, meer bepaald met het pseudo algoritme te ontcijferen en te vertalen naar practische code. En het is daar dat het schoentje wringt. Ik begrijp hoe het algoritme in zijn werk gaat, maar nu moet ik dit gaan implementeren. Dit lijntje is momenteel de nagel van mijn doodskist:

xn+1 = argminx Et(x;{znp})

Dit is een minimalisatie probleem van de energie functie naar x. Het zou een stelsel vergelijkingen opleveren waaruit ik dan de minimale x kan halen. Hier zit ik vast. Hoe ik dit naar code kan omzetten. Ik ben aan het lezen in Numerical Recipes in C, maar vind nog geen afdoende oplossing. Hopelijk vind ik die vlug, want de tijd begint te dringen. Indien ik deze paper kan implementeren, kan ik aan het laatste vraagstuk beginnen, nl. het opstellen van tilepack (in omega-formaat) op zulk manier dat ik een quasi perfect beeld verkrijg. Veel stof dus!

Wednesday, October 19th, 2005

CxImage en problemen…

Na lang twijfelen, ben ik vandaag over gegaan naar de bibliotheek CxImage ipv CImg. Hoofdreden hiervoor was het vervelend verkrijgen van de kleurwaarden van pixels. Het was uitermate moeilijk om die deftig te achterhalen op de manier die ik wil. CxImage gebruikt een struct voor een kleur, waardoor ik die kan doorgeven. CImg gebruikte meteen de kleurwaarde voor Red, Green en Blue apart. Lastig…

Andere voordelen van deze bibliotheek:

  • minder nonsense: het bevat enkel image bewerking, geen 3d of windows. Dit helpt voor de grootte en de leesbaarheid van de code.
  • native ondersteuning van formaten: hierdoor kan ik bmp/jpg/gif/png/tiff/ico/tga ondersteunen. Dit echter wel voor een prijs… de exe is nu 700 KB. Een kleine prijs vind ik.
  • ondersteuning van functies voor een techniek die ik wil uitwerken voor betere resultaten.. (zie later)

En ja hoor, de nodige kopzorgen kwamen met deze invoering naar boven. Allerlei onverklaarbare link problemen staken de kop op. Na een 7tal uur zwoegen heb ik die uiteindelijk kunnen oplossen. Ondertussen een kleine handleiding geschreven voor linkproblemen in vc7! (kan nog handig zijn ;-) )

Ondertussen heb ik de header files voor eens en voor altijd goed geplaatst, zodat ik daar ook zo weinig mogelijk problemen mee kan krijgen!

Wednesday, October 12th, 2005

Random en C++

Random getallen… een heel triviaal gegeven.. totdat je ze moet genereren. Zoals iedereen wel weet, zijn random getallen meestal niet zo random. We noemen ze dan ook pseudo random. C++ gebruikt zule pseudo random getallen. Voor meer info over pseudo en echte random getallen, verwijs ik graag naar de cursus Ontwikkeling van Veilige Software.
Bij het kiezen van 4 subpatches in een textuur kan het dus ook voorkomen dat er bijna dezelfde worden gekozen. Misschien later echte random getallen gebruiken?
Ook eerste breinbrekers gevonden in C++. Wat blijkt, strings kan je niet zomaar concateneren met getallen. Dit werkt dus niet:
int i = 5;
string str = "Het getal "+i+" is natuurlijk.";

Nu, als men van andere talen zoals java, delphi, c#, php,.. komt, kan dit soms vreemd overkomen. Maar als men bedenkt dat in C++ een string gelijk is aan char* (of een array van chars), kan men wel al denken dat dit problemen gaat geven. De juiste code is dan ook volgend meer ingewikkeld stukje:

int i = 5;
char str[100];
sprintf(str, "Het getal %i is natuurlijk.", i);

Dit was wel even wennen (en zoeken). Maar ik kan nu toch al deftig 4 subpatches uithalen!

UPDATE:
Men kan wel gemakkelijk(er) ints naar strings omzetten, nl met:

string intToStr(int x){
std::ostringstream s;
if (s < < x)
return s.str();
return "";
}

Dit helpt wel even. :p En hier kan je dan wel de + operator gebruiken!

Monday, October 10th, 2005

CImg en libjpeg

Vandaag heb ik wat zitten implementeren. Of liever gezegd proberen…
(more…)