2012-11-14 33 views
1

我目前遇到一個奇怪的行爲與dft函數在opencv中。我是dft轉發一些opencv矩陣,並在頻域進行一些計算,然後我再次將其轉換回來。opencv dft只適用於圖像尺寸的權力2

結果看起來像預期的維度爲2的圖像(例如256x256,512x512),但是對於任何其他維度我都完全廢話。

我的代碼看起來大致是這樣的:

cv::Mat Z(Pgrads.rows, Pgrads.cols, CV_32FC2, cv::Scalar::all(0)); 

cv::dft(Pgrads, P, cv::DFT_SCALE | cv::DFT_COMPLEX_OUTPUT); 
cv::dft(Qgrads, Q, cv::DFT_SCALE | cv::DFT_COMPLEX_OUTPUT); 

/* doing some calculations */ 

cv::dft(Z, Z, cv::DFT_INVERSE | cv::DFT_REAL_OUTPUT); 

我做的是所謂的光度立體聲,所以在短期我做了一些梯度的全球一體化的操作。有沒有人經歷過opencv這個問題,並可以給我一些建議?

預先感謝

回答

-2

FFT只能用於2個數據集的功率並非完全正確。隨着OCV的特殊實施,他們聲稱(從2.4.9開始)它可以與其他尺寸一起工作,但是爲了提高效率,2填充的功率只是推薦的。你會發現很舊的FFT庫有2^N限制,但我很久沒有見過。你可以確保你使用的是當前版本(我知道截至問題的日期,OCV有或多或少的當前FFT實現),而不是一些真正的舊代碼。 我不知道你是如何評估輸出的,但最可能的問題是你給它一個複雜的輸入CV_32FC2,同時使用一個標誌來告訴它期望一個真正的輸入DFT_COMPLEX_OUTPUT。 DFT_COMPLEX_OUTPUT意味着「接受真正的輸入並給出完整的,解壓縮的複雜輸出,而不是CSS表單。」如果將該標誌與一個複雜的輸入混合在一起,我不知道代碼要做什麼。由於您使用的是實際圖像數據,因此您可能還要確保將輸入的虛部初始化爲0。無論如何,你可能應該使用CV_32FC1輸入圖像而不是CV_32FC2。