离散傅里叶变换实现与OpenCV DFT

时间:2015-08-03 15:08:17

标签: c++ opencv dft fourier-descriptors

我们已经实现了DFT,并希望使用OpenCV的实现进行测试。结果不同。

  1. 我们的DFT结果按从小到大的顺序排列,而OpenCV的结果不是任何顺序。
  2. 第一个(第0个)值对于两个计算都是相同的,因为在这种情况下,复数部分是0 (因为e ^ 0 = 1,在公式中)。其他值是不同的,例如OpenCV的结果包含负值,而我们的结果不包含负值。
  3. 这是我们对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代替您自己的实现的答案。

1 个答案:

答案 0 :(得分: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);
}