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;
}
效果:正方形框图: 极坐标变换:
改变了变换中心的变换: