1. 程式人生 > >對圖像的仿射變換

對圖像的仿射變換

控制 lan 換來 存儲 input 順序存儲 矩陣 bubuko war

仿射變換,又稱仿射映射,是指在幾何中,一個向量空間進行一次線性變換並接上一個平移,變換為另一個向量空間

線性變換包含了平移,縮放,旋轉,鏡像,斜切,正交投影,線性變換在幾何上可能造成拉伸但是不會直線不會出現彎折。

在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來按順序存放

對圖像的仿射變換