gpt4 book ai didi

c++ - OpenCV 和使用傅立叶变换 dft()

转载 作者:行者123 更新时间:2023-11-28 03:05:01 34 4
gpt4 key购买 nike

我正在尝试对两个单独的图像进行逐点乘法傅立叶变换,然后再转换回普通图像。我不太熟悉在 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 channel 图像,只能显示 1、3、4 channel 图像。

如果你对 dft 使用 DFT_COMPLEX_OUTPUT,你会得到一个 2 channel 图像,再次应用反向 idft 会产生一个 2 channel (复杂)Mat

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

convertTo() 改变 channel 的类型,但不改变它们的数量(是的,令人惊讶)。

所以,要么将其限制为实部:

 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/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com