使用的代码类似
- void convolveDFT(Mat A, Mat B, Mat& C)
- {
- C.create(abs(A.rows - B.rows)+1, abs(A.cols - B.cols)+1, A.type());
- Size dftSize;
- dftSize.width = getOptimalDFTSize(A.cols + B.cols - 1);
- dftSize.height = getOptimalDFTSize(A.rows + B.rows - 1);
- Mat tempA(dftSize, A.type(), Scalar::all(0));
- Mat tempB(dftSize, B.type(), Scalar::all(0));
- Mat roiA(tempA, Rect(0,0,A.cols,A.rows));
- A.copyTo(roiA);
- Mat roiB(tempB, Rect(0,0,B.cols,B.rows));
- B.copyTo(roiB);
- dft(tempA, tempA, 0, A.rows);
- dft(tempB, tempB, 0, B.rows);
- mulSpectrums(tempA, tempB, tempA, DFT_COMPLEX_OUTPUT);
- dft(tempA, tempA, DFT_INVERSE + DFT_SCALE, C.rows);
- tempA(Rect(0, 0, C.cols, C.rows)).copyTo(C);
- }
=========并不能得到想要的结果================
例如上面的矩阵是输出矩阵,核矩阵如下面的矩阵
根据优化DFTsize变成8X8的矩阵。进行卷积操作。然后经过傅里叶逆变换后的矩阵如下图所示
经过计算其中的 330,330,330;840,840,840;1305,1305,1305才是我想要的卷积后的矩阵。tempA(Rect(0, 0, C.cols, C.rows)).copyTo(C);并不能得到我想要的矩阵啊!!!!!!怎么回事????????????????????????
======================实验了一晚上 已找到解决方法=========================================
有效的卷积后的图像信息从 第kernel.cols-1 kernel.rows-1开始
cv::dft(tempA,tempA,cv::DFT_INVERSE+cv::DFT_SCALE);
tempA(cv::Rect(kernel.cols-1,kernel.rows-1,dst.cols,dst.rows)).copyTo(dst);
这样就可以得到正确的图像了
也解释了前面对于优化DFT尺寸为何如此设置。输出图像大小为何如此设置