我是 openCV 的新手,我正在尝试使用频域中的高斯滤波器来过滤图像。但是有一个运行时错误 “在 cv::mulSpectrum 中断言失败(类型 == srcB.type() && srcA.size() == srcB.size())” 我知道是我的filter的返回类型导致的,类型不匹配不知道怎么改
这里是过滤函数(我猜这个函数的返回值是错误的):
cv::Mat createGaussianHighPassFilter(cv::Size size, double cutoffInPixels){
Mat ghpf(size, CV_64F);
cv::Point center(size.width / 2, size.height / 2);
for(int u = 0; u < ghpf.rows; u++)
{
for(int v = 0; v < ghpf.cols; v++)
{
ghpf.at<double>(u, v) = gaussianCoeff(u - center.x, v - center.y, cutoffInPixels); //kernel utk gaussian filter yg 128x128
}
}
return ghpf;
这是主要功能:
Mat mask = createGaussianHighPassFilter(complexI.size(),16);
shift(mask);
Mat AX[] = {Mat::zeros(complexI.size(), CV_32F), Mat::zeros(complexI.size(), CV_32F)};
Mat kernel_spec;
AX[0] = mask; // real
AX[1] = mask; // imaginar
merge(AX, 2, kernel_spec);
cout<<complexI.type()<<endl<<kernel_spec.type(); //the result is 13 and 14, the type doesn't match
mulSpectrums(complexI, kernel_spec, complexI, DFT_ROWS); // only DFT_ROWS accepted
updateMag(complexI); // show spectrum
updateResult(complexI); // do inverse transform
最佳答案
当然他们不匹配。您正在将 kernel_spec
初始化为 CV_32
,但 complexI
为 CV_64
。执行 Mat::convertTo()
它应该可以工作。
HTH
关于c++ - 傅里叶变换高斯滤波误差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21799774/