Digital Visual Effect hw1,基本要求是寫程式合成HDR圖檔,然後用HDRShop做tone mapping。
直接合成沒有用tone mapping的話,因為HDR的range超出一般圖檔可表示的range,所以會有太亮太暗的問題。用HDRShop的話則是有很多參數可以調。加分部份有,用其他不一樣的HDR合成演算法,自己寫tone mapping,寫程式自動對齊影像 (如果原圖沒有對齊的話合成出來會有光暈)…懶了 XD。
這次寫作業有兩個地方用現成的函式庫,第一個是網頁提供的讀寫各種圖檔格式的函式庫,第二個是線性代數函數庫算SVD。整個作業時間花最久的地方是在怎麼把現性代數函數庫裝起來 = =。網頁提供了:GSL, Boost, LAPACK, LAPACK++,ATLAS給你選。其中GSL,ATLAS這種一看就是給linux下做的就跳過了。剩下3個就慢慢試著裝起來。
一開始裝Lapack++,有提供.exe直接安裝相當方便,但是在link的時候一直說link error。明明就照他的windows安裝說明step by step但是就是鬼擋牆不能用。
第二個試的是Boost,久聞其言的函式庫,相當龐大,裝好之後用了一下矩陣向量運算,因為都overload好了用起來就像是matlab一樣也很方便。可是最後發現,我要用的SVD不見了?真的很奇怪,他自己的範例也有,但是我找不到這個函式放在哪裡…
第三個試Lapack,之前去聽數值方法的時候有聽過這個函式庫,特別的是…他是用Fortran寫的,還要去生Fortran compiler也很煩,最後抓別人已經compile好的。裝上去,哇,終於可以用了。沒想到看了一下函式才發現,這是用C寫的函式庫,最大的問題就是沒有函式名稱不能overload。所有同樣功能float, double, int, complex各有一個函式 = =。好吧就將就著用,找Lapack的SVD函式說明看對應的版本函式名稱叫sgesvd,include對應的.h之後來看要怎麼用吧。
int sgesvd_(char *jobu, char *jobvt, integer *m, integer *n, real *a, integer *lda, real *s, real *u, integer *ldu, real *vt, integer *ldvt, real *work, integer *lwork, integer *info)
這什麼!!??為什麼數學寫法只是 A=USV^T的函式,寫成程式參數有這麼多個??? 而且參數是什麼意思完全沒有說明!更扯的是官網上面的函式說明也沒有說!後來又去抓lapack的原始碼才找到參數的意思,哪有人說明是寫在.c裡面的!火大。最煩的是這函式庫他的矩陣表示方式是column major的…實在不太好用所以最後也沒有用。
最後又回到了Lapack++,這次改成從原始碼開始裝起,找到了官網上的教學一步一步編,這才發現,可惡!官網寫錯了!一開始直接抓.exe檔的,他說要include libblas32.LIB liblapack32.Lib,但是正確的是要include lapackpp.lib!就為了這個官網愚蠢的錯誤我浪費了一個下午在無意義的事情上面 = =。
最後把函式庫都搞定後,作業的基本要求終於寫出來了。懶得特別去照照片,用網頁提供的兩組照片合成的。各別是直接合成的和tone mapping過的。合成這個真不是普通的慢…

沒有留言:
張貼留言