熱線電話:0755-23712116
郵箱:contact@legoupos.cn
地址:深圳市寶(bao)安區(qu)沙(sha)井街道后亭茅洲山工業園工業大廈全至科(ke)技創新(xin)園科(ke)創大廈2層2A
上(shang)面(mian)這副圖就是(shi)我們今天要處理的(de)了(le),我們想(xiang)把它(ta)從拍(pai)照(zhao)視角變成鳥瞰(kan)圖,這是(shi)機器人導航(hang)中的(de)常(chang)用手段(duan),以便(bian)在(zai)該平面(mian)上(shang)進行規劃(hua)和導航(hang)。
這種變換常常用到透視變換,但我們今天在講解透視變換時,需要普及一下其他的變換,包括平移,旋轉,錯切,放縮,以及仿射變換。
綜述
所有復雜的(de)東西,都是(shi)由基(ji)本的(de)組成的(de)。所以(yi)我們需要先了解一下基(ji)礎的(de)變換有哪些:
平移
我們對矩形(圖(tu)像(xiang))平(ping)移,需要怎(zen)么做?
對每一個像素點(dian)坐標(biao)平移。可以讓每一個像素點(dian)的x,y坐標(biao)都(dou)加一個變(bian)量。
矩陣形式表示:
等式(shi)左邊(bian)[X,Y,1]是像(xiang)素(su)坐標(biao)的齊(qi)次(ci)形式(shi)。等式(shi)右邊(bian)是平移之后的坐標(biao)。
放縮
進行放(fang)縮(suo),就是將矩形(圖(tu)像)放(fang)縮(suo)n倍(bei),也就是長寬各乘一個變量。
旋轉
對矩(ju)形(圖片)進行旋(xuan)轉,關于旋(xuan)轉的數學推導在后面仿射會介紹:
錯切
前面的都(dou)比(bi)較(jiao)直觀,那錯切是什么呢?
我(wo)們(men)可以看(kan)下矩形關于y方向的(de)錯切:
看圖就很直觀了,那(nei)數學表達(da)呢?
x軸上的錯切就是(shi)同理了,公式(shi)如下:
然后兩者和(he)起來,就如下(xia)了:
好了,到此(ci)我們就了解了這四種變換(huan)了,那仿射變換(huan)是什么呢?可以看下(xia)圖公式:
等式右邊就是仿射變換矩陣,是由原圖像平移,旋轉,放縮,錯切之后得來的。
在書上(shang)往往將仿射變(bian)換和(he)透視變(bian)換放(fang)一起(qi)講,這兩者各是(shi)什么呢(ni)?
在剛學(xue)仿射變換和透視(shi)變換時,我是有(you)些分不清的。印象最深刻的就是下(xia)圖:
可以看到,仿射變換(下)是將矩形變換成平行四邊形(即變換后各邊依舊平行),而透視變換(上)可以變換成任意不規則四邊形。
這樣看來,好像仿射(she)變換是透視變換的子集。
那到(dao)底是(shi)不(bu)是(shi)呢?其(qi)實是(shi)的。仿射變(bian)換(huan)屬于線性變(bian)換(huan),而透(tou)視變(bian)換(huan)則不(bu)僅(jin)僅(jin)是(shi)線性變(bian)換(huan)。仿射變(bian)換(huan)可以看做是(shi)透(tou)視變(bian)換(huan)的一種(zhong)特例。
直觀上(shang)感受,我們可以認(ren)為(wei):
仿(fang)射(she)變(bian)換是單純對(dui)圖片(pian)進行(xing)縮放(fang),傾斜和旋(xuan)轉,因此圖片(pian)不(bu)論(lun)如何變(bian)化,線之間的平行(xing)性是不(bu)變(bian)的。如下圖。
可以感受(shou)到,右圖是可以通過左圖平移(yi),旋轉,錯切,縮放之后得來。
而透視(shi)變換(huan),則是當(dang)觀察(cha)者的視(shi)角(jiao)發生變化時物體發生的透視(shi)變換(huan),此(ci)轉換(huan)允許造成(cheng)透視(shi)形(xing)變。
我們看(kan)下圖的公路,近處寬遠處窄(zhai),就(jiu)是因為視(shi)角的原因,
而我們(men)本文(wen)要(yao)做的,就是將視角(jiao)改為鳥(niao)瞰,從而得到(dao)類(lei)似(si)下(xia)圖的鳥(niao)瞰圖:
仿射變換原理
前文已經說了(le),仿(fang)射(she)變換是單純對圖片進行(xing)平移(yi),縮放,傾斜和旋轉,而這幾個操(cao)作都不會改變圖片線之間的平行(xing)關(guan)系。
opencv中給(gei)出了仿射變換的函數接口:
這個(ge)(ge)函數很好理(li)解(jie),輸入一個(ge)(ge)圖像,輸出這個(ge)(ge)圖像的仿(fang)射(she)變(bian)換。
但第三個參數需要我們輸入2*3的仿射計算矩陣,這是什么鬼?
我們先看一下仿射(she)計算矩陣長什么樣子(zi)(可以去掉最后一行(xing)):
我們的輸出(chu)圖像G(x,y) = F(x,y)乘仿射(she)矩陣。
我們可以看下(xia)圖推導出仿射計算矩陣。
一個點P在原(yuan)始坐標系下的(de)坐標是(Xsp,Ysp)。然后要完成旋轉操作,旋轉操作是基于原(yuan)點的(de)。如何得到旋轉之后的(de)點的(de)坐標,這里用到一個技巧:
坐標系中某個點的旋轉可以等價地去旋轉坐標軸。
所以有了上圖中以(Xs0,Ys0)為中心的(de)虛線與屏幕水平垂(chui)直的(de)坐標(biao)(biao)(biao)系(xi)(xi)。在(zai)這個坐標(biao)(biao)(biao)系(xi)(xi)中確定(ding)P的(de)坐標(biao)(biao)(biao),和在(zai)藍色坐標(biao)(biao)(biao)系(xi)(xi)中確定(ding)旋轉之后P的(de)坐標(biao)(biao)(biao)是等價(jia)的(de)。
基(ji)于這個結論,我們可以通過簡(jian)單的立(li)體幾何知識確定P在新坐(zuo)標(biao)系中(zhong)的坐(zuo)標(biao)。P在新坐(zuo)標(biao)系中(zhong)的X坐(zuo)標(biao)和Y坐(zuo)標(biao)分別(bie)是
進而我們可以得到:
到此,我們完成了旋(xuan)轉操(cao)作,如(ru)何平移(yi)呢?僅(jin)是加(jia)一個平移(yi)常(chang)數的事:
到此,我們(men)的2*3大小的仿射變換便推導出(chu)來了。
推導知道了(le),但(dan)如何(he)實(shi)現呢?
opencv同樣(yang)給(gei)我們提供了(le)計(ji)算(suan)仿射矩陣的函數接口:
這個(ge)函數可以計(ji)算出我們想(xiang)要圖像變換的矩陣,但需要我們輸(shu)入(ru)至少三對(dui)(dui)點集,點集是什么鬼?為什么是至少三對(dui)(dui)?
我們可(ke)以看到上面公式(shi)里有六個變量,因(yin)此自然(ran)需要至少列六個等式(shi)才可(ke)計算出該矩陣。
因此我們需要找輸入圖像(xiang)和輸出(chu)圖像(xiang)上一(yi)一(yi)對應的(de)三對點(3個x,y對應計算式)來(lai)作為輸入。
這樣,我們就(jiu)可以進行仿射變換啦。
透視變換原理
我們(men)說仿射(she)變(bian)換是在二維空(kong)間中的(de)旋轉,平移和(he)縮放。而透(tou)視(shi)變(bian)換則是在三維空(kong)間中視(shi)角(jiao)的(de)變(bian)化。
opencv中同樣給(gei)出(chu)了透視變換的函(han)數接口:
和(he)仿射(she)變(bian)換基本相同,不同的是輸入(ru)透視(shi)變(bian)換矩(ju)陣M大小為(wei)3*3:
上(shang)面矩陣(zhen)的(de)未(wei)知量比仿射變(bian)(bian)換的(de)矩陣(zhen)多了一個透(tou)視變(bian)(bian)換矩陣(zhen)T3(兩個未(wei)知量),因此我們(men)需要給下面計(ji)算透(tou)視變(bian)(bian)換矩陣(zhen)的(de)函數(shu)提供(gong)四(si)對以上(shang)的(de)點來求(qiu)解
T1為(wei)線(xian)性變換完(wan)成旋(xuan)轉,錯切(qie)和放縮(suo),T2完(wan)成平移操作。T3就是(shi)設了(le)兩個變量來表示(shi)映射(she)關系。
編程實現
理解了(le)(le)透(tou)視(shi)變換的原理后,我(wo)們就著手來實現了(le)(le)(代碼可以順次復(fu)制(zhi)即(ji)可運行):
首先(xian)是讀取原圖片并(bing)顯示啦(la):
然(ran)后(hou)我(wo)們需要選取原圖上的四個(ge)點(dian),并計算出該四對點(dian)變換(huan)后(hou)的位置。
如(ru)何(he)選點(dian)?我(wo)們可以選兩邊白條的(de)四(si)個定點(dian)。那變換后的(de)位(wei)置就(jiu)需要我(wo)們自(zi)己估算了,如(ru)下(xia)圖:
我們希望將(jiang)藍(lan)色的透視變(bian)換(huan)為黃色的。
我們選(xuan)取了如圖(tu)四個點,首先計算透視變換矩陣:
然后進行透視變換:
這(zhe)樣,我(wo)們就得到鳥瞰圖啦(la)。