在Opencv中自定义了一个相位函数,获取复数矩阵的相位

 

 

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;
    }
}

 

posted @ 2025-03-22 13:37  凤凰_1  阅读(27)  评论(0)    收藏  举报