//m_vedgepoint:存放边界点坐标的容器 定义:
//typedef std::vector<Point> ptLineTable;// Point 是二维坐标结构体
//index:边界点数
//Fourierout:存放傅里叶描述子的地址指针
int Fourierdescriber(ptLineTable m_vedgepoint,int index, double* Fourierout)
{
Point *newP = new Point[index];
int j = 0;
for (ptLineTable::iterator i = m_vedgepoint.begin(); i != m_vedgepoint.end(); i++)
{
newP[j].x = i->x;
newP[j].y = i->y;
j++;
}
complex<double> *Z=new complex<double>[j];//定义傅立叶描述子(复数类型)
memset(Z,(0.0,0.0),j);
complex<double> temp=(0.0,0.0);
double *d=new double[j];
if(j>12)
{
for(int k=0;k<12;k++)//前 k 个描述子
{
complex<double> temp=(0.0, 0.0);
for(int l=0;l<j;l++)
{
temp=temp+complex<double>(newP[l].x,
newP[l].y)*complex<double>(cos((2*PI*l*k)/j),-sin((2*PI*l*k)/j));
}
Z[k]=temp/complex<double>((double)j,0.0);
//传统的归一化傅立叶描述子
if (k>0)
{
d[k]=sqrt(pow(Z[k].real(),2)+pow(Z[k].imag(),2))/sqrt(pow(Z[0].real(),2)+pow(Z[0].imag(),2));
// fprintf(fileHandle, "%f ", d[k]); //可存入队列传出
*(Fourierout+k-1) = d[k];
}
}
}
else
- 1
- 2
前往页