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


        通過前面的相機標定,我們能夠獲得一些參數模型。但是這些相機的參數矩陣到底是什么意思?怎樣才能夠判斷是否正確?誤差都會來自哪里?這里就必須要通過具體實驗來加深認識。采集帶相機參數的圖片具有一定難度,幸好我之前有着不錯的積累—這里一共有兩款數據集,一款來自《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  05. 7505355544729957e + 002 
    01. 3565816672769690e + 003  6. 0423226535731465e + 002 
    001.
    < /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  000000. < /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 
    04. 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 
    03. 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  02. 3724719115090161e + 002 
    04. 0870629848642727e + 002  1. 7128731207874495e + 002 
    001.
< /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  02. 6879080836687035e + 003 
    03. 9811430968074164e + 003  1. 9454067884808153e + 003 
    001.
  < /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、對於大照片的處理,本身就是一個比較復雜的問題:因為像素比較高,所以處理起來比較慢;而又不能通過壓縮之類的方法進行預處理,所以會有比較多的問題。目前還有沒有很好解決方法;

此外,你還必須考慮標定的過程中失敗的情況;還必須考慮采用什么模式能夠讓標定的效果最好。

感謝閱讀至此,希望有所幫助。





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM