在 C++ 中使用 OpenCV 进行 DFT 的绝对值

Absolute Value of the DFT with OpenCV in C++

我正在尝试使用 OpenCV 在 C++ 中计算 DFT。我想要 DFT 的绝对值。为了计算它,我做了:

vector<float> areas, X_mag; 
cv::Mat X;

...

cv::dft(areas, X, cv::DFT_COMPLEX_OUTPUT);

areas是一个50x1的向量,我想把areas的DFT的绝对值存入X_mag

问题是,我认为没有办法直接计算绝对值,而且我没有找到任何直接计算绝对值的函数。

我尝试使用 absdiff: cv::absdiff(X, cv::Scalar::all(0), X_mag);,但只有当我使用 std::vector 而不是 cv::Mat 时它才有效。

如果我不使用 DFT_COMPLEX_OUTPUT,我只得到实部,所以不是我需要的。

我想手动计算绝对值 (sqrt(Re(X)^2 + Im(X)^2),但我认为这太慢了,我不认为 cv::Mat被认为是这样迭代的。

如何获得 50x1 DFT 的绝对值向量?

正如@Christoph Rackwitz 所说,我们可以使用 split and magnitude

vector<float> areas, X_abs;
Mat X;
Mat X_mag[2];

...

cv::dft(areas, X, cv::DFT_COMPLEX_OUTPUT);
cv::split(X, X_mag);
cv::magnitude(X_mag[0], X_mag[1], X_abs);

我们将在 X_abs 中得到绝对值向量。