我们已经实现了离散傅里叶变换(DFT),并希望使用OpenCV的实现进行测试。结果是不同的。
- 我们DFT的结果按从小到大的顺序排列,而OpenCV的结果没有任何顺序。
- 在这种情况下,两个计算的第一个(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代替您自己的实现。