機器視覺的相機標定到底是什麼?
之前做識別演算法現在開始學習標定。用matlab。
剛開始看標定,先從單個相機開始看。標定板為何需要在不同角度拍20張照片?每次拍照時標定板位置放置有什麼講究?大概科普下吧,細節我再琢磨,計算工作基本沒看懂。
相機標定得到的內參僅僅是對相機物理特性的【近似】,這一點有些人可能一輩子都沒辦法意識到。
傳統相機標定假設相機是小孔成像模型,一般使用兩種畸變來模擬鏡片的物理畸變。但實際相機的物理特性很可能沒辦法通過上述假設來得到完全的擬合。所以需要意識到,每一次相機標定僅僅只是對物理相機模型的一次近似,再具體一點來說,每一次標定僅僅是對相機物理模型在採樣空間範圍內的一次近似。
所以當你成像物體所在的空間跟相機標定時的採樣空間不一樣的時候,你可能永遠都沒辦法得到足夠的精度,當你大幅改變相機與成像物體的距離的時候,你最好重新標定相機。如果你想在一個空間里得到更高的精度,你可以在空間里分層多次標定,實際計算的時候通過其他方式得到成像距離,從而選擇合適的標定參數。
補充回答題主的問題:
1.為什麼要用多張標定板圖片做標定? 具體數學實現題主可以自行找文獻,這裡只說原理。單目標定說白了其實就是解一個矩陣方程,其未知量是內、外參數矩陣。 根據線性代數,把解矩陣方程轉化成解方程組的問題,由於一張棋盤格只能提供8條相互獨立的方程(具體原因請查閱透視變換原理),所以不足以求出10個未知數。理論上,只需2個棋盤格便足夠解出全部參數了,但是matlab、opencv等為了增強魯棒性,還內設了優化方法,使用更多的棋盤格也就是用更多的信息來求得最優解。感謝這些大神吧。2.如何擺放標定板?
剛才說了,要這麼多棋盤格圖片其實是為了獲得更多的圖像坐標-世界坐標信息,進而做優化,得到標定參數的最優解。所以擺放的選擇只有一個:在儘可能靠近焦點的前提下,彼此位姿越不同越好。 位姿越不同的兩張棋盤格圖片,其利用角點坐標建立的方程就越獨立,越有代表性。可以用極限法去理解上面的話:假如每張棋盤擺放都完全一樣,那就算拍了一萬張標定板圖片,也只能提供8條相互獨立的方程,依然解不了方程組。-------------------------------------下面是原回答:
上面的回答都很專業,不過我覺得題主主要是要理清標定、識別、測量之間邏輯。請跟著我的思路,可能在某一步就能豁然開朗了。我儘可能避免理論和公式,希望能用儘可能通俗的話解釋。
我們從單目視覺說起。平時我們都說要做視覺識別、測量云云,然後我們就會去拍照,再對數字圖像做各種處理,顏色處理、灰度化、濾波、邊緣檢測、霍夫變換,最後得到了希望得到的特徵,是這樣的對吧?
不過請注意!到了這一步,其實我們僅僅是得到了一坨坨感興趣的像素而已!究竟要怎樣才能把這些像素轉化到現實世界的對象中呢?也就是說,究竟要怎樣對這些僅存在於圖像中的東西進行測量,才能得到具有實際意義和尺度的數據呢?這個時候我們就懵逼了……
沒錯, 攝像機標定的存在意義就是解決這個蛋疼的問題!!!
我們繼續看看,通過攝像機標定我們可以知道些什麼:
1.外參數矩陣。告訴你現實世界點(世界坐標)是怎樣經過旋轉和平移,然後落到另一個現實世界點(攝像機坐標)上。
2.內參數矩陣。告訴你上述那個點在1的基礎上,是如何繼續經過攝像機的鏡頭、並通過針孔成像和電子轉化而成為像素點的。
3.畸變矩陣。告訴你為什麼上面那個像素點並沒有落在理論計算該落在的位置上,還tm產生了一定的偏移和變形!!!
好了,到這裡是不是明白了一點?上述3點的每一個轉換,都有已經有成熟的數學描述,通過計算,我們完全可以精確地重現現實世界的任意一個點到其數字圖像上對應像素點的投影過程。
對於雙目視覺系統,通過立體標定還能進一步得到下面的參數:4.結構參數。告訴你右攝像機是怎樣相對於左攝像機經過旋轉和平移達到現在的位置。
通過結構參數,便能把左右攝像機獲取的圖像的每一個像素點之間的關係用數學語言定量描述,保證兩個相機都處於我們「可求」的狀態。
總的來說,攝像機標定是通過尋找對象在圖像與現實世界的轉換數學關係,找出其定量的聯繫,從而實現從圖像中測量出實際數據的目的。
當然,其實上述的各個轉換過程大部分都不需要用戶自己一個個寫程序實現,比如opencv就集成了單目標定函數calibracamera()、畸變校正函數undistortinitialmap()、雙目標定函數stereocalibrate()…… 其實自己親自走一遍流程就很容易領會到整個視覺測量的邏輯。比如說,在畸變校正中需要用到單目標定的畸變參數輸出和內參數輸出,在雙目標定中需要用到單目標定的外參數輸出,在外極線校準中需要用到雙目標定的結構參數輸出,在立體匹配中中需要用到外極線校準的輸出參數,在三維反求中需要用到立體匹配的輸出參數。用戶自己走完一遍這個流程,基本上就發現沒有做標定的話,幾乎什麼都幹不了。先說為啥20張,理論上是3張。先說不考慮畸變的情況。
首先圖像平面和標定板構成單應關係,每個單應關係可用一個單應矩陣表示,每個矩陣構成2個約束。單應矩陣內8個自由度,考慮矩陣的齊次性。因此至少4個點才能計算出這個單應矩陣。棋盤格的角點數一般是9X6=54個點。足夠了。
每個標定板擺放的角度對應一個單應矩陣。然後每個矩陣根據旋轉矩陣的單位正交性,可以構成2個約束,對應2個方程。
內參數矩陣中包含了5個自由度(主點u0,v0).焦距(fx,fy),以及skew。因此至少3個單應關係,才可以求解,因此至少3個擺放的角度。
另外考慮畸變參數的建模,一般有4個,因此使用LM方法完成非線性優化。實際應用中擺放的角度20個,不同的角度能夠保證目標函數更加接近凸函數,便於完成所有參數的迭代優化,使得結果更加準確。
針對評論中的問題,我想說的有點多,所以放在了這裡。我為啥這麼能說呢?
原問題是
標定應該是一個很精確的東西,從測繪行業來看一般是需要更高精度的設備或是儀器提供一個更精確的參考來完成標定,可zhang的方法直接這麼定義物方坐標,不說差的多但還是感覺會有點偏差的吧?
這裡就要體會作者題目的思想了,zhang文章的題目叫做 A Flexible New Technique for Camera Calibration,如果使用高精度的測量儀器製作一個精度極高的參照物,然後把每個點的坐標輸入程序進去,這當然是可以的,更經典的標定方法需要製作一個三維的標定物體以避免退化的情況,但是這些沒有辦法體現flexible。Zhang的這種使用棋盤格的方式使得只需要一台印表機和一個足夠平的平板,就可以完成標定。當然現在LCD顯示器到處都是,可以直接把棋盤格顯示在LCD上,同樣可以完成標定。LCD面板相對來講,是一個很好平面。另外標定的時候只需要輸入棋盤格的大小和個數,相對於一個個的點的輸入,真的是方便很多很多,那flexible真是名副其實。
zhang的文章主要focus還是在標定的演算法上,一個文章不會涵蓋了標定的方方面面,對於標定板的製作工藝,我們一般不太好建模,必要性也不大。標定板的大小可以從幾個厘米到幾米,小的可能製作的更加精準,大的可以粗糙一些,不然成本太高。標定板的平面度肯定是有誤差,這裡就要討論這種誤差是不是可以接受的問題了。我們在追求精度的時候,尤其是測量精度的時候,需要一個相對量,比方說測月地距離和自己的身高,使用的精度要求是不一樣的。在視覺上也有類似的場景。顯微視覺的標定板一般都是特殊儀器製作的,成本比較高,因為顯微視覺精度一般要求在um級別。而一個普通視覺下的,為了讓一個兩輪車在地上跑SLAM,使用一個LCD級別的平板標定,精度已經夠了。另外一個常用的原則是,讓標定板放在相機的常用工作距離,標定板的大小在視野的比例超過1/2。我們談論精度的時候一定是針對一定的應用場景的,離開應用場景談精度那都是耍流氓。
@立黨 已經解釋地很不錯了,我再從另外一些角度說一下吧。
相機標定的目的是確定相機的一些參數的值。通常,這些參數可以建立定標板確定的三維坐標系和相機圖像坐標系的映射關係,換句話說,你可以用這些參數把一個三維空間中的點映射到圖像空間,或者反過來。
相機需要標定的參數通常分為內參和外參兩部分。外參確定了相機在某個三維空間中的位置和朝向,至於內參,可以說是相機內部的參數(這好像是廢話...笑),我覺得需要引入一點光學的東西來更好地解釋一下。現有的相機都至少包含一個光學鏡頭和一個光電感測器(CCD或CMOS)。
通過鏡頭,一個三維空間中的物體經常會被映射成一個倒立縮小的像(當然顯微鏡是放大的,不過常用的相機都是縮小的),被感測器感知到。- 理想情況下,鏡頭的光軸(就是通過鏡頭中心垂直於感測器平面的直線)應該是穿過圖像的正中間的,但是,實際由於安裝精度的問題,總是存在誤差,這種誤差需要用內參來描述;
- 理想情況下,相機對x方向和y方向的尺寸的縮小比例是一樣的,但實際上,鏡頭如果不是完美的圓,感測器上的像素如果不是完美的緊密排列的正方形,都可能會導致這兩個方向的縮小比例不一致。內參中包含兩個參數可以描述這兩個方向的縮放比例,不僅可以將用像素數量來衡量的長度轉換成三維空間中的用其它單位(比如米)來衡量的長度,也可以表示在x和y方向的尺度變換的不一致性;
- 理想情況下,鏡頭會將一個三維空間中的直線也映射成直線(即射影變換),但實際上,鏡頭無法這麼完美,通過鏡頭映射之後,直線會變彎,所以需要相機的畸變參數來描述這種變形效果。
然後,說到為什麼需要20張圖片,這只是一個經驗值,實際上太多也不好,太少也不好。單純從統計上來看,可能越多會越好,但是,實際上圖片太多可能會讓參數優化的結果變差,因為棋盤格角點坐標的確定是存在誤差的,而且這種誤差很難說是符合高斯分布的,同時,標定過程所用的非線性迭代優化演算法不能保證總是得到最優解,而更多的圖片,可能會增加演算法陷入局部最優的可能性。
拍照時的標定板位置和朝向的多樣性,會讓內參的估計更為準確。準確的內參可以較好地把整個圖像的畸變都進行矯正,但如果給定的標定板的位置過於單一,比如都是在圖像的左上角,那麼優化得到的內參也可能只會比較好地糾正圖像左上角的畸變。推薦找個畸變較大的鏡頭做做實驗,會更形象。謝邀,簡單來說,就是復原相機模型的3D空間至2D空間的一一對應關係。
在去除畸變的情況下,相機標定就是求intrinsic matrix——K,因為3D點可以用(X,Y,Z,1)表示,2D點可以用(X,Y,1)來表示,因此3*3的矩陣K就包含了全部相機模型的內部參數(intrinsic matrix),K[R|t]就是三維點到二維點的線性變化關係(R是3-by-3 Rotation,t是translation,如果以其中一個相機C0為Reference Camera,那麼R=eyes(3),t=[0,0,0]",其他的R和t都是關於C0的R和t)。
在去除畸變的理想情況下,K的參數可以一一對應到針孔相機的焦距f,offset (x0,y0)以及skew s四個參數上,具體關係為K=[fx,s,x0;0,fy,y0;0,0,1]。理想情況的針孔相機,fx=fy,但是在大部分實測情況下,fx和fy之間仍然會有誤差。
理想狀態下,Zhang"s method的二維標定板的擺放不影響標定結果。但考慮到三維點實際投射到相機sensor上的誤差符合Gaussian distribution,因此盡量把所有網格包含在圖像內,不要角度過於偏,過於遠乃至偏到了toolbox無法精確提取calibration board的邊界即可。
畸變模型可以是高階線性甚至非線性的,通常相機廠商已經內置了去畸變的方法,輸出的圖像很精準了,當然如果有再次去畸變的要求可以閱讀相關論文,反正我最高也只實現過三次線性畸變移除。
20張當然不是定數,但理論上張數越多,normalize之後解中間那個矩陣誤差越小,上課時老師講過誤差分析,具體的我一時想不起來,Berkeley的課件上應該有。
當然也有三維的標定方法(拿一組三維的,互成90度的黑白格放在一起,並提取其中若干點),一維的標定(也是張正友提出的方法,在一根木棒上標定若干點,然後把一端放在桌子上,另一端做圓錐形運動,拍下若干張。這也是我上這門課的final project)等等等等。總之都是用幾何關係儘可能地找到K。
(我只回答關於相機模型問題。關於單反相機的使用,保養,技巧以及相機選購問題一律不懂,大家就不要邀請我了,靴靴
張氏標定法有一個博客系列不錯 張正友標定法 【計算機視覺學習筆記--雙目視覺幾何框架系列】
先仔細看下論文不好么?標定的方法有好多,想必你是看的張氏標定法,那就找論文看看啊Zhengyou Zhang, A Flexible New Technique for Camera
Calibrationhttp://research.microsoft.com/en-us/um/people/zhang/Papers/TR98-71.pdf標定板為何需要在不同角度拍20張照片? 張氏標定法理論上最少需要2張,要提高精度當然得多一點,太多又不好,浪費時間,20張不知是誰的經驗值,具體看你需求,張數的討論可以看論文 「Performance w.r.t. the number of planes.」部分
每次拍照時標定板位置放置有什麼講究?
看論文「Performance w.r.t. the orientation of the model plane.」部分寫的很明白為什麼不自己先看看呢一幅圖解釋內參與外參的含義。
大神們從理論上都已經講的很清楚了。
我就說下自己的一些看法。1.首先直擊疑問,標定是什麼?標定要得到什麼?
單目標定一般是要得到相機的內參信息(x方向的焦距,y方向的焦距,主點 i.e. principal point的位置的信息,還有畸變參數),而(固定位置的)雙目或多目標定則要在單目的基礎上,獲得相機之間的相對位置關係(也就是每個相機坐標系之間的平移和旋轉)。2.標定是為了什麼而服務的,也就是為什麼我們要標定?
這就涉及到圖像(又稱像素)坐標系,相機坐標系與世界(空間)坐標系之間的關係了。這個部分的內容可以上multiple view geometry的two view的那個章節去了解。
一般而言,對於單個運動的相機,要知道自己前後兩幀或者某兩幀的自身相機的運動關係(也就是不同時刻相機的相對位置關係),又或者說想要知道自己與世界坐標系的關係,這就需要用到外參數來描述。而對於多目攝像機之間的位置關係,也可以用他們之間的標定外參數來描述。說白了,外參數就是描述兩個坐標系之間的位置關係的。如果是相機與相機坐標系之間的,那麼就是描述相機坐標系之間的位置關係,如果是相機與世界坐標系之間的,那麼就是描述相機自身的運動關係。再說通俗一點就是要解決這麼一個問題,給定一個在別的相機或者世界坐標系下的一個3D點的坐標,而我現在又知道了我感興趣的這個相機坐標系與剛剛那個坐標系之間的位置關係,那我是否能夠知道該點在我感興趣的這個坐標系下的坐標呢?至於內參數,先說內參矩陣,包括x方向的焦距,y方向的焦距,主點 i.e. principal point的位置的信息。如果我們知道針孔相機的模型(實際上就是由內參矩陣描述的),那麼,給定一個在相機坐標系中的3D點,我們是否能夠知道它在我的2D圖像中的位置在哪呢?內參矩陣就是幫我們干這個事的。
然後說說說畸變參數,我們知道一般的針孔模型的相機有徑向畸變和切向畸變,獲得了畸變參數就意味著我們可以知道當沒有畸變的情況下一個點在圖像中原來的位置是在哪的。這東西很重要,因為有了這個東西,求得了真正的消除畸變的坐標,我們就可以使用(不考慮畸變的)針孔攝像機模型了。
總結一下就是:外參:另一個(相機或世界)坐標系-&>這個個相機坐標系,內參:這個相機坐標系-&>圖像坐標系
至於標定的細節問題。
理論方面的東西只有張正友的論文才能幫到你了。實際應用中,個人經驗是,單目標定板還是不要傾斜角度太大,盡量在攝像機視場範圍內的所有地方都出現,遠近也可以做一做,但不需要拉的太遠。不知道有沒有更好的操作,之前這麼做誤差還行,所以也就先這麼搞著。
至於雙目標定,就更有講究了。雙目視場是有重疊範圍和不重疊範圍的,舉個栗子,你把標定板放在左攝像機看到的地方而右攝像機看不到的不重疊範圍,那就不行了。這個是要主意的。然而這個時候就沒法覆蓋某一攝像機的全部視場了,這也沒有個辦法。至於多目的標定就更難了,我沒接觸過不懂。。。大神們也可以推薦下論文給我學習一個。。。歡迎討論,上面有什麼講的不對的還請各位大神指出和輕拍,對芝士無比渴望標定的作用其一就是為了求取畸變係數(因為經過鏡頭等成像後,或多或少都有畸變),其二是為了得到空間坐標系和圖像坐標系的對應關係。標定的過程就是一個最小化的求取參數的過程,拍的圖越多(相當於輸入)結果越準確,至少10張以上吧,而且儘可能覆蓋視野各個角落,要偏轉一定角度,這樣得出的參數是只用於整個場景的
剛學標定的時候看理論也是一頭霧水,通俗地講是
每個鏡頭的畸變程度各不相同,通過攝像機標定可以校正這種鏡頭畸變。
另外在攝像機標定後就可以得到在世界坐標系中目標物體米制單位的坐標,例如多少米或多少毫米。
不深究得話這些對理解來說足夠了。學到再補充。
相機標定主要實現以下幾個功能:1.畸變校正,2.真實值與像素值的轉換,3.如果有機械手或機器人實現坐標系統一
https://m.baidu.com/from=2001a/bd_page_type=1/ssid=0/uid=0/pu=usm%402%2Csz%40320_1003%2Cta%40iphone_2_5.1_1_11.2/baiduid=DB945DC9B7DA039C1B1A87828D9F28FB/w=0_10_/t=iphone/l=3/tc?ref=www_iphonelid=8895952564365452906order=6fm=aloptj=www_normal_6_0_10_titlevit=osresm=8srd=1cltj=cloud_titleasres=1nt=wnortitle=OpenCV%E7%9B%B8%E6%9C%BA%E6%A0%87%E5%AE%9Adict=30w_qd=IlPT2AEptyoA_ykytxgbtvau4yJSbJesec=17578di=e797ba4927612ce3bdenc=1tch=124.843.135.944.1.505nsrc=IlPT2AEptyoA_yixCFOxXnANedT62v3IEQGG_yFZ0z3xokmyxP4kHREsRDb6NnTLJ5DhxWeCvB9Cw8Oe071skNYWgKeqid=7b74c5b979ba680010000005585bacaewd=clk_info=%7B%22srcid%22%3A%221599%22%2C%22tplname%22%3A%22www_normal%22%2C%22t%22%3A1482402997957%2C%22xpath%22%3A%22div-div-div2-a-p%22%7D看這裡
一句話就是世界坐標到像素坐標的映射,當然這個世界坐標是我們人為去定義的,標定就是已知標定控制點的世界坐標和像素坐標我們去解算這個映射關係,一旦這個關係解算出來了我們就可以由點的像素坐標去反推它的世界坐標,當然有了這個世界坐標,我們就可以進行測量等其他後續操作了~上述標定又被稱作隱參數標定,因為它沒有單獨求出相機的內部參數,如相機焦慮,相機畸變係數等~一般來說如果你僅僅只是利用相機標定來進行一些比較簡單的視覺測量的話,那麼就沒有必要單獨標定出相機的內部參數了~至於相機內部參數如何解算,相關論文講的很多~
之前幾位同學@立黨@金秉文 等回答的都差不多了。前幾家公司主要做三維重建,全景視頻拼接,所以這幾年一直在做相機標定相關工作,我簡單說下我的看法:
相機參數一般包括內參數和外參數,內參數又包括相機焦距、駐點坐標、X軸和Y軸垂直扭曲skew、畸變參數;外參數包括旋轉矩陣和平移矩陣。像lz提到的單相機標定通常主要為了獲取相機內參數;雙目時內參數和外參數都需要進行標定。
對於相同標定版,標定時為了提高標定精度以及穩定性,需要從不同角度拍攝標定版獲取標定圖像,同時標定板盡量佔有整個相機視野,拍攝次數不能太少,我們當時大概6次左右吧,20次覺得必要性不大。
順便回答1.@張絲葦問題的:matlab標定工具箱有棋盤格自動提取演算法,opencv也有;2.@周德福的問題:全景拼接時需要利用圖像之間匹配的特徵點和轉換模型對相機之間內外參數進行標定,標定結果的好壞直接影響拼接效果,參數不準確會造成拼接錯誤等。圖像坐標和現實物理坐標做對應
你先要看看相機內參數,外參數,還有兩者的關係。推導出相機內參的求解矩陣,目的是通過外參數求解內參數,你可以發現這是個非齊次矩陣,也就是會有多個解,這需要增加已知量,也就是通過不通角度和距離來拍攝圖片,最終通過最小二乘法來求出最優解。
1,畸變,畸變,畸變
2,換算,換算,換算3,手眼,手眼,手眼20多張是為了提高精度,精度,精度確實有講究的方法呢,要不同角度。不同位置,傾斜,一般老說多拍點邊緣的,因為中心開始往外變形越來越嚴重。圖片有空就貼張正友的標定法論文里結果顯示11幅圖之後的效果都很好,標定板繞一個軸轉動的角度在45度時最好,我覺得45到70度都可以,這是我看完他的論文的結論,因為我的英文不是很好,所以理解的有限,希望可以一起學習,有什麼標定的心得希望可以不吝賜教
雙目視差演算法本身就是個近似演算法,而且視角重合部分才有效,所以視角狹小,所以不適合使用廣角鏡頭。而鏡頭畸變,多發生在廣角情況。換而言之,就是雙目應該用長焦距鏡頭,而長焦距鏡頭的畸變較小。因為雙目演算法,是基於像素的近似演算法,而在長焦情況下,畸變的誤差也在像素誤差以內,所以只要不是買太差的鏡頭,並且是雙目應用,那是沒必要自找麻煩去標定畸變的,標定了說不定整體誤差更大,基於一個誤差去矯正另一個誤差,價值不大。
推薦閱讀:
※無人機怎樣進行視覺定位?
※本科生,數字圖像處理方向,希望從事視覺檢測工作,本科能否勝任這些工作?
※普通手機攝像頭能獲得深度信息嗎?
※機器視覺怎樣開始學?halcon與c++還是c#搭配好?