OpenCV仿射變換的示例代碼
1、認識仿射變換
仿射變換(Affine Map)又稱仿射映射,是指在幾何中,一個向量空間進行一次線性變換并接上一個平移,變換為另一個向量空間的過程。保持二維圖形之間的相對位置保持不變,平行線依然是平行線,且直線上的點的位置順序不變。
一個任意的仿射變換都可以表示為乘以一個矩陣接著再加上一個向量的形式。三種常見的變換形式:
- 旋轉:ratation(線性變換)
- 平移:translation(向量加)
- 縮放:scale(線性變換)
通常使用2 x 3的矩陣來表示仿射變換:


2、仿射變換的求法
說明:仿射變換表示的就是兩幅圖片之間的一種聯(lián)系,關于這種聯(lián)系的信息大致可以分為以下兩種場景:
- 已知X和T,而且已知它們是有聯(lián)系的,接下來的跟著就是求出矩陣M。
- 已知M和X,想要求得T。只要應用算式T=M*X即可。

如上,點1、2、3(在Image 1中形成一個三角形)與Image 2中的三個點是一一映射的關系,且它們仍然形成三角形,但形狀已經(jīng)和之前的不一樣的,可以通過這樣的兩組三點求出仿射變換,然后把這種變換應用到圖像中去。
3、進行仿射變換:warpAffine()函數(shù)
warpAffine()函數(shù)的作用依據(jù)下面的公式對圖像做仿射變換:

void warpAffine(InputArray src,OutputArray dst,InputArray M,Size dsize,int flags=INTER_LINEAR,intborderMOde=BODER_CONSTANT,const Scalar& borderValue=Scalar())
- 第一個參數(shù):輸入圖像
- 第二個參數(shù):輸出圖像,函數(shù)調用后的運算結果存在這里,需要和源圖片有一樣的尺寸和類型
- 第三個參數(shù):2 x 3的變換矩陣,求得的仿射變換
- 第四個參數(shù):表示輸出圖像的尺寸
- 第五個參數(shù):插值方法的標識符。默認值是線性插值法(INTER_LINEAR)
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-oCWwUOWK-1659625193572)(F:\學習記錄\opencv\截圖\image-20220804143908462.jpg)]](http://img.jbzj.com/file_images/article/202208/202208050831204.jpg)
- 第六個參數(shù):邊界像素模式
- 第七個參數(shù):在恒定的邊界情況下取值,默認值Scalar(),即0
4、計算二維旋轉變換矩陣:getRotationMatrix2D()函數(shù)
說明:getRotationMatrix2D()函數(shù)用于計算二維旋轉變換矩陣。變換會將旋轉中心映射到它自身
Mat getRotationMatrix2D(Point2f center,double angle,double scale)
- 第一個參數(shù):表示源圖像的旋轉中心
- 第二個參數(shù):旋轉角度。角度為正值表示向逆時針旋轉(坐標原點是左上角)
- 第三個參數(shù):縮放系統(tǒng)
5、示例程序:
#include<opencv2/opencv.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<iostream>
using namespace std;
using namespace cv;
#define WINDOW_NAME1 "【原始圖窗口】"
#define WINDOW_NAME2 "【經(jīng)過Warp后的窗口】"
#define WINDOW_NAME3 "【經(jīng)過Warp和Rotate后的窗口】"
int main()
{
system("color 2F");
//參數(shù)準備
Point2f srcTriangle[3];
Point2f dstTriangle[3];
Mat rotMat(2, 3, CV_32FC1);
Mat warpMat(2, 3, CV_32FC1);
Mat srcImage, dstImage_warp, dstImage_warp_rotate;
//加載源圖像
srcImage = imread("E:\\Pec\\lan.jpg",1);
//設置目標圖像的大小和類型與源圖像一致
dstImage_warp = Mat::zeros(srcImage.rows, srcImage.cols, srcImage.type());
//設置源圖像和目標圖像上的三組點以計算仿射變換
//srcTriangle[0] = Point2f(0, 0); //Point2f表示Point類的兩個數(shù)據(jù)x,y為float類型;vector 表示存放四維int
//srcTriangle[1] = Point2f(static_cast<float>(srcImage.cols - 1), 0);
//srcTriangle[2] = Point2f(0, static_cast<float>(srcImage.rows - 1));
//dstTriangle[0] = Point2f(static_cast<float>(srcImage.cols*0.0), static_cast<float>(srcImage.rows*0.33));
//dstTriangle[1] = Point2f(static_cast<float>(srcImage.cols*0.65), static_cast<float>(srcImage.rows*0.35));
//dstTriangle[2] = Point2f(static_cast<float>(srcImage.cols*0.15), static_cast<float>(srcImage.rows*0.6));
//獲取變換矩陣,指定三個點
srcTriangle[0] = Point2f(50, 50);
srcTriangle[1] = Point2f(200, 50);
srcTriangle[2] = Point2f(50, 200);
dstTriangle[0] = Point2f(100, 100);
dstTriangle[1] = Point2f(200, 50);
dstTriangle[2] = Point2f(100, 250);
//求仿射變換,得到一個2x3的矩陣
warpMat = getAffineTransform(srcTriangle, dstTriangle);
//對源圖像應用剛剛的求得的仿射變換
warpAffine(srcImage, dstImage_warp, warpMat, dstImage_warp.size());
//對圖像進行縮放后再旋轉
//計算圖像中點順時針旋轉50°縮放因子為0.6的旋轉矩陣
Point center = Point(dstImage_warp.cols / 2, dstImage_warp.rows / 2);
double angle = -30.0;
double scale = 0.8;
//通過上面的旋轉細節(jié)信息求出旋轉矩陣
rotMat = getRotationMatrix2D(center, angle, scale);
//旋轉已經(jīng)縮放后的圖像
warpAffine(dstImage_warp, dstImage_warp_rotate, rotMat, dstImage_warp.size());
imshow(WINDOW_NAME1, srcImage);
imshow(WINDOW_NAME2, dstImage_warp);
imshow(WINDOW_NAME3, dstImage_warp_rotate);
waitKey(0);
return 0;
}

到此這篇關于OpenCV仿射變換的示例代碼的文章就介紹到這了,更多相關OpenCV 仿射變換內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python機器學習之scikit-learn庫中KNN算法的封裝與使用方法
這篇文章主要介紹了Python機器學習之scikit-learn庫中KNN算法的封裝與使用方法,結合實例形式分析了scikit-learn庫中KNN算法的相關調用與使用技巧,需要的朋友可以參考下2018-12-12
Pytorch+PyG實現(xiàn)GraphSAGE過程示例詳解
這篇文章主要為大家介紹了Pytorch+PyG實現(xiàn)GraphSAGE過程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-04-04
Python讀取mat(matlab數(shù)據(jù)文件)并實現(xiàn)畫圖
這篇文章主要介紹了Python讀取mat(matlab數(shù)據(jù)文件)并實現(xiàn)畫圖問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12

