Opencv学习笔记——仿射变换

主要通过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;
}

结果如下:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值