Mat& getPhase(Mat&complex)
{
CV_Assert(complex.channels()==2&&complex.depth()>4);
int rows=complex.rows,cols=complex.cols;
int depth=complex.depth();
static Mat Angle(rows,cols,depth,Scalar::all(0));
switch (depth) {
case CV_32F:
{
float*pc=(float*)complex.data;
float*pa=(float*)Angle.data;
for(int i=0;i<rows*cols;i++)
{
if(pc[0]==0&&pc[1]>0)
pa[0]=M_PI/2;
else if(pc[0]==0&&pc[1]<0)
pa[0]=-M_PI/2;
else
pa[0]=fastAtan2(pc[1],pc[0])*M_PI/180;
pa+=1;
pc+=2;
}
}
break;
case CV_64F:
{
double*pc=(double*)complex.data;
double*pa=(double*)Angle.data;
for(int i=0;i<rows*cols;i++)
{
if(pc[0]==0&&pc[1]>0)
pa[0]=M_PI/2;
else if(pc[0]==0&&pc[1]<0)
pa[0]=-M_PI/2;
else
pa[0]=fastAtan2(pc[1],pc[0])*M_PI/180;
pa+=1;
pc+=2;
}
}
break;
}
return Angle;
}
void getPhase(Mat&complex,Mat&Angle)
{
CV_Assert(complex.channels()==2&&complex.depth()>4);
int rows=complex.rows,cols=complex.cols;
int depth=complex.depth();
if(Angle.empty())
Angle.create(rows,cols,depth);
switch (depth) {
case CV_32F:
{
float*pc=(float*)complex.data;
float*pa=(float*)Angle.data;
for(int i=0;i<rows*cols;i++)
{
if(pc[0]==0&&pc[1]>0)
pa[0]=M_PI/2;
else if(pc[0]==0&&pc[1]<0)
pa[0]=-M_PI/2;
else
pa[0]=fastAtan2(pc[1],pc[0])*M_PI/180;
pa+=1;
pc+=2;
}
}
break;
case CV_64F:
{
double*pc=(double*)complex.data;
double*pa=(double*)Angle.data;
for(int i=0;i<rows*cols;i++)
{
if(pc[0]==0&&pc[1]>0)
pa[0]=M_PI/2;
else if(pc[0]==0&&pc[1]<0)
pa[0]=-M_PI/2;
else
pa[0]=atan2(pc[1],pc[0]);
pa+=1;
pc+=2;
}
}
break;
}
}