我是openCV的新手,我正在尝试使用频域中的高斯滤波器来过滤图像。但是有一个运行时错误 “在cv :: mulSpectrum中断言失败(type == srcB.type()&& srcA.size()== srcB.size())” 我知道这是由我的过滤器的返回类型引起的,类型不匹配,我不知道如何使其正确
这里是过滤函数(我的猜测是这个函数的返回值是错误的):
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
答案 0 :(得分:1)
当然,他们不匹配。您正在将kernel_spec
初始化为CV_32
,但complexI
为CV_64
。做一个Mat::convertTo()
它应该有效。
HTH