仿射變換涉及大量的關于矩陣的運算,這裡就不在過多講解了,關于矩陣參考如下:
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;
}