OpenCV学习--仿射变换(affine)
2013-12-29 21:21
381 查看
图像的基本几何变换有-- 平移,旋转,尺度,仿射;仿射变换可以理解为平移旋转尺度的组合效果。下面给出数学上的定义
![](http://homepages.inf.ed.ac.uk/rbf/HIPR2/eqns/eqngein.gif)
![](http://homepages.inf.ed.ac.uk/rbf/HIPR2/eqns/eqnxy1.gif)
是输入图像的点,
![](http://homepages.inf.ed.ac.uk/rbf/HIPR2/eqns/eqnxy2.gif)
时输出图像的点
A是2x2旋转矩阵, B是平移向量
(一)平移的实现
![](http://homepages.inf.ed.ac.uk/rbf/HIPR2/eqns/eqnaff1.gif)
(二)旋转的实现
![](http://homepages.inf.ed.ac.uk/rbf/HIPR2/eqns/eqnaff2.gif)
(三)尺度的实现
![](http://homepages.inf.ed.ac.uk/rbf/HIPR2/eqns/eqnaff3.gif)
从上面的实现可以看出,使用仿射变换是需要求解6个参数,旋转矩阵4个,平移向量2个。这也是我们在使用OpenCV的warpAffine函数时需要输入3对坐标了
下面是测试程序
![](http://homepages.inf.ed.ac.uk/rbf/HIPR2/eqns/eqngein.gif)
![](http://homepages.inf.ed.ac.uk/rbf/HIPR2/eqns/eqnxy1.gif)
是输入图像的点,
![](http://homepages.inf.ed.ac.uk/rbf/HIPR2/eqns/eqnxy2.gif)
时输出图像的点
A是2x2旋转矩阵, B是平移向量
(一)平移的实现
![](http://homepages.inf.ed.ac.uk/rbf/HIPR2/eqns/eqnaff1.gif)
(二)旋转的实现
![](http://homepages.inf.ed.ac.uk/rbf/HIPR2/eqns/eqnaff2.gif)
(三)尺度的实现
![](http://homepages.inf.ed.ac.uk/rbf/HIPR2/eqns/eqnaff3.gif)
从上面的实现可以看出,使用仿射变换是需要求解6个参数,旋转矩阵4个,平移向量2个。这也是我们在使用OpenCV的warpAffine函数时需要输入3对坐标了
下面是测试程序
#include "stdafx.h" #include <opencv2/opencv.hpp> #include <iostream> #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学习-imgprocess-仿射变换warpAffine
- opencv学习——仿射变换
- 【OpenCV学习笔记】7.4仿射变换warpAffine()
- OpenCV学习26--仿射变换
- OpenCV学习六:findContours、drawContours、仿射变换、RotatedRect区域矫正及获取
- opencv学习笔记:由三对点计算仿射变换
- OpenCV入门学习(二)Affine Transformations(仿射变换)
- Opencv学习——仿射变换和透视变换
- 用opencv中的warpAffine获取仿射变换图片保存
- Opencv学习之仿射变换、直方图均衡化
- 学习OpenCV范例(十六)——重映射和仿射变换
- opencv学习(三十五)之仿射变换warpAffine
- OpenCV Python 学习笔记(三) 仿射变换
- OpenCV学习记录3//仿射变换与重映射
- opencv学习(6)---仿射变换
- opencv document 仿射变换学习
- OpenCV学习笔记三:Mat构造函数 初始化 完全复制 获取指针 像素(灰度)值
- opencv [c++版] 学习笔记(1) 显示图像及播放视频
- OpenCV学习(39) OpenCV中的LBP图像