我试图逐点乘以两个单独图像的傅立叶变换,然后再转换回普通图像。我对在OpenCV中使用傅立叶变换不是很熟悉,但这就是我目前所拥有的。显示输出的最后一行导致类型为'System.Runtime.InteropServices.SEHException'的异常,但我不知道如何解决它。我在每个阶段都尝试了各种不同的参数和函数,但似乎都给出了异常或空输出。我究竟做错了什么?感谢你给与我的帮助!

Mat dftInput1, dftImage1, dftInput2, dftImage2, multipliedDFT, inverseDFT, inverseDFTconverted;

image1.convertTo(dftInput1, CV_32F);
dft(dftInput1, dftImage1, DFT_COMPLEX_OUTPUT);
image2.convertTo(dftInput2, CV_32F);
dft(dftInput2, dftImage2, DFT_COMPLEX_OUTPUT);

multiply(dftImage1, dftImage2, multipliedDFT);

idft(multipliedDFT, inverseDFT, DFT_SCALE);
inverseDFT.convertTo(inverseDFTconverted, CV_8U);
imshow("Output", inverseDFTconverted);

最佳答案

imshow无法显示2通道图像,仅显示1,3,4通道图像。

如果将DFT_COMPLEX_OUTPUT用于dft,则会得到2通道图像,再次应用反向idft会产生2channel(复杂)垫

不知道,为什么会得到“System.Runtime.InteropServices.SEHException”(是“托管c++”吗?)

convertTo()更改通道的类型,但不更改其计数(是的,很惊讶)。

因此,将其限制为实际部分:

 idft(multipliedDFT, inverseDFT, CV_DFT_SCALE | CV_DFT_REAL_OUTPUT );

或将其拆分,然后仅将实际部分丢给imshow:
Mat chan[2];
split( inverseDFTconverted, chan );
imshow("lalala", chan[0]);

关于c++ - OpenCV和使用傅立叶变换dft(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19938614/

10-12 21:38