首页 > 解决方案 > C++ 中 OpenCV 的 DFT 绝对值

问题描述

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

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

...

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

区域是一个 50x1 向量,我想将区域的 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 的绝对值向量?

标签: c++opencv

解决方案


正如@Christoph Rackwitz 所说,我们可以使用splitmagnitude

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 中得到绝对值向量。


推荐阅读