主要通过Opencv中提供的cvWarpAffine和cv2DRotationMatrix函数来对图像进行各种变换,具体功能实现如代码:
#include "stdio.h"
#include "cv.h"
#include "highgui.h"
int main(int argc, char* argv[])
{
CvPoint2D32f srcTri[3],dstTri[3];
/*typedef struct CvPoint
{
int x; X坐标, 通常以0为基点
int y; y坐标, 通常以0为基点
}
CvPoint;
CvPoint2D32f则是CvPoint的变形,这是将x,y表示为float型
*/
CvMat* rot_mat=cvCreateMat(2,3,CV_32FC1);
CvMat* warp_mat=cvCreateMat(2,3,CV_32FC1);
/*
CvMat* cvCreateMat(int rows, int cols, int type);
rows表示行数,cols表示列数,type表示矩阵的存储的类型,通常以 CV_<比特数>(S|U|F)C<通道数>型式描述,如:
CV_8UC1 表示8位无符号单通道矩阵, CV_32SC2表示32位有符号双通道矩阵
*/
IplImage *src,*dst;
src=cvLoadImage("Lena.png");
dst=cvCloneImage(src);
dst->origin=src->origin;
cvZero(dst);
srcTri[0].x=0;
srcTri[0].y=0;
srcTri[1].x=src->width-1;
srcTri[1].y=0;
srcTri[2].x=src->width-1;
srcTri[2].y=src->height-1;
dstTri[0].x=src->width*0;
dstTri[0].y=src->height*0.33;
dstTri[1].x=src->width*0.85;
dstTri[1].y=src->height*0.25;
dstTri[2].x=src->width*0.7;
dstTri[2].y=src->height*0.7;
cvGetAffineTransform(srcTri,dstTri,warp_mat);
/*对图像做仿射变换,获取仿射变换的矩阵,这里warp_mat便是从srcTri到dstTri的变换矩阵,在这过程中至少需要三个点,三个点定义了一个平行四边形
这三个点可以是图像四个顶点中任意三个,但要明确变形后的三个点的位置并能够对应上*/
cvWarpAffine(src,dst,warp_mat);
/*利用已经得到的仿射矩阵对图像矩阵进行仿射,即dst=src*warp_mat */
cvCopy(dst,src);
CvPoint2D32f center=cvPoint2D32f(src->width/2,src->height/2);
//结构体的定义与类构造函数是不同的
double angle=-45;
double scale=0.6;
cv2DRotationMatrix(center,angle,scale,rot_mat);
/*CvMat* cv2DrotationMatrix(CvPoint2D32f center,double angle,double scale,CvMat* map_matrix)
这个函数是求对图像进行旋转和缩放的所要左乘的矩阵,其中center是设定的旋转中心点,angle是旋转角度,scale是缩放比例
最后的map_matrix是我们要求的左乘矩阵
*/
cvWarpAffine(src,dst,rot_mat);
//利用左乘矩阵进行变换
cvNamedWindow("ImageShow",1);
cvShowImage("ImageShow",dst);
cvWaitKey(0);
printf("Hello World!\n");
return 0;
}
结果如下: