從零開始一起學習SLAM | 神奇的單應矩陣
小白最近在看文獻時總是碰到一個奇怪的詞叫“homography matrix”,檢視了翻譯,一般都稱作“單應矩陣”,更迷糊了。正所謂:“每個字都認識,連在一塊卻不認識”就是小白的內心獨白。查了一下書上的推導,總感覺有種“硬湊”的意味,於是又找到了師兄。。。
神奇的單應矩陣
小白:師兄~單應矩陣是什麼鬼啊?我看書上的推導,每一步勉強能看懂,但還是不太理解其背後的物理意義,感覺不能轉化為自己理解的方式啊
師兄:哦,我第一次看的時候也是這種感覺
小白:而且這個名字好繞口啊,我完全沒法和它的物理意義聯絡起來
師兄:這個名字是直接翻譯的,是有點拗口,不過熟悉了也就還好。這個單應矩陣還是挺重要的
小白:師兄,能不能一句話告訴我單應矩陣是幹嘛的啊
師兄:嗯,我的理解是:單應矩陣描述的就是同一個平面的點在不同影像之間的對映關係,這裡前提是同一個平面,這個前提很重要
小白:還是不太懂啊,為什麼要在不同影像之間進行對映呢?這樣對映有什麼用呢?為什麼強調是同一個平面?
師兄:先別急,我一個個來說。我們先來看單應矩陣應用的一個例子。比如現在支付寶,微信都能透過對銀行卡拍照自動識別銀行卡號碼,但是一般我們拍照時銀行卡都不一定是正對著相機,可能會比較偏,比如像這樣
但是你對著銀行卡拍完照之後,你會發現這些軟體會自動把銀行卡摳出來,並且校正成非常規則的矩形,像下面這樣
這樣,識別銀行卡數字的時候也方便多啦!
小白:我用過這個功能哎,這裡面哪一步用到單應矩陣啦?
師兄:單應矩陣能夠實現自動把銀行卡從背景裡“提取”出來,並且變成非常規整的矩形。你想想我前面說的單應矩陣描述的是同一個平面的點在不同影像之間的對映關係
小白:這個銀行卡是一個平面,所以滿足“同一個平面的點”的要求,那不同影像就是指拍攝的原始影像和校正過的影像咯?
師兄:正解!透過單應矩陣就能完成上述功能,還有其他類似的例子,比如有些手機裡的小軟體實現拍攝紙質的名片、投影的PPT等自動校正為矩形的功能,完全一樣的道理。
小白:原來如此,單應矩陣這麼厲害呢!
師兄:這個只是最基礎的功能,實際上,單應矩陣還有非常多的應用。比如用於虛擬廣告牌,這是很多重大賽事中很常見。比如下面是一個原始的圖片。
我們想要把那個螢幕替換為“計算機視覺life”公眾號的logo,用單應矩陣很輕鬆就能實現,你看下面是我們替換的結果,是不是很有趣?
小白:好好玩啊!突然開始喜歡單應矩陣啦!
師兄:除了這些,單應矩陣還有幾個很重要的應用,一個是相機標定,比如張正友相機標定法,那個標定板不就是一個平面圖案嘛!如下圖所示
另外一個是單應矩陣還可以用於影像拼接,如下圖所示。
還有現在很火的擴增實境(AR),我們用平面二維標記圖案(marker)來做AR展示的觸發。我們根據單應矩陣就可以知道marker不同視角下的影像,這樣可以方便的得到虛擬物體的位置姿態並進行顯示,如下圖所示。
小白:真是開了眼界了!師兄,我已經迫不及待的要學習單應矩陣了!
快速理解單應矩陣
師兄:哈哈,單應矩陣的計算一般都會提供函式呼叫,我就簡單說說單應矩陣是怎麼來的,有哪些需要注意的地方
小白:好,師兄儘量通俗一點啊
師兄:嗯,你看下面這個圖,兩個不同的相機拍攝同一個平面
你還記得相機成像模型《從零開始一起學習SLAM | 相機成像模型》那一節中我們最後給的公式嗎?
小白:記得,就是下面這個式子,其中,Puv(u, v,1)是影像中的畫素座標, Pw(xw, yw, zw,1) 是世界座標系中的一個點,K是內參矩陣,R是旋轉矩陣,t是平移向量,它們一起寫成矩陣形式是 T,稱為外參矩陣,表示從世界座標系到相機座標系的變換。
師兄:很好!現在我們簡化一下表達形式,把中間部分記做M矩陣,如下
M矩陣是一個4 x 4 的矩陣,如果空間點在同一個平面上的話,我們可以看做 zw = 0,這樣M矩陣就變成了一個 3 x 3的矩陣,對於兩個不同的相機,畫素座標和空間點座標可以寫成如下的表示,其中M是3 x 3的矩陣
我們把上面兩個式子合併一下就得到了下面這個式子,其中的H就是單應矩陣啦!H矩陣的兩邊是兩張影像對應的匹配點對。也就是說單應矩陣H把三維空間中同一平面的點在兩個相機的成像圖片座標進行了對映。
小白:原來如此~書上的推導為什麼非要把1用平面方程來代替呢?
師兄:是為了增加空間點都是在平面的約束,本質上也是為了降維,把秩為4的矩陣降維成秩為3
小白:嗯嗯,上面的式子就是兩個影像上的匹配的點對的對映吧
師兄:對的,如果展開,你會發現一個式子對應2個方程。也就是兩個約束項。而單應矩陣本身自由度為8,所以只需要4個匹配點對就行啦
小白:等等,師兄,為啥單應矩陣H自由度為8?
師兄:這是因為等式兩邊都是齊次座標,所以可以進行任意尺度的縮放。因此一般都會對H進行歸一化,比如把最後一個元素設定為1,或者使得H矩陣所有元素的二範數為1
小白:明白啦,這樣理解容易多了。
師兄:嗯,為了加深你的理解,給你佈置一個作業,很有趣的作業哦,就是實現一下前面的虛擬廣告牌
小白:好,今天的作業挺有意思~
作業
題目:
利用OpenCV程式設計實現虛擬廣告牌的效果。提供兩張圖,一張是“計算機視覺life”公眾號的logo,另外一張是帶廣告牌的原圖,請用單應矩陣實現將原圖中廣告牌替換為提供的logo的效果。要求透過滑鼠點選來選擇要替換的廣告牌的四個頂點。參考結果:
原文連結:https://mp.weixin.qq.com/s/lx9P45fVniccrz5c68wPyw
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31562045/viewspace-2220170/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 從零開始一起學習SLAM | 點雲平滑法線估計SLAM
- 從零開始一起學習SLAM | 給點雲加個濾網SLAM
- 從零開始學golang之圖-鄰接矩陣Golang矩陣
- 從零開始一起學習SALM-ICP原理及應用
- 從零開始學習KafkaKafka
- 從零開始學習機器學習機器學習
- 從零開始學習laravelLaravel
- (十八)從零開始學人工智慧-智慧推薦系統:矩陣分解人工智慧矩陣
- eclipse學習從零開始Eclipse
- 從零開始學習的朋友應該如何學習Linux技術?Linux
- 從零開始學習 Go ——安裝Go
- 30天從零開始學習SwiftSwift
- 從零開始學習C++(0)C++
- 一起學習造輪子(二):從零開始寫一個ReduxRedux
- 想學人工智慧,先從理解矩陣乘法開始人工智慧矩陣
- 《從零開始學Swift》學習筆記(Day 17)——Swift中陣列集合Swift筆記陣列
- 我是如何從零開始學習前端的前端
- 從零開始學機器學習——網路應用機器學習
- 從零開始學習 React 高階元件React元件
- 從零開始學習邏輯迴歸邏輯迴歸
- 從零開始學習如何部署程式碼
- 從零開始內網滲透學習內網
- 如何從零開始學習一個框架框架
- python矩陣下標從幾開始?Python矩陣
- 跟我一起學《深度學習》 第二章 線性代數(2.3 單位矩陣和逆矩陣)深度學習矩陣
- 從零開始的Unity個人學習日記(二)Unity
- 從0開始學習java,應該從那塊開始學起?Java
- 從零開始學習OpenGL-14複習光照
- 一起學習造輪子(三):從零開始寫一個React-ReduxReactRedux
- 《谷歌JAX深度學習從零開始學》簡介谷歌深度學習
- 《Python深度學習從零開始學》簡介Python深度學習
- 從零開始學習開發人工智慧(一)人工智慧
- 軟體測試如何從零開始學習
- VUE2.0從零開始 學習路線Vue
- 從零開始學習C++之遞推C++
- 從零開始學習C++(1-1)C++
- 從零開始學前端動畫 —— 簡單的特效登入前端動畫特效
- 從零開始netty學習筆記之netty簡單demoNetty筆記