仿射变换
来源:互联网 发布:淘宝手机卡实名流程 编辑:程序博客网 时间:2024/04/29 06:08
#ifdef _CH_
#pragma package<opencv>
#endif
#pragma comment(lib,"cv.lib")
#pragma comment(lib,"cvcam.lib")
#pragma comment(lib,"cxcore.lib")
#pragma comment(lib,"highgui.lib")
#include <cv.h>
#include <cvcam.h>
#include <cxcore.h>
#include <highgui.h>
void main()
{
//载入图像
IplImage *src_image=cvLoadImage("1.jpg");
assert(src_image!=NULL);
IplImage *dst_image=cvCreateImage(cvGetSize(src_image),src_image->depth,src_image->nChannels);
assert(dst_image!=NULL);
//定义所需资源
CvPoint2D32f srcTri[3],dstTri[3];
CvMat *rot_mat = cvCreateMat(2,3,CV_32FC1);
CvMat *warp_mat = cvCreateMat(2,3,CV_32FC1);
//拷贝图像并清0
cvCopyImage(src_image,dst_image);
dst_image->origin = src_image->origin;
cvSetZero(dst_image);
//接下来要做的是获得所需要的地图矩阵
srcTri[0].x = 0; //左上
srcTri[0].y = 0;
srcTri[1].x = src_image->width-1; //左右
srcTri[1].y = 0;
srcTri[2].x = 0; //左下
srcTri[2].y = src_image->height -1;
dstTri[0].x = src_image->width *0.0; //左上
dstTri[0].y = src_image->height *0.0;
dstTri[1].x = src_image->width *0.85; //右上
dstTri[1].y = src_image->height *0.105;
dstTri[2].x = src_image->width *0.12; //左下
dstTri[2].y = src_image->height *0.89;
//调用函数获得矩阵地图
cvGetAffineTransform(srcTri,dstTri,warp_mat);
//执行仿射变换
cvWarpAffine(src_image,dst_image,warp_mat);
//接下来要做的是执行角度变化
cvCopyImage(dst_image,src_image);
CvPoint2D32f center=cvPoint2D32f( src_image->width/2,src_image->height/2 ); //旋转中心
double angle = -50.0; //旋转角度
double scale =0.6; //缩放比例
//获得地图矩阵
cv2DRotationMatrix(center,angle,scale,rot_mat);
//执行仿射变换
cvWarpAffine(src_image,dst_image,rot_mat);
//创建窗口
cvNamedWindow("Show_Src");
cvNamedWindow("Show_Dst");
//显示图像
cvShowImage("Show_Src",src_image);
cvShowImage("Show_Dst",dst_image);
cvWaitKey();
//释放资源
cvReleaseImage(&src_image);
cvReleaseImage(&dst_image);
cvDestroyWindow("Show_Src");
cvDestroyWindow("Show_Dst");
}