天天看點

Opencv 3仿射變換之縮放 平移 旋轉 傾斜 反射 透視仿射變換涉及大量的關于矩陣的運算,這裡就不在過多講解了,關于矩陣參考如下:仿射變換的概念:很通俗易懂//仿射變換 縮放 平移 旋轉 傾斜 反射 透視

仿射變換涉及大量的關于矩陣的運算,這裡就不在過多講解了,關于矩陣參考如下:

http://blog.csdn.net/myan/article/details/647511 https://www.zhihu.com/question/19919917/answer/270694029?utm_source=qq&utm_medium=social

仿射變換的概念:很通俗易懂

https://www.zhihu.com/question/20666664

//仿射變換 縮放 平移 旋轉 傾斜 反射 透視

#include<iostream>
#include<opencv2\opencv.hpp>
using namespace std;
using namespace cv;

int main(void)
{
	Mat src = imread("C:/Users/11741/Desktop/image/high.jpg");    //原圖
	if (!src.data)
		return -1;
	cout << "1.縮放" << endl;
	cout << "2.平移" << endl;
	cout << "3.旋轉" << endl;
	cout << "4.傾斜" << endl;
	cout << "5.反射" << endl;
	cout << "6.透視" << endl;
	int num;
	while (1)
	{
		cin >> num;
		switch (num)
		{
		case 1:
		{
			Mat dst;
			resize(src, dst, Size(0, 0), 0.5, 0.5, 1);    //參數一:原圖;參數二:目标圖;如果參數三為0,則按參數四計算,參數四為縮放因子;參數三為縮放大小
			imshow("src", src);                 //顯示原圖
			imshow("dst", dst);                 //顯示目标圖
			waitKey(0);
			break;
		}
		case 2:
		{
			Mat dst;
			Mat M = (Mat_<double>(2, 3) << 1, 0, 200, 0, 1, 150);            //建構平移矩陣,表示x方向平移200,y方向平移150
			warpAffine(src, dst, M, src.size());                     //進行仿射變換,參數三為變換的矩陣,參數四:目标圖大小
			imshow("src", src);
			imshow("dst", dst);
			waitKey(0);
			break;
		}
		case 3:
		{ 
			Mat dst;
			Mat M = getRotationMatrix2D(Point2f(0,src.rows), 40, 1);       //擷取變換矩陣,參數一:旋轉中心;參數二:角度(逆時針);參數三:縮放因子
			warpAffine(src, dst, M, src.size());                                //進行仿射變換
			imshow("src", src);
			imshow("dst", dst);
			waitKey(0);
			break;
		}
		case 4:
		{
			Mat dst; 
			Point2f srcTriangle[3];              //目标圖和源圖像設定三組點計算仿射變換
			Point2f dstTriangle[3];              
			srcTriangle[0] = Point2f(0, 0);
			srcTriangle[1] = Point2f(src.cols - 1, 0);
			srcTriangle[2] = Point2f(0, src.rows - 1);

			dstTriangle[0] = Point2f(0, src.rows*0.33);
			dstTriangle[1] = Point2f(src.cols*0.65, src.rows*0.35);
			dstTriangle[2] = Point2f(src.cols*0.15, src.rows*0.6);
			Mat M = getAffineTransform(srcTriangle, dstTriangle);          //擷取變換矩陣
			warpAffine(src, dst, M, src.size());
			imshow("src", src);
			imshow("dst", dst);
			waitKey(0);
			break;
		}
		case 5:
		{
			Mat dst;
			Mat Mh = (Mat_<double>(2, 3) << -1, 0, src.cols, 0, 1, 0);     //水準
			Mat Mv = (Mat_<double>(2, 3) << 1, 0, 0, 0, -1, src.rows);      //垂直
			Mat M = (Mat_<double>(2, 3) << -1, 0, src.cols, 0, -1, src.rows);  //水準+垂直
			warpAffine(src, dst, Mh, src.size()); 
			imshow("src", src);
			imshow("dst", dst);
			waitKey(0);
			break;
		}
		case 6:
		{
			Mat dst;
			Point2f srcMar[4];
			Point2f dstMar[4];                             //目标圖與原圖設定四組點
			srcMar[0] = Point(0, 0);
			srcMar[1] = Point(src.cols - 1, 0);
			srcMar[2] = Point(0, src.rows - 1);
			srcMar[3] = Point(src.cols - 1, src.rows - 1);
			dstMar[0] = Point(src.cols*0.4, src.rows*0.3);
			dstMar[1] = Point(src.cols*0.7,src.rows*0.1);
			dstMar[2] = Point(src.cols*0.1, src.rows*0.8);
			dstMar[3] = Point(src.cols*0.8, src.rows*0.9);
			Mat M = getPerspectiveTransform(srcMar, dstMar);         //擷取透視矩陣
			warpPerspective(src, dst, M, src.size());
			imshow("src", src);
			imshow("dst", dst);
			waitKey(0);
			break;
		} 
		default:
			return 0;
			break;
		}
	}
	waitKey(0);
	return 0;
}
           

繼續閱讀