您的位置:首页 > 运维架构

OpenCV官方文档学习记录(20)

2014-12-18 17:49 639 查看
2D仿射变换(AffineTransform)

主要函数:

//获取变换矩阵M=[A B]
warp_mat = getAffineTransform(srcTri, dstTri);


//获取旋转矩阵
rot_mat = getRotationMatrix2D(center, angle, scale);


重要函数:

warpAffine(src, warp_dst, warp_mat, warp_dst.size());


代码如下,解释全在注释中:

 #include <opencv2\opencv.hpp>
#include <iostream>
#include <string>

#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )

using namespace std;
using namespace cv;

void showImg(const string &win_name, const Mat &img)
{
namedWindow(win_name, CV_WINDOW_AUTOSIZE);
imshow(win_name, img);
}

int main(void)
{
Point2f srcTri[3];
Point2f dstTri[3];

Mat rot_mat(2, 3, CV_32FC1);
Mat warp_mat(2, 3, CV_32FC1);
Mat src, warp_dst, rotate_dst;

src = imread("lena.jpg");
if (src.empty())
return -1;
showImg("src", src);

warp_dst = Mat::zeros(src.rows, src.cols, 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.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);

//获取变换矩阵M=[A B] warp_mat = getAffineTransform(srcTri, dstTri);

warpAffine(src, warp_dst, warp_mat, warp_dst.size());

//旋转中心
Point center = Point(src.cols / 2, src.rows / 2);
//旋转角度
double angle = -50.0;
//旋转中的缩放(因为方形图像如果不缩放进行旋转会出现溢出现象),保证不溢出的话,缩放要在 二分之根号2 以下(约为0.7左右)
double scale = 0.7;

//获取旋转矩阵 rot_mat = getRotationMatrix2D(center, angle, scale);

warpAffine(src, rotate_dst, rot_mat, src.size());

showImg("warp_dst", warp_dst);
showImg("warp_rotate_dst", rotate_dst);
waitKey();
return 0;
}


结果图片:

仿射:



旋转缩放:



主要说明请查阅相关数学资料。

以上。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: