opencv之仿射变换
2014-05-05 11:35
507 查看
一、序言
在图像处理中,对图像进行二维变换有仿射变换(Affine Transformation),透视变换(Perspective Transformation)(应该还有其他变换,但是我用到的比较多的是这两种变换)。
仿射变换(Affine Transformation)是空间直角坐标系的变换,从一个二维坐标变换到另一个二维坐标,仿射变换是一个线性变换,他保持了图像的“平行性”和“平直性”,即图像中原来的直线和平行线,变换后仍然保持原来的直线和平行线,仿射变换比较常用的特殊变换有平移(Translation)、缩放(Scale)、翻转(Flip)、旋转(Rotation)和剪切(Shear)。
![](http://img.blog.csdn.net/20140428171954000)
图1.仿射变换
透视变换(Perspective Transformation)是指利用透视中心、像点、目标点三点共线的条件,按透视旋转定律使承影面(透视面)绕迹线(透视轴)旋转某一角度,破坏原有的投影光线束,仍能保持承影面上投影几何图形不变的变换。
![](http://img.blog.csdn.net/20140428172111046)
图2.透视变换
二、仿射变换的变换公式推导
2.1仿射变换公式法推导
在opencv提供的仿射变换中,变换的公式是一个2*3的矩阵,如下:
![](http://img.blog.csdn.net/20140428173504609)
,
![](http://img.blog.csdn.net/20140428173520437)
,
![](http://img.blog.csdn.net/20140428173531187)
A是仿射变换2*3矩阵,M是2*2矩阵,表示坐标轴的旋转和缩放,B是2*1矩阵,是坐标轴平移矩阵。
坐标变换如下:
![](http://img.blog.csdn.net/20140428173703828)
,
![](http://img.blog.csdn.net/20140428173716390)
可以看出,A矩阵只有6个参数,所以只要知道3个点之间的仿射变换,就可以求出A矩阵。
2.2 仿射变换坐标系法推导
仿射变换也可以看成坐标系的旋转和缩放以及平移:
![](http://img.blog.csdn.net/20140428174612453)
P点位置不变,坐标系由(Xt,Yt)变换到(Xs,Ys),相应的坐标有(Xtp,Ytp)变换成(Xsp,Ysp)。
其中(Xtp,Ytp)与(Xsp,Ysp)的关系如下:
![](http://img.blog.csdn.net/20140505104551140)
3.opencv仿射变换程序实现
![](http://img.blog.csdn.net/20140505113335437)
![](http://img.blog.csdn.net/20140505113343984)
![](http://img.blog.csdn.net/20140505113350031)
4.参考文章:
http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/imgtrans/warp_affine/warp_affine.html http://blog.csdn.net/honpey/article/details/8724106 http://www.cnblogs.com/shijibao001/articles/1225962.html
在图像处理中,对图像进行二维变换有仿射变换(Affine Transformation),透视变换(Perspective Transformation)(应该还有其他变换,但是我用到的比较多的是这两种变换)。
仿射变换(Affine Transformation)是空间直角坐标系的变换,从一个二维坐标变换到另一个二维坐标,仿射变换是一个线性变换,他保持了图像的“平行性”和“平直性”,即图像中原来的直线和平行线,变换后仍然保持原来的直线和平行线,仿射变换比较常用的特殊变换有平移(Translation)、缩放(Scale)、翻转(Flip)、旋转(Rotation)和剪切(Shear)。
图1.仿射变换
透视变换(Perspective Transformation)是指利用透视中心、像点、目标点三点共线的条件,按透视旋转定律使承影面(透视面)绕迹线(透视轴)旋转某一角度,破坏原有的投影光线束,仍能保持承影面上投影几何图形不变的变换。
图2.透视变换
二、仿射变换的变换公式推导
2.1仿射变换公式法推导
在opencv提供的仿射变换中,变换的公式是一个2*3的矩阵,如下:
,
,
A是仿射变换2*3矩阵,M是2*2矩阵,表示坐标轴的旋转和缩放,B是2*1矩阵,是坐标轴平移矩阵。
坐标变换如下:
,
可以看出,A矩阵只有6个参数,所以只要知道3个点之间的仿射变换,就可以求出A矩阵。
2.2 仿射变换坐标系法推导
仿射变换也可以看成坐标系的旋转和缩放以及平移:
P点位置不变,坐标系由(Xt,Yt)变换到(Xs,Ys),相应的坐标有(Xtp,Ytp)变换成(Xsp,Ysp)。
其中(Xtp,Ytp)与(Xsp,Ysp)的关系如下:
3.opencv仿射变换程序实现
#include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui/highgui.hpp> #include <vector> using namespace std; using namespace cv; void main() { cv::Mat image = cv::imread("image.jpg"); cv::namedWindow("source image"); cv::imshow("source image",image); //3点的仿射变换 cv::Point2f src_point[3]; cv::Point2f dst_point[3]; src_point[0] = cv::Point2f(0,0); src_point[1] = cv::Point2f(image.cols-1,0); src_point[2] = cv::Point2f(0,image.rows-1); dst_point[0] = cv::Point2f(image.cols*0.1,image.rows*0.13); dst_point[1] = cv::Point2f(image.cols*0.8,image.rows*0.32); dst_point[2] = cv::Point2f(image.cols*0.16,image.rows*0.7); cv::Mat warp_mat(cv::Size(2,3),CV_32F); warp_mat = cv::getAffineTransform(src_point,dst_point); cv::Mat warpimage= cv::Mat::zeros(image.rows,image.cols,image.type()); cv::warpAffine(image,warpimage,warp_mat,warpimage.size()); cv::namedWindow("dst image"); cv::imshow("dst image",warpimage); cv::imwrite("warpimage1.jpg",warpimage); //对图像旋转后缩放的仿射变换 cv::Point2f center = Point2f(image.cols/2,image.rows/2); double angle = 30; double scale = 0.8; warp_mat = getRotationMatrix2D(center,angle,scale); cv::warpAffine(image,warpimage,warp_mat,warpimage.size()); cv::namedWindow("dst image2"); cv::imshow("dst image2",warpimage); cv::imwrite("warpimage2.jpg",warpimage); cv::waitKey(0); }程序运行结果:
4.参考文章:
http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/imgtrans/warp_affine/warp_affine.html http://blog.csdn.net/honpey/article/details/8724106 http://www.cnblogs.com/shijibao001/articles/1225962.html
相关文章推荐
- 2.5 OpenCV仿射变换+投射变换+单应性矩阵
- opencv仿射变换GetAffineTransform的总结
- opencv-第六章-图像变换-重映射、仿射变换、透视变换
- Opencv学习——仿射变换和透视变换
- opencv 仿射变换 计算旋转矩阵源码分析
- 仿射变换OpenCV实现的最小二乘优化
- opencv 拉伸、扭曲、旋转图像-仿射变换 opencv1 / opencv2 / python cv2(代码)
- OpenCV之十八 OpenCV仿射变换 & SURF特征点描述合辑
- opencv 利用仿射变换函数对图像进行任意角度旋转
- OpenCV学习六:findContours、drawContours、仿射变换、RotatedRect区域矫正及获取
- opencv仿射变换
- OpenCV使用RANSAC的仿射变换估计 estimateAffine2D
- OpenCV中 变换模型求解的函数补充: 刚体变换(Rigid Transform)和仿射变换(Affine Transform)
- 15基于opencv的旋转_仿射变换_SURF特征点检测
- OpenCV2.4.13中warpAffine函数理解,旋转,仿射变换,缩放,保持完整图片
- 【OpenCV】仿射变换 根据眼睛坐标进行人脸对齐 计算变换后对应坐标
- 图像的仿射变换与透视变换opencv
- 【OpenCV】图像变换(五)-仿射变换和透视变换
- OpenCV入门学习(二)Affine Transformations(仿射变换)
- Java+opencv3.2.0之仿射变换