opencv笛卡尔坐标转换为极坐标cvLogPolar的应用

cvLogPolar:把图像映射到极指数空间

void cvLogPolar( const CvArr* src, CvArr* dst, CvPoint2D32f center, 

double M, int flags=CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS );

 src 输入图像。 dst 输出 图像。

 center 变换的中心,输出 图像在这里最精确。 对数极坐标变换的中心点。

M 幅度的尺度参数,见下面公式。 

flags 插值方法和以下选择标志的结合

CV_WARP_FILL_OUTLIERS -填充输出图像所有像素,如果这些点有和外点对应的,则置零。

CV_WARP_INVERSE_MAP - 表示矩阵由输出图像到输入图像的逆变换,并且因此可以直接用于像素插值。否则,函数从map_matrix中寻找逆变换。

fillval 用于填充外点的值。

函数cvLogPolar用以下变换变换输入图像:

正变换 (CV_WARP_INVERSE_MAP 未置位):    dst(phi,rho)<-src(x,y)

逆变换 (CV_WARP_INVERSE_MAP 置位):     dst(x,y)<-src(phi,rho),

这里,

rho=M * log(sqrt(x^2+y^2));        phi=atan(y/x)

此函数模仿人类视网膜中央凹视力,并且对于目标跟踪等可用于快速尺度和旋转变换不变模板匹配。

代码:

#include
#include
#include
#include
using namespace cv;
using namespace std;
int main()
{
    CvSize size_Image = cvSize(400, 400);
    IplImage * image_Resource = cvCreateImage(size_Image, IPL_DEPTH_8U, 1);
    cvZero(image_Resource);
    IplImage *image_square = cvCloneImage(image_Resource);

    CvPoint point_start = cvPoint(2, 2);
    CvPoint point_end = cvPoint(397, 397);
    //CvPoint2D32f point_center = cvPoint2D32f((double)(((point_end.x - point_start.x) / 2) + point_start.x), 
//(double)(((point_end.y - point_start.y) / 2) + point_start.y));
//对数极坐标变换的中心点的浮点型数据
    CvPoint2D32f point_center = cvPoint2D32f(image_Resource->width / 2, image_Resource->height / 2);
    cvRectangle(image_square, point_start, point_end, cvScalar(255), 3);//正方形框
    cvNamedWindow("正方形", CV_WINDOW_AUTOSIZE);
    cvShowImage("正方形", image_square);
cvSaveImage("result1.jpg",image_square);//原图是一幅正方形框图

    IplImage * image_polar = cvCloneImage(image_Resource);
    cvLogPolar(image_square, image_polar, point_center,20);//笛卡尔->极坐标
    cvNamedWindow("波浪线", CV_WINDOW_AUTOSIZE);
    cvShowImage("波浪线", image_polar);
cvSaveImage("result2.jpg",image_polar);

//改变了变换中心点坐标,为起始坐标
    cvZero(image_polar);
    point_center = cvPoint2D32f(point_start.x, point_start.y);
    cvLogPolar(image_square, image_polar, point_center, 20);
    cvNamedWindow("波浪线_b", CV_WINDOW_AUTOSIZE);
    cvShowImage("波浪线_b", image_polar);
cvSaveImage("result3.jpg",image_polar);

//改变了变换中心点坐标,为终止坐标
    cvZero(image_polar);
    point_center = cvPoint2D32f(point_end.x, point_end.y);
    cvLogPolar(image_square, image_polar, point_center, 20);
    cvNamedWindow("波浪线_c", CV_WINDOW_AUTOSIZE);
    cvShowImage("波浪线_c", image_polar);
cvSaveImage("result4.jpg",image_polar);

    cvWaitKey();
    cvReleaseImage(&image_Resource);
    cvReleaseImage(&image_square);
    cvReleaseImage(&image_polar);
    cvDestroyAllWindows();
    return 0;
}

效果:正方形框图:                                                                                极坐标变换:

opencv笛卡尔坐标转换为极坐标cvLogPolar的应用_第1张图片  opencv笛卡尔坐标转换为极坐标cvLogPolar的应用_第2张图片

改变了变换中心的变换:                                                             

opencv笛卡尔坐标转换为极坐标cvLogPolar的应用_第3张图片  opencv笛卡尔坐标转换为极坐标cvLogPolar的应用_第4张图片





你可能感兴趣的:(opencv,图像处理,模式识别)