1. 程式人生 > >基於OpenCV做“三維重建”(3)--相機參數矩陣

基於OpenCV做“三維重建”(3)--相機參數矩陣

過程 ora 希望 .cn href 標準 www. solid http

通過前面的相機標定,我們能夠獲得一些參數模型。但是這些相機的參數矩陣到底是什麽意思?怎樣才能夠判斷是否正確?誤差都會來自哪裏?這裏就必須要通過具體實驗來加深認識。采集帶相機參數的圖片具有一定難度,幸好我之前有著不錯的積累—這裏一共有兩款數據集,一款來自《OpenCV計算機視覺編程攻略》第3版,家裏面好像還有一款微單可以進行采集,這樣我們可以進行交叉比對,看一看獲得的參數是否符合實際情況:
數據集1 來自《OpenCV計算機視覺編程攻略》第3版 技術分享圖片數據集2來自家中“國民床單”技術分享圖片既然是做實驗,我想初步計劃一下。首先是要明確我能夠獲得那些東西?然後是比較這些東西是否真的像書上說的那樣符合實際?然後我會添加一些幹擾,看一看在有錯誤數據的情況,這些東西如何變化?最後是一個小結。
1、明確我能夠獲得那些東西?通過前面的代碼,我們大概是準備獲得這樣的東西:<?xml version="1.0"?>
<opencv_storage>
<Intrinsic type_id="opencv-matrix">
<rows>3</rows>
<cols>3</cols>
<dt>d</dt>
<data>
1.3589305122261344e+003 0. 5.7505355544729957e+002
0. 1.3565816672769690e+003 6.0423226535731465e
+002
0. 0. 1.
</data>
</Intrinsic>

<Distortion type_id="opencv-matrix">
<rows>1</rows>
<cols>14</cols>
<dt>d</dt>
<data>
9.5113243912423840e+001 1.4262144540955842e+003
5.2119492051277685e-003 2.8847713358900241e-003
1.2859720255043484e+002 9.5182218776001392e
+001
1.4741397414456521e+003 6.8332022963370434e+002 0. 0. 0. 0. 0. 0.</data></Distortion>
</opencv_storage>

從結果上看,我將獲得這兩個矩陣。前面那個是相機內參矩陣,後面那個是外參數。那麽在一組圖片中,內參肯定是不變的;後面外參肯定是變化的。但是這裏也有很多疑問。
技術分享圖片
那麽具體來看結果,對於第一組圖片來說,我們獲得的結果為:<?xml version="1.0"?>
<opencv_storage>
<Intrinsic type_id="opencv-matrix">
<rows>3</rows>
<cols>3</cols>
<dt>d</dt>
<data>
4.0927176647992695e+002 0. 2.3724719115090161e+002 0. 4.0870629848642727e+002 1.7128731207874495e+002 0. 0. 1. </data></Intrinsic>
<Distortion type_id="opencv-matrix">
<rows>1</rows>
<cols>14</cols>
<dt>d</dt>
<data>
1.8631118716959048e+001 -5.0639175384902096e+001
-5.2453807582033300e-003 -9.2620440694993842e-003
5.2367454865598742e+000 1.9002289932447418e+001
-4.8948501055979285e+001 -6.5115263545215851e-001 0. 0. 0. 0. 0. 0.</data></Distortion>
</opencv_storage>

<?xml version="1.0"?>
<opencv_storage>
<Intrinsic type_id="opencv-matrix">
<rows>3</rows>
<cols>3</cols>
<dt>d</dt>
<data>
3.9136489375791234e+003 0. 2.6879080836687035e+003 0. 3.9811430968074164e+003 1.9454067884808153e+003 0. 0. 1. </data></Intrinsic>
<Distortion type_id="opencv-matrix">
<rows>1</rows>
<cols>14</cols>
<dt>d</dt>
<data>
2.5259392493942739e-002 -3.2418875955674309e-001
3.6376246418718853e-004 3.2526045276898190e-003
-8.1692713459156296e-002 2.5694845194956913e-002
4.7826938999253371e-001 -1.3315729771950511e+000 0. 0. 0. 0. 0. 0.</data></Distortion>
</opencv_storage>
對於第二組圖片來說:
2、這些東西是否真的像書上說的那樣符合實際?
對於第一套圖片來說,看它的內參矩陣:<data>
4.0927176647992695e+002 0. 2.3724719115090161e+002
0. 4.0870629848642727e+002 1.7128731207874495e+002
0. 0. 1.
</data>

解析一下,fx = fy = 409 ;U0=237 V0 = 171,這個是代碼計算值。從實際情況上來看,技術分享圖片標準中間為 268,178,這個和237,171是比較符合的。
對於其它信息
技術分享圖片
這個焦距和我們計算出來的東西差距較大,如何比對?進一步研究,獲得這個相機的參數:
技術分享圖片可以獲得,它的傳感器尺寸為23.5mm X 15.7mm,那麽像素寬度分別為0.0438(=23.5/536)和0.044,反過來算焦距為17.9,這個比較接近。
書中給出的資料肯定是自己選擇過的,那麽我們自己重新采集一套圖片來說,那麽它的固有參數為:技術分享圖片

技術分享圖片技術分享圖片獲得的結果:
<data>
3.9136489375791234e+003 0. 2.6879080836687035e+003
0. 3.9811430968074164e+003 1.9454067884808153e+003
0. 0. 1.
</data>

翻譯一下,fx = 3913.6 fy=3981.1 U0=2687.9 V0=1945.4先看U V,5456/2 = 2728 3632/2=1816,這樣的話,差距在1.5%,這個差距看上去比較大,但是相對值比書中提供的數據要小。而對於焦距來說,像素寬度分別為0.00425(=23.2/5456)和0.0386算出來焦距為16.64和16.88,這個和16的差距也是比較合適的。

3、添加一些幹擾,容錯性如何?
最好的方法,是在有固定相機的情況下,重新采集一套圖片,這個對於讀者來說,如果有興趣,可以來做。
4、小結
通過比較,可以發現一下幾個特點:1、書本上采集的圖片,其角度範圍更為廣泛。所以說書上的采集方法對於我們後面做實際采集有指導意義;2、棋盤的大小和最後是否能夠產生良好結果關系不大,所以一個合適大小的棋盤就可以;此外:3、特別是對於視野比較廣的情況,應該優先想出高效解決方法。我認為視場越大,誤差越大;4、對於大照片的處理,本身就是一個比較復雜的問題:因為像素比較高,所以處理起來比較慢;而又不能通過壓縮之類的方法進行預處理,所以會有比較多的問題。目前還有沒有很好解決方法;
此外,你還必須考慮標定的過程中失敗的情況;還必須考慮采用什麽模式能夠讓標定的效果最好。
感謝閱讀至此,希望有所幫助。

來自為知筆記(Wiz)

基於OpenCV做“三維重建”(3)--相機參數矩陣