2011-09-29 50 views
0

卷積方法我寫使用OpenCV的API來創建一個高斯核,然後將它傳遞給Conv2ByDFT函數做卷積。但程序崩潰,我不知道爲什麼。這是代碼。錯誤的高斯模糊,在openCV2.3

void Conv2ByFFT(const Mat& f,const Mat& g,Mat& result) 
{ 
result.create(abs(f.rows-g.rows+1),abs(f.cols-g.cols+1),f.type()); 

Size dftSize; 
dftSize.width = getOptimalDFTSize(f.cols + g.cols - 1); 
dftSize.height = getOptimalDFTSize(f.rows + g.cols -1); 

Mat tmpF(dftSize,f.type(),Scalar::all(0)); 
Mat tmpG(dftSize,g.type(),Scalar::all(0)); 

dft(tmpF,tmpF,0,f.rows); 
dft(tmpG,tmpG,0,g.rows); 

mulSpectrums(tmpF,tmpG,tmpF,0); 

dft(tmpF,tmpF,DFT_INVERSE+DFT_SCALE,result.rows); 

tmpF(Rect(0,0,result.cols,result.rows)).copyTo(result); 
} 

這裏是主要的一些代碼()調用上述

Mat gaussianFilter = getGaussianKernel(7,2.0,CV_64F); // create Gaussian kernel 
Conv2ByFFT(src,gaussianFilter,result); // do the convolution 

的功能,我不知道是否有什麼不對的getGaussianKernel()函數或與我Conv2ByFFT出了問題( )功能...任何人都可以幫助我嗎?非常感謝!

+0

什麼錯誤?它會發生什麼事? –

+0

對不起,我沒有說清楚:P。錯誤如下:「未知函數中的OPENCV ERROR:斷言失敗(類型== CV_32FC1 ||類型== CV_32FC2 ||類型== CV_64FC1 ||類型== CV_64FC2).. \ .. \ .. \ moduels \核心的\ src \ dxt.cpp,線路1483 「和上線程序崩潰」 DFT(TMPF,TMPF,0,f.rows)」 – yvetterowe

回答

1

我的猜測是,你的src矩陣不是在CV_32F或CV_64F(32或64位浮點)格式。如果它是圖片,則可能需要將其轉換。從OpenCV的文檔

提醒:

類型矩陣元素的形式CV_(S | U | F)被指定C,例如:CV_8UC1意味着一個8位的無符號單信道矩陣,CV_32SC2指帶有兩個通道的32位帶符號矩陣 。

這是從源頭上定義的完整列表:

#define  CV_16S 3 
#define  CV_16SC(n) CV_MAKETYPE(CV_16S,(n)) 
#define  CV_16SC1 CV_MAKETYPE(CV_16S,1) 
#define  CV_16SC2 CV_MAKETYPE(CV_16S,2) 
#define  CV_16SC3 CV_MAKETYPE(CV_16S,3) 
#define  CV_16SC4 CV_MAKETYPE(CV_16S,4) 
#define  CV_16U 2 
#define  CV_16UC(n) CV_MAKETYPE(CV_16U,(n)) 
#define  CV_16UC1 CV_MAKETYPE(CV_16U,1) 
#define  CV_16UC2 CV_MAKETYPE(CV_16U,2) 
#define  CV_16UC3 CV_MAKETYPE(CV_16U,3) 
#define  CV_16UC4 CV_MAKETYPE(CV_16U,4) 
#define  CV_32F 5 
#define  CV_32FC(n) CV_MAKETYPE(CV_32F,(n)) 
#define  CV_32FC1 CV_MAKETYPE(CV_32F,1) 
#define  CV_32FC2 CV_MAKETYPE(CV_32F,2) 
#define  CV_32FC3 CV_MAKETYPE(CV_32F,3) 
#define  CV_32FC4 CV_MAKETYPE(CV_32F,4) 
#define  CV_32S 4 
#define  CV_32SC(n) CV_MAKETYPE(CV_32S,(n)) 
#define  CV_32SC1 CV_MAKETYPE(CV_32S,1) 
#define  CV_32SC2 CV_MAKETYPE(CV_32S,2) 
#define  CV_32SC3 CV_MAKETYPE(CV_32S,3) 
#define  CV_32SC4 CV_MAKETYPE(CV_32S,4) 
#define  CV_64F 6 
#define  CV_64FC(n) CV_MAKETYPE(CV_64F,(n)) 
#define  CV_64FC1 CV_MAKETYPE(CV_64F,1) 
#define  CV_64FC2 CV_MAKETYPE(CV_64F,2) 
#define  CV_64FC3 CV_MAKETYPE(CV_64F,3) 
#define  CV_64FC4 CV_MAKETYPE(CV_64F,4) 
#define  CV_8S 1 
#define  CV_8SC(n) CV_MAKETYPE(CV_8S,(n)) 
#define  CV_8SC1 CV_MAKETYPE(CV_8S,1) 
#define  CV_8SC2 CV_MAKETYPE(CV_8S,2) 
#define  CV_8SC3 CV_MAKETYPE(CV_8S,3) 
#define  CV_8SC4 CV_MAKETYPE(CV_8S,4) 
#define  CV_8U 0 
#define  CV_8UC(n) CV_MAKETYPE(CV_8U,(n)) 
#define  CV_8UC1 CV_MAKETYPE(CV_8U,1) 
#define  CV_8UC2 CV_MAKETYPE(CV_8U,2) 
#define  CV_8UC3 CV_MAKETYPE(CV_8U,3) 
#define  CV_8UC4 CV_MAKETYPE(CV_8U,4) 
+0

是啊,你說得對! Mat src = imread(「lena.bmp」)所以src的類型,因爲我檢查是16.所以我使用'convertTo'函數將其轉換爲CV_64F來進行卷積。但在此之後,我需要將結果轉換回原始類型(這裏是16),或者輸出圖像看起來完全是黑色的。我檢查類型CV_BGRA2BGR565是16,所以我打電話'result.convertTo(newresult,CV_BGRA2BGR565)'。但是當我調試程序時,我發現newresult.type()始終爲0,而​​不是16.爲什麼會發生:'( – yvetterowe

+0

我不確定是否需要使用convertTo,因爲這是用於轉換色彩空間。你需要位深度轉換,所以嘗試cvConvertScale。 –

+0

抱歉,但cvConvertScale的第一和第二個參數是的IplImage *類型,所以我稱之爲「cvConvertScale(結果,與TMP 1/255)」,它再次崩潰和錯誤說」不好的論點「。我想知道是否有MAT類型可以作爲這個函數的參數,或者我必須使用IplImage類型嗎?(因爲我使用openCV2.3) – yvetterowe