c++ - 傅里叶变换高斯滤波误差

标签 c++ opencv fft

我是 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,但 complexICV_64。执行 Mat::convertTo() 它应该可以工作。

HTH

关于c++ - 傅里叶变换高斯滤波误差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21799774/

相关文章:

c++ - 通过套接字发送二进制文件。文本文件有效,没有别的吗?

c++ - HBITMP 的 WIndows 函数 DestroyObject 不能很好地工作(内存泄漏)

python - 获得包含折线图的两个图像的相似性度量的好方法是什么?

c++ - 在 OpenCV 中使用 drawContours 连接四个点

android - Android 中的 OpenCv : keypoint detection in images from file

python - 如何解决由FFT驱动的微分程序中的移位和缩放错误?

c++ - 如何在不使用文件扩展名的情况下使用命令行参数在 C++ 中打开文本文件?

c++ - 如何在 C++ 中仅实例化一个变量一次?

c++ - 如何实现重叠添加方法?

java - 如何将汉宁函数应用于我的音频样本?