2011-09-29 75 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