這篇博客將用簡單的口吻談一談透視變換是啥以及如何操作~
? ?但是這篇博客,只要你看了,我相信會有收獲~~~~~~~
~~~~~~~~~??
~~~~~~~~~
目錄
一、透視變換介紹
1.基礎(chǔ)介紹:
二、透視變換apl介紹----?warpPerspective()
1.官方定義
2.參數(shù)解釋
三、搭配apl介紹----?getPerspectiveTransform()
1.官方定義
2.參數(shù)解釋
四、代碼實戰(zhàn)
1.任務(wù)交代
2.營救修狗
拯救思路:
整體戰(zhàn)況即結(jié)果展示
總結(jié)
提示:以下是本篇文章正文內(nèi)容,下面案例可供參考
一、透視變換介紹
1.基礎(chǔ)介紹:
????????透視變換屬于圖像的幾何變換。
????????生活中透視變換是一門普遍的技術(shù),微信的“掃一掃”就運用到這個技術(shù)。我們上傳的二維碼圖片往往是在空間上是傾斜的,就是二維碼所在平面與設(shè)備的平面不平行,這就需要透射變換把二維碼弄成板板正正的亞子。
? ? ? ? 再比如拍照就能文本翻譯的技術(shù)也需要透視變換。
實現(xiàn):
? ? ? ? 透視變換的實現(xiàn),可以想象成是投影,投影中心照到原圖像平面,投影到投影平面上,投影平面上的圖像就是投影的結(jié)果。
圖示:
二、透視變換apl介紹----?warpPerspective()
1.官方定義
void warpPerspective( InputArray src, OutputArray dst,
InputArray M, Size dsize,
int flags = INTER_LINEAR,
int borderMode = BORDER_CONSTANT,
const Scalar& borderValue = Scalar());
2.參數(shù)解釋
(1)? src? :? 輸入的原圖像。
(2)? dst? :? ?輸出的結(jié)果圖。類型如src,大小為dsize.
(3)?M? :? 3 x 3的變換矩陣,Mat 類型。
? M 需要使用getPerspectiveTransform()函數(shù)獲取,該函數(shù)放詳細介紹放在下一個標題供大家食用。
(4)? dsize? :? ? 輸出圖像的大小。
dsize參數(shù)形式:Size ( imgsrc.cols, imgdst.rows )?
(5)? flag? :插值方法的組合。我們可以通過官方定義看到有默認值,一般不用管它。
(6)borderMode? :? 像素外推方法。
(7)borderValue? :? 外邊框粗值 。在恒定邊框的情況下使用的值;默認情況下,它等于 0。
最后三個參數(shù)都有默認值,不用管。
三、搭配apl介紹----?getPerspectiveTransform()
1.官方定義
Mat getPerspectiveTransform(const Point2f src[], const Point2f dst[], int solveMethod = DECOMP_LU);
該函數(shù)通過原圖像和結(jié)果圖像的四個頂點坐標,從四對對應(yīng)點計算透視變換。
計算3×3透視矩陣變換。
2.參數(shù)解釋
(1)src[ ]? :原圖像的四個頂點坐標所構(gòu)成的向量(數(shù)組)。
(2)dsr[ ]? :結(jié)果圖像的四個頂點坐標所構(gòu)成的向量(數(shù)組)。
代碼定義:
????????Point2f src[4]={Point2f(,),Point2f(,),Point2f(,),Point2f(,)};
????????Point2f dst[4]={? Point2f(0,0)? ,? Point2f(dsize().width,0),
? ? ? ? ? ? ? ? ? ? ? ? ? ? ??Point2f(0,dsize().height?),??Point2f (dsize().width?,dsize().height )? ?};
(3)solveMethod? : 求解方法傳遞給cv::solve的方法(分解類型) 該參數(shù)一般不需要調(diào)整,使用默認值即可。
四、代碼實戰(zhàn)
1.任務(wù)交代
現(xiàn)在組織下來了任務(wù),修狗在一次戰(zhàn)斗中了魔法變成下圖的慘樣,快使用你的力量幫助修狗恢復(fù)原樣。
2.營救修狗
---使用透視變換---
拯救思路:
(1)獲取頂點坐標
使用透視變換的函數(shù),最關(guān)鍵的是要獲取圖像的頂點坐標。
借助畫圖
?打開畫圖
左下角就會出現(xiàn)鼠標對應(yīng)位置的坐標
?
?原圖像的四個頂點坐標就碼好了
Point2f src[4] = {Point2f(160,300),Point2f(931,253),Point2f(105,787),Point2f(1000,859)};
?結(jié)果圖像的四個頂點坐標根據(jù)自己想要的來
圖像大小比較大,我把結(jié)果圖像的大小設(shè)置小一些
Point2f dst[4] = {Point2f(0,0),Point2f(380,0),Point2f(0,360),Point2f(380,360)};
(2)使用 getPerspectiveTransform()獲取M(M是warpPerspective()的參數(shù))
直接用函數(shù)
Mat TransImage = getPerspectiveTransform(src, dst);
?TransImage即M,我們要的3 x 3轉(zhuǎn)換矩陣。
(3)最后一步,透視函數(shù)上場!?
dsize參數(shù)的設(shè)置:
????????dst的大小默認是src的大小,dsize如下面的代碼設(shè)定的話在輸出窗口(輸出窗口默認為src大?。幸淮笃谏珔^(qū)域。
????????設(shè)置成Size(380,360)就只有我們想要的圖片區(qū)域。
????????但是設(shè)置下方代碼方便調(diào)換。?
warpPerspective(imgsrc, imgdst, TransImage, Size(imgdst.cols, imgdst.rows));
整體戰(zhàn)況即結(jié)果展示
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat imgsrc = imread("C:/r/dog.jpg");//讀取圖像
Mat imgdst; //定義結(jié)果圖,用于存放透視變換的結(jié)果
Point2f src[4] = {Point2f(160,300),Point2f(931,253),Point2f(105,787),Point2f(1000,859)};
Point2f dst[4] = {Point2f(0,0),Point2f(380,0),Point2f(0,360),Point2f(380,360)};
Mat TransImage = getPerspectiveTransform(src, dst);//獲取變換矩陣
warpPerspective(imgsrc, imgdst, TransImage, Size(380, 360));//進行透視變換
imshow("原圖",imgsrc);//展示原圖和結(jié)果圖
imshow("目標圖像", imgdst);
waitKey(0);
return 0;
}
?
?當當!拯救成功!
總結(jié)
這篇博客到這就結(jié)束了!謝謝看到這的小可愛!文章來源:http://www.zghlxwxcb.cn/news/detail-812518.html
如有錯誤,請指正!文章來源地址http://www.zghlxwxcb.cn/news/detail-812518.html
到了這里,關(guān)于初學(xué)opencv c++學(xué)習(xí)筆記(五)透視變換--warpPerspective()的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!