Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 离散傅里叶变换的实现给出了与OpenCV DFT不同的结果_C++_Opencv_Dft_Fourier Descriptors - Fatal编程技术网

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

C++ 离散傅里叶变换的实现给出了与OpenCV DFT不同的结果,c++,opencv,dft,fourier-descriptors,C++,Opencv,Dft,Fourier Descriptors,我们已经实现了DFT,并希望用OpenCV的实现对其进行测试。结果是不同的 我们的DFT结果是按从最小到最大的顺序排列的,而OpenCV的结果不是按任何顺序排列的 两种计算的第一(0)个值相同,在本例中,复杂部分为0(因为公式中e^0=1)。其他值是不同的,例如OpenCV的结果包含负值,而我们的结果不包含负值 这是我们对DFT的实现: // complex number std::complex<float> j; j = -1; j = std::sqrt(j); std::co

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

  • 我们的DFT结果是按从最小到最大的顺序排列的,而OpenCV的结果不是按任何顺序排列的
  • 两种计算的第一(0)个值相同,在本例中,复杂部分为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);
    }
    
    //复数
    std::复合物j;
    j=-1;
    j=std::sqrt(j);
    复杂结果;
    std::向量傅里叶;//输出
    //这->N=轮廓的长度,在我们的例子中为512
    //foreach傅里叶描述子
    对于(int n=0;nn;++n)
    {
    //公式求和
    对于(int t=0;tN;++t)
    {
    结果+=(此->质心距离[t]*std::exp((-j*PI2*((float)n)*((float)t))/((float)n));
    }
    fourier.push_back((1.0f/this->N)*结果);
    }
    
    这就是我们用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);
    
    std::vector fourierCV;//输出
    cv::dft(标准::向量(质心距离,质心距离+此->N),fourierCV,cv::dft_标度| cv::dft_复数_输出);
    
    变量质心距离在上一步中计算


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

    您忘记为
    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);
    }
    
    for(int n=0;nn;++n)
    {
    result=0.0f;//在此处将'result'初始化为0重心距离[t]*std::exp((-j*PI2*((float)n)*((float)t))/((float)n));
    }
    fourier.push_back((1.0f/this->N)*结果);
    }
    
    Wow……这是一个新手犯的错误……谢谢你指出,现在结果是一样的。