对图像的仿射变换

仿射变换,又称仿射映射,是指在几何中,一个向量空间进行一次线性变换并接上一个平移,变换为另一个向量空间

线性变换包含了平移,缩放,旋转,镜像,斜切,正交投影,线性变换在几何上可能造成拉伸但是不会直线不会出现弯折。

在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来按顺序存放

猜你喜欢

转载自www.cnblogs.com/zzatp/p/9139173.html