对图像的仿射变换
仿射变换,又称仿射映射,是指在几何中,一个向量空间进行一次线性变换并接上一个平移,变换为另一个向量空间
线性变换包含了平移,缩放,旋转,镜像,斜切,正交投影,线性变换在几何上可能造成拉伸但是不会直线不会出现弯折。
在OpenCV里仿射变换通过一个2x3的矩阵来表示,前面两列表示旋转、缩放、斜切、镜像等,后面两列表示x,y方向平移
下面我们来通过仿射变换来实现图像的平移、缩放、旋转
平移:(向X轴方向平移100像素)
只平移的话,前面两列单位矩阵,后面一列数据(100,0)
缩放:(x轴缩放0.3,y轴缩放0.5)
旋转:(顺时针旋转30度)
代码如下:
// wrapaffine.cpp: 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "opencv2/opencv.hpp" // 显示平移 void showTranslate(cv::Mat&inputImage) { cv::Mat mat1 = (cv::Mat_<double>(2, 3) << 1, 0, 100, 0, 1, 0); cv::Mat destImg; cv::warpAffine(inputImage, destImg, mat1, cv::Size(inputImage.cols, inputImage.rows), cv::INTER_LINEAR, cv::BORDER_CONSTANT); cv::imshow("translate", destImg); } void showScale(cv::Mat&inputImage) { cv::Mat mat1 = (cv::Mat_<double>(2, 3) << 0.3, 0, 0, 0, 0.5, 0); cv::Mat destImg; cv::warpAffine(inputImage, destImg, mat1, cv::Size(inputImage.cols, inputImage.rows), cv::INTER_LINEAR, cv::BORDER_CONSTANT); cv::imshow("scale", destImg); } void showRotate(cv::Mat&inputImage) { float g3 = sqrt(3.0);// 根号3 cv::Mat mat1 = (cv::Mat_<double>(2, 3) << g3/2.0, -1.0/2.0, 0, 1.0 / 2.0, g3 / 2.0, 0); cv::Mat destImg; cv::warpAffine(inputImage, destImg, mat1, cv::Size(inputImage.cols, inputImage.rows), cv::INTER_LINEAR, cv::BORDER_CONSTANT); cv::imshow("rotate", destImg); } int main() { cv::Mat inputImage = cv::imread("test.png"); cv::imshow("src", inputImage); showTranslate(inputImage); showScale(inputImage); showRotate(inputImage); cv::waitKey(); cv::destroyAllWindows(); return 0; }
注:OpenCV的cv::Mat是按行的顺序存储数据,意思就是这样一个缩放矩阵他的数据从上面一行0.3,0,0开始存储到第二行0,0.5,0来按顺序存放