C++ 离散傅里叶变换的实现给出了与OpenCV DFT不同的结果
我们已经实现了DFT,并希望用OpenCV的实现对其进行测试。结果是不同的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
// 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……这是一个新手犯的错误……谢谢你指出,现在结果是一样的。