OpenCV学习--仿射变换(affine)

图像的基本几何变换有-- 平移,旋转,尺度,仿射;仿射变换可以理解为平移旋转尺度的组合效果。下面给出数学上的定义

Eqn:eqngein

Eqn:eqnxy1是输入图像的点,Eqn:eqnxy2时输出图像的点

A是2x2旋转矩阵, B是平移向量

(一)平移的实现

Eqn:eqnaff1

二)旋转的实现

Eqn:eqnaff2

三)尺度的实现

Eqn:eqnaff3

上面的实现可以看出,使用仿射变换是需要求解6个参数,旋转矩阵4个,平移向量2个。这也是我们在使用OpenCV的warpAffine函数时需要输入3对坐标了

下面是测试程序

#include "stdafx.h"
#include 
#include 
#include "affine.h"

using namespace std;
using namespace cv;

static char* source_wnd = "Source Image";
static char* warp_wnd = "Warp";
static char* warp_rotate_wnd = "Warp_rotate_wnd";
void affine_test()
{
	Point2f srcTri[3];
	Point2f dstTri[3];

	Mat rot_mat(2, 3, CV_32FC1);
	Mat warp_mat(2, 3, CV_32FC1);

	Mat src, warp_dst, warp_rotate_dst;
	//加载图像
	src = imread("dog.jpg");

	warp_dst = Mat::zeros(src.size(), src.type());
	//设置源图像和目标图像上的是三个点一家算仿射变换
	srcTri[0] = Point2f(0,0);
	srcTri[1] = Point2f(src.cols-1, 0);
	srcTri[2] = Point2f(0, src.rows-1);

// 	dstTri[0] = Point2f(src.cols*0, src.rows*0.33);
// 	dstTri[1] = Point2f(src.cols*0.85, src.rows*0.25);
// 	dstTri[2] = Point2f(src.cols*0.15, src.rows*0.7);
	dstTri[0] = Point2f(src.cols*0.25, src.rows*0.25);
	dstTri[1] = Point2f(src.cols*0.75, src.rows*0.25);
	dstTri[2] = Point2f(src.cols*0.25, src.rows*0.75);

	//求得仿射变换,一个2x3的矩阵
	warp_mat = getAffineTransform(srcTri, dstTri);
	//对源图像使用上面的仿射变换
	warpAffine(src, warp_dst, warp_mat, warp_dst.size());
	//计算饶图像中点顺时针旋转50,缩放因子为0.6的矩阵
	Point center(src.cols/2, src.rows/2);
	double angle = 50.0;
	double scale = 0.6;
	//求旋转矩阵
	rot_mat = getRotationMatrix2D(center, angle, scale);
	warpAffine(warp_dst, warp_rotate_dst, rot_mat, warp_dst.size());
	imshow(warp_wnd, warp_dst);
	imshow(source_wnd, src);
	imshow(warp_rotate_wnd, warp_rotate_dst);
}


你可能感兴趣的:(OpenCV,opencv,affine,仿射变换)