OpenCV仿射變換的示例代碼
1、認(rèn)識仿射變換
仿射變換(Affine Map)又稱仿射映射,是指在幾何中,一個向量空間進行一次線性變換并接上一個平移,變換為另一個向量空間的過程。保持二維圖形之間的相對位置保持不變,平行線依然是平行線,且直線上的點的位置順序不變。
一個任意的仿射變換都可以表示為乘以一個矩陣接著再加上一個向量的形式。三種常見的變換形式:
- 旋轉(zhuǎn):ratation(線性變換)
- 平移:translation(向量加)
- 縮放:scale(線性變換)
通常使用2 x 3的矩陣來表示仿射變換:
2、仿射變換的求法
說明:仿射變換表示的就是兩幅圖片之間的一種聯(lián)系,關(guān)于這種聯(lián)系的信息大致可以分為以下兩種場景:
- 已知X和T,而且已知它們是有聯(lián)系的,接下來的跟著就是求出矩陣M。
- 已知M和X,想要求得T。只要應(yīng)用算式T=M*X即可。
如上,點1、2、3(在Image 1中形成一個三角形)與Image 2中的三個點是一一映射的關(guān)系,且它們?nèi)匀恍纬扇切?,但形狀已?jīng)和之前的不一樣的,可以通過這樣的兩組三點求出仿射變換,然后把這種變換應(yī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ù)調(diào)用后的運算結(jié)果存在這里,需要和源圖片有一樣的尺寸和類型
- 第三個參數(shù):2 x 3的變換矩陣,求得的仿射變換
- 第四個參數(shù):表示輸出圖像的尺寸
- 第五個參數(shù):插值方法的標(biāo)識符。默認(rèn)值是線性插值法(INTER_LINEAR)
- 第六個參數(shù):邊界像素模式
- 第七個參數(shù):在恒定的邊界情況下取值,默認(rèn)值Scalar(),即0
4、計算二維旋轉(zhuǎn)變換矩陣:getRotationMatrix2D()函數(shù)
說明:getRotationMatrix2D()函數(shù)用于計算二維旋轉(zhuǎn)變換矩陣。變換會將旋轉(zhuǎn)中心映射到它自身
Mat getRotationMatrix2D(Point2f center,double angle,double scale)
- 第一個參數(shù):表示源圖像的旋轉(zhuǎn)中心
- 第二個參數(shù):旋轉(zhuǎn)角度。角度為正值表示向逆時針旋轉(zhuǎn)(坐標(biāo)原點是左上角)
- 第三個參數(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ù)準(zhǔn)備 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); //設(shè)置目標(biāo)圖像的大小和類型與源圖像一致 dstImage_warp = Mat::zeros(srcImage.rows, srcImage.cols, srcImage.type()); //設(shè)置源圖像和目標(biāo)圖像上的三組點以計算仿射變換 //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); //對源圖像應(yīng)用剛剛的求得的仿射變換 warpAffine(srcImage, dstImage_warp, warpMat, dstImage_warp.size()); //對圖像進行縮放后再旋轉(zhuǎn) //計算圖像中點順時針旋轉(zhuǎn)50°縮放因子為0.6的旋轉(zhuǎn)矩陣 Point center = Point(dstImage_warp.cols / 2, dstImage_warp.rows / 2); double angle = -30.0; double scale = 0.8; //通過上面的旋轉(zhuǎn)細(xì)節(jié)信息求出旋轉(zhuǎn)矩陣 rotMat = getRotationMatrix2D(center, angle, scale); //旋轉(zhuǎn)已經(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; }
到此這篇關(guān)于OpenCV仿射變換的示例代碼的文章就介紹到這了,更多相關(guān)OpenCV 仿射變換內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python機器學(xué)習(xí)之scikit-learn庫中KNN算法的封裝與使用方法
這篇文章主要介紹了Python機器學(xué)習(xí)之scikit-learn庫中KNN算法的封裝與使用方法,結(jié)合實例形式分析了scikit-learn庫中KNN算法的相關(guān)調(diào)用與使用技巧,需要的朋友可以參考下2018-12-12Pytorch+PyG實現(xiàn)GraphSAGE過程示例詳解
這篇文章主要為大家介紹了Pytorch+PyG實現(xiàn)GraphSAGE過程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-04-04Python讀取mat(matlab數(shù)據(jù)文件)并實現(xiàn)畫圖
這篇文章主要介紹了Python讀取mat(matlab數(shù)據(jù)文件)并實現(xiàn)畫圖問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12