我编写使用openCV api创建高斯内核,然后将其传递给Conv2ByDFT函数进行卷积。但程序崩溃,我不知道为什么。这是代码。
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);
}
以下是main()中用于调用上面函数的一些代码
Mat gaussianFilter = getGaussianKernel(7,2.0,CV_64F); // create Gaussian kernel
Conv2ByFFT(src,gaussianFilter,result); // do the convolution
我不知道getGaussianKernel()函数是否有问题或者我的Conv2ByFFT()函数有问题...有人可以帮帮我吗?非常感谢!
答案 0 :(得分: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)