欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

OpenCV仿射變換的示例代碼

 更新時間:2022年08月05日 08:54:24   作者:我菜就愛學(xué)  
本文主要介紹了OpenCV仿射變換的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

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)

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-oCWwUOWK-1659625193572)(F:\學(xué)習(xí)記錄\opencv\截圖\image-20220804143908462.jpg)]

  • 第六個參數(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通過m3u8文件下載合并ts視頻的操作

    Python通過m3u8文件下載合并ts視頻的操作

    這篇文章主要介紹了Python通過m3u8文件下載合并ts視頻的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Python中Yield的基本用法

    Python中Yield的基本用法

    這篇文章主要給大家介紹了關(guān)于Python中Yield的基本用法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Python中使用item()方法遍歷字典的例子

    Python中使用item()方法遍歷字典的例子

    這篇文章主要介紹了Python中使用item()方法遍歷字典的例子,for...in這種是Python中最常用的遍歷字典的方法了,需要的朋友可以參考下
    2014-08-08
  • 一文教你如何使用Python繪制瀑布圖

    一文教你如何使用Python繪制瀑布圖

    什么是瀑布圖?瀑布圖用表達兩個數(shù)值之間的變化過程,過程值為正的時候,向上加,過程值為負(fù)的時候向下減。本文就帶大家學(xué)習(xí)一下如何用Python繪制瀑布圖吧
    2023-04-04
  • Python使用自定義裝飾器的示例詳解

    Python使用自定義裝飾器的示例詳解

    在Python自動化測試中,可以使用自定義的裝飾器來給測試方法傳遞測試數(shù)據(jù)。本文將通過簡單的示例和大家介紹下具體的使用方法,希望對大家有所幫助
    2022-11-11
  • Python機器學(xué)習(xí)之scikit-learn庫中KNN算法的封裝與使用方法

    Python機器學(xué)習(xí)之scikit-learn庫中KNN算法的封裝與使用方法

    這篇文章主要介紹了Python機器學(xué)習(xí)之scikit-learn庫中KNN算法的封裝與使用方法,結(jié)合實例形式分析了scikit-learn庫中KNN算法的相關(guān)調(diào)用與使用技巧,需要的朋友可以參考下
    2018-12-12
  • Pytorch+PyG實現(xiàn)GraphSAGE過程示例詳解

    Pytorch+PyG實現(xiàn)GraphSAGE過程示例詳解

    這篇文章主要為大家介紹了Pytorch+PyG實現(xiàn)GraphSAGE過程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • Python通過90行代碼搭建一個音樂搜索工具

    Python通過90行代碼搭建一個音樂搜索工具

    這篇文章主要介紹了Python通過90行代碼搭建一個音樂搜索工具,需要的朋友可以參考下
    2015-07-07
  • Python讀取mat(matlab數(shù)據(jù)文件)并實現(xiàn)畫圖

    Python讀取mat(matlab數(shù)據(jù)文件)并實現(xiàn)畫圖

    這篇文章主要介紹了Python讀取mat(matlab數(shù)據(jù)文件)并實現(xiàn)畫圖問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • 用opencv給圖片換背景色的示例代碼

    用opencv給圖片換背景色的示例代碼

    這篇文章主要介紹了用opencv給圖片換背景色的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07

最新評論