3

我们已经实现了 DFT,并想用 OpenCV 的实现对其进行测试。结果是不同的。

  1. 我们的 DFT 的结果是按从小到大的顺序排列的,而 OpenCV 的结果没有任何顺序。
  2. 两个计算的第一个 (0th) 值相同,在这种情况下,复数部分为 0 (因为 e^0 = 1,在公式中)。其他值是不同的,例如 OpenCV 的结果包含负值,而我们的没有。

这是我们对 DFT 的实现:

// complex number
std::complex<float> j;
j = -1;
j = std::sqrt(j);
std::complex<float> result;
std::vector<std::complex<float>> fourier; // output

// this->N = length of contour, 512 in our case
// foreach fourier descriptor
for (int n = 0; n < this->N; ++n)
{
    // Summation in formula
    for (int t = 0; t < this->N; ++t)
    {
        result += (this->centroidDistance[t] * std::exp((-j*PI2 *((float)n)*((float)t)) / ((float)N)));
    }

    fourier.push_back((1.0f / this->N) * result);
}

这就是我们使用 OpenCV 计算 DFT 的方式:

std::vector<std::complex<float>> fourierCV; // output
cv::dft(std::vector<float>(centroidDistance, centroidDistance + this->N), fourierCV, cv::DFT_SCALE | cv::DFT_COMPLEX_OUTPUT);

变量centroidDistance在上一步中计算。

注意:请避免回答说使用 OpenCV 而不是您自己的实现。

4

1 回答 1

4

您忘记result为 的每次迭代进行初始化n

for (int n = 0; n < this->N; ++n)
{
    result = 0.0f;    // initialise `result` to 0 here <<<

    // Summation in formula
    for (int t = 0; t < this->N; ++t)
    {
        result += (this->centroidDistance[t] * std::exp((-j*PI2 *((float)n)*((float)t)) / ((float)N)));
    }

    fourier.push_back((1.0f / this->N) * result);
}
于 2015-08-03T15:21:56.403 回答