首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >离散傅里叶变换的实现给出了与OpenCV变换不同的结果

离散傅里叶变换的实现给出了与OpenCV变换不同的结果
EN

Stack Overflow用户
提问于 2015-08-03 15:08:17
回答 1查看 968关注 0票数 3

我们已经实现了DFT,并希望用OpenCV的实现来测试它。结果是不同的。

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

这就是我们对DFT的实施:

代码语言:javascript
运行
复制
// 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计算密度泛函的方法:

代码语言:javascript
运行
复制
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而不是自己的实现。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-03 15:21:56

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

代码语言:javascript
运行
复制
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);
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31790769

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档