Hologram rekonstrukció opencv-vel.

 ( emberk | 2009. október 1., csütörtök - 13:55 )

Sziasztok!

Volna egy egyszerű feladat, amit meg kellene csinálnom, egy képletet kellene implementálnom. Amit össze is henteskedtem, de tetű lassú.

Értem is miről szól, csak ezt el kellene magyaráznom az opencv-nek, amiben nem vagyok profi (sőt inkább kezdő, de azt is el kell kezdeni valahol). Tömören,R(x,y) és h(x,y)a két hologrammlemeznek tekinthető kép (2 db 2048*2048-as kép). A képlet kozepén az a cirádás F^-1 az a fourier transzformáció(integrál de mindegy), azt tiszta sor meg van oldva, kivéve, hogy nincs rászorozva a képletben lévő e-ad os taggal, mert nem tudom, hogyan kell az opencv,nek ezt a képletet elmondani (bár szerintem konstanstól alig különböző külömbséget ad, de azt mondták, hogy nincs igazam). Most azt teszem, hogy a bemeneti egyik "képet" módosítom ezzel a képettel, nagyon hentes módszerrel, pixelenkét(tetű lassú, de legalább látom az eredményt), majd a két képletet szintén pixelenként ""összemátrixszorzom"". Utána pdig Dft. Nincs ennek a képletnek (ill bármely képletnek) az alkalmazására az opencvnek valami pofás kis függvénye? Mert ez lényegében egy mátrixszorzás. Ha kell átírom, a képletet bármilyen másik modellre (algebrai geometriai..... mindegy), csak így nem használható mert 15-percíg tart egy mérés. A lényeg, hogy tuti van rá valami jó megoldás, de ilyen téren tapasztalatlan vagyok. Előre is köszi mindent. El tudok küldeni képeket, hogy miből indulok ki és minek kell kijönnie, sőt szerintem kódrészletekért sem harapnak.

Ja pár adat:
u, és v az a képpont pozíciója.
dx, és dy a pixelméret x,y irányba.
d a leképezési távolság
A végeredmény egy amplitúdó adott koordinátánál (u,v)
a lambda pedig a lézer hullámhossza.

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

az F^-1 az szerintem az inverz Fourier transzformaciot akarja jelenteni
az e kitevojeben pedig van egy i betu is, amitol komplex szam lesz az egeszbol, nem hagyhatod el tetszes szerint akarmelyik reszet, mert nem tetszolegesen pici kulonbseget kapsz, foleg nem konstans kulonbseget kulonbozo bemenetekre

szerintem keresd ki vmi tablazatbol a kepletben szereplo inverz Fourier trafot, ird at a kepletet, igy a numerikus inverz trafoval mar nem kell szenvednie a gepnek

igen, igazad, van, csak a d az nagyon nagy szám, az ok, hogy komplex lesz, úgy is írtam meg, "tapasztalatból" mondom, hogy konstanstól alig különböző. Az egyenletből ez nem látszik természetesen. Kb olyan hatása van, mintha szemből megvilágítanánk lámpával a teszttárgyat.
------
3 fajta matematikus létezik. Aki tud számolni, és aki nem.

Láttam már exp-et, képeket, OpenCV-t, sőt egyszer hologramot is, de ezt nem értem. :)

Ha jól értem a kapcsoson belül van 3 mátrixod. Ebből az exp-eset egyszer kell kiszámolnod, ha nem változnak a paraméterek.

A három mátrix összeszorzása két cvMul hívás. (Nem, nem egy dupla ciklus. Egyrészt a korai optimalizáció maga a gonosz, másrészt az OpenCV agyonoptimalizált SSE-t is tartalmazó kódját nem is biztos, hogy túlszárnyalná).

Aztán cvDFT, ami gondolom megint csak egy mátrixot ad. Majd cvMul a másik exp-es mátrix-szal (szintén csak egyszer kell kiszámolni).

Ezután cvConvertScale. Bár azt nem tudom, hogy az OpenCV hogy viszonyul a komplex számokhoz...

Nekem túl sok az index a képletben ahhoz, hogy ennyiből felfogjam, de ettől még lehet, hogy nem írtam hülyeséget. :)

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o

Ok na ez hasznonak tűnik. Szóval a cvMul a mátrixszorzás. az e-ados atgból is tudok mátrixot csinálni(max legenerálom először a mátrixokat, és hajrá, jól átírható a képlet mátrixra) Gondoltam, hogy az opencv-t én csíkzsebből nem tudom űberelni sem tempóban sem tudásban, én arra gondoltam, hogy olyan aki tapasztaltabb, az hátha tud segíteni. Mert a google 10milliós nagyságrendű találata, kissé bő. A komplexeket meg előbb utóbb elintézem.

Ui:
Ja én koránt sem korai optimalizációba kezdtem, hanem megírtam a "matematikai defiíciót" mert pillanatnyilag ennyit értettem a dologból.
------
3 fajta matematikus létezik. Aki tud számolni, és aki nem.

A cvMul nem mátrixszorzás (az asszem nincs is, legalábbis én nem találtam), hanem a mátrix elemeinek az összeszorzása. (Matrix prodct vs. Hadamard product).

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o

cvMatMul-nem az esetleg? Nekem a képtletből annak tűnik. Viszont egész lassú. :(
------
3 fajta matematikus létezik. Aki tud számolni, és aki nem.

Az lesz az, csak én nem találtam.

nxn-es mátrixnál az elemenkénti szorzás n^2-es a mátrixszorzás n^3-ös.
Az elemenkénti szorzás esetében SSE-vel egyszerre több elem is számolható, mátrixszorzás esetében nem.
Plusz az egyik mátrix elérése sor-, a másik oszlopfolytonos, tehát bárhogy vannak tárolva a memóriában, az egyik állandóan cache-miss-t produkál.

Azaz: Igen lassú... :)

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o

Igen, valóban az. 2048*2048-as mátrixnál kész idegtépő. szóval, ez marad egyenlőre. Köszönöm a segítséget.

------
3 fajta matematikus létezik. Aki tud számolni, és aki nem.

Mondjuk ehhez a képlethez szerintem neked nem mátrix szorzás kell...

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o