攝像機標定

1、攝像機外參:決定攝像機座標與世界座標系之間相對位置關係。

其中Pw爲世界座標,Pc是攝像機座標,他們之間關係爲

                               Pc = RPw + T

     式中,T= (Tx,Ty,Tz),是平移向量,R = R(α,β,γ)是旋轉矩陣,分別是繞攝像機座標系z軸旋轉角度爲γ,繞y軸旋轉角度爲β,繞x軸旋轉角度爲α。6個參數組成(α,β,γ,Tx,Ty,Tz)爲攝像機外參。

2、攝像機內參:確定攝像機從三維空間到二維圖像的投影關係。

   針孔攝像機模型爲6個參數(f,κ,Sx,Sy,Cx,Cy);遠心攝像機模型爲5個參數(f,Sx,Sy,Cx,Cy)。

   線陣攝像機爲9個參數(f,κ,Sx,Sy,Cx,Cy,width.highth)。

   其中,f爲焦距;

         κ表示徑向畸變量級,如果κ爲負值,畸變爲桶型畸變,如果爲正值,那畸變爲枕型畸變。

         Sx,Sy是縮放比例因子。對針孔攝像機來講,表示圖像傳感器上水平和垂直方向上相鄰像素之間的距離;

                             對於遠心攝像機模型,表示像素在世界座標系中的尺寸。

         Cx,Cy是圖像的主點。對針孔攝像機來講,這個點是投影中心在成像平面上的垂直投影,同時也是徑向

                           畸變的中心 。

                           對於遠心攝像機模型,只表示畸變的中心 。

        Vx,Vy,Vz:線陣攝像機必須與被拍攝物體之間有相對移動才能拍攝到一幅有用的圖像。這是運動向量。

sx和sy是相鄰像元的水平和垂直距離

 3、標定板爲正方形,尺寸大小爲要照射區域寬度的1/3,如像區爲100*80mm,那麼標定板爲30*30mm。其中標定板按照D:\Program Files\HALCON-10.0\calib(具體的視個人安裝位置所定)來用CAD畫圖。下面是自制標定板的網址。

http://www.ihalcon.com/read.php?tid=52

4、按照下面網址步驟進行標定

http://wenku.baidu.com/view/69e81567ddccda38376bafd7.html

5、具體實施步驟

標定的目的是確定相機的內參和外參

第一步:

    依照halcon標定板描述文件(後綴名是.descr)尺寸製作標定板。一般標定板大小是照射區域的1/3,每個標定孔的像素不能少於10個。

第二步:

       先定義內參的初始值。

StartCamPar:=[0.006,0,6e-6,6e-6,Width*0.5,Height*0.5,Width,Height]

依次是[焦距,畸變,像素尺寸寬,像素尺寸高,中心點座標寬,中心點座標高,圖片尺寸]

第三步:通過標定助手實現標定

       把內存保存成文件,通過標定助手完成。

write_cam_par (StartCamPar, 'E:/Halcon例子/攝像機標定/標定.dat')


導入自己剛纔保存的參數

選擇正確的描述文件

然後可以標定了

攝像機標定

利用相機不斷採集標定

爲使得圖片標定完成,調節下面這些參數。具體參數意義見翻譯的find_caltab、find_marks_and_pose這兩個參數。

攝像機標定

標定要是有問題會提示警告,如果沒有問題,標定板在每個位置每個標定孔都能識別出來。標定需要轉化十幾副圖片來準確確定內參和外參。查看結果

攝像機標定

相機外參顯示在這塊

相機內參會顯示在這塊

點擊保存可以把內參和外參保存成文件。

接着可以入下圖插入代碼。

攝像機標定

插入代碼,插入整個標定過程

第四步:使用程序實現相機標定

create_calib_data ('calibration_object', 1, 1, CalibModelID)

set_calib_data_cam_param (CalibModelID, 0, 'area_scan_division', StartCamPar)

set_calib_data_calib_object (CalibModelID, 0, 'caltab_100mm.descr')

先定義一個標定模版句柄。接着打開相機取圖或者直接讀文件裏的圖,開始標定。

通過find_caltab找到標定板位置,然後通過find_marks_and_pose確定標定點座標和相機外參RCoord, CCoord, StartPose。

通過set_calib_data_observ_points把讀取的標定點座標與描述文件比較結合相機外參,不斷修正相機標定模版CalibModelID。

calibrate_cameras (CalibModelID, ErrorsDiv)

    get_calib_data (CalibModelID, 'camera', 0, 'params', CamParam)

標定相機,讀取相機的參數給CamParam(內參)。

第五步:轉化成世界座標

image_points_to_world_plane (CamParam, StartPose, Row, Col, 'mm', X1, Y1)

把圖片中的Row, Col點們轉化到世界座標值X1, Y1

通過下面計算兩點距離

distance_pp (X1[0:4], Y1[0:4], X1[1:5], Y1[1:5], Distance)

可以通過image_to_world_plane來轉化圖片

第六步:確定原點(沒有實驗,待驗證)

標定時換很多位置放置標定板其實是爲了內參標定的更準確,外參只要一張標定板圖就可以確定了。因此,換各個角度標定內參,最後一個位置把標定板放在自己想要的座標原點位置再標定一次,那麼轉換成世界座標後,座標原點就是標定板中心點,標定板上的小黑角在第三象限,依次右手爲Y軸,X軸。(注:標定板防止的平面Z最好與使用的平面平行。Z軸正方向爲垂直平面向下。

  攝像機標定

然後,考慮標定板的厚度0.75mm,重新設置原點,光Z改變了(下面函數單位爲m)。

set_origin_pose (Pose, 0, 0, 0.00075, NewPose)

第七步完成:

完成。

發佈了16 篇原創文章 · 獲贊 5 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章