還記得當年的華南虎照片事件嗎?我們能否從相機成像的原理來分析得知那是個紙板老虎?相機標定為什么能夠達到小于0.01像素誤差的精度?單相機能進行三維測量嗎?這篇文章的下半部分里,將介紹與這些問題相關的知識。
Ⅰ前言
時間過得好快。自從完成了這篇關于高精度相機標定的文章的上半部分以來,兩個多月過去了。這兩個多月,我每天忙忙碌碌地做著各種工作,這其中也有一些相機標定的工作。轉眼已經11月,美國各大商店也早已擺滿了節(jié)日相關的商品。于是我蹬開被窩,決定把這下半部分寫完,這樣今年年底以前還能夠有空完成下一篇文章。
在上半部分里,我描述了針孔成像的原理、相機成像的模型、以及相機標定的基本原理。在這下半部分,我將介紹相機標定的具體實施和幾個基本的應用。
Ⅱ相機的成像與標定模型回顧
首先,我們回顧一下相機成像的數(shù)學模型。這個基于小孔成像的模型使得給定一個世界坐標系中的點,可以通過理論上的計算來得到它成像后在圖像中的位置:
當考慮鏡頭畸變時,這個模型要分解為以下三步:
顯然,相機的標定就是把這個數(shù)學模型中涉及到的參數(shù)確定下來。這些參數(shù)包括
18個內參數(shù):
6個外參數(shù):。其中決定了9個轉動參數(shù)。
因為相機成像的模型比較復雜,所以依賴于一張圖像來標定相機是不可靠的。但是我們可以把世界坐標固定在標定板上,通過轉動和平移標定板來得到多幅不同的圖像。當采用M幅標定圖像時,未知數(shù)的總數(shù)目是18+6M。 為了可靠、精確地得到這些未知數(shù),一般采用Levenberg-Marquardt非線性最小二乘算法來優(yōu)化如下殘差:
這里,和分別是模型函數(shù)求得的標識控制點的像素坐標和實際圖像中檢測到的像素坐標。
基于以上分析,我們可以看到,相機標定的關鍵步驟有兩點:(1)精確地得到相機采集到的標定板圖像中標識控制點的像素坐標位置;(2)運用迭代的方法來獲取相機的內外參數(shù)。
Ⅲ 相機標定的實施
·圖像中標識控制點的位置獲取
如前所述,目前最常用的標定板圖像有兩種:棋盤格圖案和圓點(環(huán))圖案。通常情況下,使用圓環(huán)圖案能得到比使用圓點和棋盤格圖案更高的精度。此外,同心圓環(huán)的個數(shù)可以超過2個。為了盡可能提高準確度,圓心的位置可以按照以下步驟來檢測:
1. 利用灰度梯度信息對圖像進行邊緣檢測,常用的算法是Canny邊緣檢測方法。
2. 搜索每一條連續(xù)的線。考慮到噪聲的干擾,一條線上的點無須像素挨著像素,線可以有斷開,而可允許的斷開距離需要根據(jù)圖像的情況設定。 3. 對屬于同一條線上的點,用橢圓模擬結合最小二乘的方法來確定這條線是否是一個橢圓,如果是,則去除一小部分偏差最大的點,重新擬合橢圓并計算橢圓圓心的坐標。
4. 檢查整幅圖像中的圓心數(shù)目是否正確。如果不正確,則需要改變檢測參數(shù),重復搜索圓心。
5. 根據(jù)檢測的圓心進行相機標定(詳細過程見下一節(jié))。
6. 根據(jù)標定結果把各圖像轉換為正面圖像,再利用模板匹配的方法得到相應的圓心并轉換回原始位置。這樣就得到了更準確的標識控制點的坐標。
7. 再一次進行相機標定。
采用上面所述的方法再加上一些優(yōu)化手段,相機標定的標識控制點的再次投影誤差可控制在0.01像素以下,相比之下,最常用的OpenCV相機標定庫和MATLAB相機標定工具箱只能得到0.1像素左右的誤差。
·標定過程的算法實施
Levenberg-Marquart非線性最小二乘算法是一種簡單而非常強大的算法,它本質上是把高斯-牛頓算法和梯度下降算法結合了起來。大家如果沒有用過,有時間的話可以自己寫代碼試一下。當然,如果實在覺得自己一行行地寫這個相機標定優(yōu)化的代碼有難度,還有一個方法就是使用谷歌的開源庫Ceres Solver以及相關的開源相機標定代碼?,F(xiàn)在,無論采用哪種方案,大家應該可以輕松搞定高精度相機標定了吧?!
其實事情還沒有那么簡單。原因是Levenberg-Marquart算法給出的是局部最優(yōu)解,而不一定是全局最優(yōu)解。為了解決這一問題,我們必須在迭代之前賦給標定參數(shù)們一些可靠的初始值。在所有的內參數(shù)中,我們其實只需要初始化α和β,其它的參數(shù)除了u0and v0設為圖像寬度和高度的一半之外,一律設為0即可。當然,外參數(shù)是需要全部初始化的。
那么,如何初始化呢?其實也不難,但是具體的推導過程會需要一些篇幅。我建議大家去讀一下Elan Dubrofsky的碩士論文[1]和張正友的那篇經典文章[2],就可以了!
此外,前面其實忽視了一個技術細節(jié),就是關于旋轉矩陣和它相應的旋轉向量。它們之間的互相轉換,沒什么難度。但是迭代算法所需要的相關求導,推導起來會讓人有些頭大??v然不能一一列出推導過程,但本著嚴謹求實又簡單快捷的科研精神,我把初始化和旋轉矩陣相關的關鍵公式列在這里。我相信如果你了解了Levenberg-Marquart算法,又讀了前面所提到的相關文章,是能夠看到這些公式的有用之處的!
旋轉矩陣對旋轉向量的導數(shù):
這里,
內參的初始化公式:
其中
H的計算以及實際編程中對一些變量的正則化,參考一下前述的文獻就一目了然了。
外參的初始化公式:
其中h的計算與上面的H類似,繼續(xù)參考一下文獻即可。
下面的動圖,顯示了上述相機標定的過程。
*高精度相機標定的步驟演示
Ⅳ 相機標定的擴展
得益于使用圓環(huán)圖案、利用模板匹配更新圓心位置、以及使用復雜的鏡頭畸變模型等措施,上述的相機標定方法在實測中可以達到再次投影誤差在0.005-0.01像素的范圍內。而在后續(xù)的三維成像應用中,可以容易地幫助三維成像達到微米級的精度。但是,上述的相機標定的一個主要缺陷是它依賴于使用帶標定圖案的標定板。
在小尺度視野的相機標定中,尚可以使用光刻的微小標定板和變更的成像模型來實現(xiàn)標定。而在稍大尺度視野下的相機標定中,可以使用編碼的標定圖案,因為圖案是可以隨意放置的,如下圖所示的幾塊標定板可以同時且隨意地放在視野中。
*編碼的標定圖案可以用來在較大視野下的相機標定
然而,在超大的視野下,采用標定板的相機標定方法是不可行的。如下圖中對水壩位移的監(jiān)測應用。關于這種情況的高精度標定方法,我將在接下來的幾篇文章中有介紹,請耐心等待。
*采用標定板的相機標定方法在超大視野應用中是不可行的
Ⅴ相機標定的幾個基本應用
到此,相信大家已經清楚相機標定是怎么回事和怎么實施了。如果還有不明白的地方,就請把這篇文章的上下兩部分再仔細讀一遍。如果還需要幫助,那就......
但是,事情還沒有結束。
既然我們花了這么長的篇幅介紹高精度相機標定,那就索性再多介紹一點兒關于相機標定的基本應用。比如,看下面這張幾周前國慶70周年閱兵的一個鏡頭。假設相機或者攝像機是標定過了的話(注:這個標定其實屬于超大視野標定),我們能夠得到什么額外的常規(guī)相機不能提供的信息呢?
*國慶70周年閱兵現(xiàn)場的一個鏡頭
為了回答這個問題,我們先再一次回顧一下相機的成像數(shù)學模型:
當我們拿到一幅由已經標定過的相機拍攝的照片后,對于照片中每一個基本單元—像素,上面公式中有四個未知量:。方程有幾個?只有三個!這就意味著我們是不能解得那四個未知量的。這倒也符合我們的常識:單憑單個相機是不能用來做三維成像的。接下來,問題來了。我們本著愛鉆研的精神,想:能不能引入一些額外信息,使得方程可解呢?答案是肯定的。
我們知道天安門城樓上***畫像的尺寸是有規(guī)格的,于是查了一下:高6.4米,寬5米?,F(xiàn)在,我們任選這個畫像的三個角點,那么顯然上面的公式將給我們總共12個未知量和9個方程。與此同時,這12個未知量中的9個三維坐標還會根據(jù)畫像的尺寸組成下面三個公式:
完美!因為現(xiàn)在我們有12個未知量和12個方程,問題可以解決了!也就是說,我們是可以通過解方程來得到畫像的三維坐標的。即便畫像在圖像中不是正對著相機而是傾斜的,也沒有問題。另外,我們也可以得到其它的一些信息,比如拍攝者距離天安門有多遠。這個例子在當前的熱門領域—網售和物流—是有重要應用的,它可以檢測商品和包裝盒的姿態(tài)來配合機械臂進行分揀。
在寫上面單相機進行三維測量的過程中,我想起了多年前的華南虎照片一事。相信大家都知道此事,實在不知道怎么一回事的就百度一下吧。這件事情的核心,就是陜西省安康市某村一個叫周正龍村民,從年畫上復印了一張老虎的圖片,再貼到紙板上并立到草叢中,然后在幾米到10米不等的距離處拍了幾十張照片。之后,宣稱自己拍攝到了瀕危動物野生華南虎。一出鬧劇之后,陜西省政府正式通報,照片中的老虎其實是紙板老虎。
*曾經轟動一時的周正龍所拍攝的“華南虎”照片
我提這件事情的原因是想給大家出一道“作業(yè)題”:根據(jù)周正龍所拍的一系列照片,雖然我們不能去標定當時的相機,通過本篇文章所介紹的知識,你能否通過計算分析得出那個老虎是個平面老虎?
讓我們再回到四個未知量和三個方程?,F(xiàn)在假設我們有兩個相機,在共同的世界坐標系下標定后,那么對于物體或場景中的任何一個實際點來說,如果它能同時出現(xiàn)在兩個相機分別拍攝的照片中,總共就有五個未知量:和六個方程。也就是,未知量居然比方程數(shù)還少一個!毫無疑問,問題是可解的。這也就是我們常說的立體視覺。例如下圖中的人臉三維成像。
*使用雙相機的人臉三維成像
當然,這種基于雙相機的三維成像有一個難點:左右圖像的匹配。也就是對于一幅圖像中的一個像素,必須在另一幅圖像中找到對應的另一個像素。為了使匹配容易,一些產品例如蘋果手機的三維人臉成像傳感器、英特爾的RealSense三維測量傳感器,都會采用紅外的點結構光來輔助圖像的匹配。關于這個話題,我將在以后專門寫一篇文章。
事情到這里,細心的讀者也許會有一個疑問:我們既然“一不小心”把未知量數(shù)目減少得比方程數(shù)目多了從而使得事情變復雜了—也就是需要左右圖像的匹配,那么我們能否把未知量數(shù)目增加一個回去,從而使得匹配的問題變簡單呢?
答案是可以的。比如我們只匹配水平方向的像素,那么未知量的數(shù)目是六個:,結合六個方程,問題是可解的!可是,怎么實現(xiàn)呢?
這時,有的讀者也許會馬上想到:Image Rectification 呀!不錯,Image Rectification正是只匹配了一個方向!不過遺憾的是,如果這個Rectification的方案可行,那么有了圖像后,馬上解方程好了,根本不再需要做任何匹配。而那個Middleburry數(shù)據(jù)庫和評估網站也可以馬上關掉了。顯而易見,這個方案是有問題的。至于原因,就再留給大家思考好了!
審核編輯:劉清
-
matlab
+關注
關注
181文章
2960瀏覽量
230027 -
OpenCV
+關注
關注
29文章
624瀏覽量
41214 -
相機成像
+關注
關注
0文章
15瀏覽量
5634
原文標題:重磅!如何做到相機高精度標定?
文章出處:【微信號:3D視覺工坊,微信公眾號:3D視覺工坊】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論