相機是3D世界和2D圖像之間的一種映射。
透鏡成像原理、小孔成像原理
基本針孔模型(The Basic Pinhole Model)
以空間點到一張平面的中心投影來說明。令投影中心作爲歐幾里德座標系的原點,平面Z=f爲圖像平面(image plane)或聚焦平面(focal plane)。在此模型下,空間一點被影射到圖像平面上的一點,且該點就是連接點X與投影中心的直線與圖象平面的交點。根據相似三角形原理(similar triangles),很快知道圖象上的點座標,忽略圖象座標系的話,描述了一個世界座標到圖象座標的中心投影。這是一個從三維歐幾里德空間到二維歐幾里德空間的映射
一些概念:
投影中心成爲相機中心(camera centre),也稱爲光心(optical centre)。
相機中心到圖象平面的垂線稱爲相機的主軸(principal axis)或主射線(principal ray)。
主軸與圖象平面的交點成爲主點(principal point)
過相機中心平行於圖象平面的平面稱爲相機的主平面(principal plane).
用齊次座標表示中心投影
用向量來表示世界中的點及該點的像點,則中心投影可以表示成齊次座標之間的線性映射。(爲什麼這麼表示,參閱齊次座標相關知識)
經湊地寫成
主點偏置(Principal point offset)
前面的推導是假設圖象平面的座標原點在主點上,實際情況可能不是這樣,因此映射情形爲其中(px,py)是主點的座標
那麼,該方程用齊次座標可以表示成
矩陣K稱爲相機標定矩陣。是爲了強調相機被設定在歐氏座標系的原點且主軸沿着Z軸的指向,而點Xcam按此座標系表示,這個座標系稱爲相機座標系(Camera Coordinate Frame)。
相機的旋轉與平移
通常,空間中的點採用的並不是相機座標系,而是我們一種我們認知的世界座標系(World Coordinate Frame)。兩個座標系可以通過旋轉和平移聯繫。
設是一個3維非齊次矢量,表示世界座標系中的一點座標。是以相機座標系來表示的同一點,那麼我們可以記,其中表示相機中心在世界座標系中的座標,R是一個3x3的旋轉矩陣,體現相機座標系的方位。該方程在齊次座標下可表示爲
綜合主點的偏置和相機座標的平移旋轉有。向量X表示世界座標系中的點。對於一個一般的針孔相機有9個自由度;3個來自K(元素f,px,py),3個來自R,3個來自。包含在K中的參數稱爲相機內部參數(internal camera parameters)或相機的內部校正(internal orientation)。而包含在R和中的參數與相機在世界座標系的方位和位置有關稱爲外部參數(external parameters)或外部校準(exterior orientation)。
CCD相機
前面推導的針孔相機模型假定圖象座標在兩個軸向上有等尺度的歐氏座標,但CCD相機的像素可能不是正方形。如果圖象座標以像素來測量,那麼需要在兩個方向上引入非等量尺度因子(unequal scale factrors)。具體地說,如果x和y方向上圖象座標單位距離的像素數分別爲mx和my,那麼由世界座標到像素座標的變化需要左乘一個附加的因子diag(mx,my,1)而得到,因此一個CCD相機標定矩陣的一般形式是
同理,是用像素量綱表示的主點,它的座標是X0=mx*px和y0=my*py。因此,一個CCD相機有10個自由度。
有限射影相機(Finite Projective Camera)
爲了說明一般性,引入形如
的標定矩陣,增加的參數s稱爲扭曲參數(skew parameter).
一個相機
的標定矩陣K取上述(含扭曲係數)的形式時稱爲有限射影相機。一個有限射影相機有11個自由度。
例:用halcon的算子標定電腦上的羅技攝像頭c170
手頭標定板參數:7X7 陣列小圓點 圓點中心矩 7mm 圓點直徑3.75
算子:gen_caltab( : : XNum, YNum, MarkDist, DiameterRatio, CalPlateDescr, CalPlatePSFile : )生成一個標定板的描述文件(MarkDist 單位m)
則本標定板應設置爲:gen_caltab (7, 7, 7e-3, 0.5, 'caltab_c170.descr', 'caltab_c170.ps')
相機初始化參數
對於這種攝像頭有兩種畸變模型
(1)Division畸變模型
CameraParam:[Focus, Kappa, Sx, Sy, Cx, Cy, ImageWidth, ImageHeight]
(2)Polynomial 畸變模型
CameraParam:[Focus, K1, K2, K3, P1, P2, Sx, Sy, Cx, Cy, ImageWidth, ImageHeight]
注:當鏡頭爲遠心鏡頭時,Focus=0;
Division畸變模型只適用於進度要求不是很高,標定圖片數量較少的情況;Polynomial 畸變模型對鏡像畸變和切向畸變都校正,精度較高,花費時間長。
標定時個參數值的確定技巧
Focus f:鏡頭的標稱焦距, e.g., 0.016 m.; 對於遠心鏡頭爲0.
κ: 一般去0.0
Or:
K1, K2, K3,P1, P2:可全部初始化爲0
Sx: 由CCD\CMOS確定建議取值如下:
Full image (640*480) Subsampling (320*240)
1/3"-Chip 0.0000055 m 0.0000110 m
1/2"-Chip 0.0000086 m 0.0000172 m
2/3"-Chip 0.0000110 m 0.0000220 m
Sy: 由CCD\CMOS確定建議取值如下:
Full image (640*480) Subsampling (320*240)
1/3"-Chip 0.0000055 m 0.0000110 m
1/2"-Chip 0.0000086 m 0.0000172 m
2/3"-Chip 0.0000110 m 0.0000220 m
Cx and Cy: 光心座標初始值,建議取值如下:
Full image (640*480) Subsampling (320*240)
Cx 320.0 160.0
Cy 240.0 120.0
ImageWidth,ImageHeight:有實際圖片大小來初始化該值
Full image (640*480) Subsampling (320*240)
ImageWidth 640 320
ImageHeight 480 240
對於本攝像頭初始化參數:
Division畸變模型:StartCamPar := [0.005,0,0.0000075,0.0000075,320,240,640,480]
Polynomial 畸變模型:StartCamPar := [0.005,0,0,0,0,0,0.0000075,0.0000075,320,240,640,480]
gen_caltab (7, 7, 7e-3, 0.5, 'caltab_c170.descr', 'caltab_c170.ps')
ImgPath := 'D:/halcon work/標定/C170/'
dev_close_window ()
dev_open_window (0, 0, 652, 494, 'black', WindowHandle)
dev_update_off ()
dev_set_draw ('margin')
dev_set_line_width (3)
OpSystem := environment('OS')
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
* Calibrate the camera.
* CameraParam:[Focus, Kappa, Sx, Sy, Cx, Cy, ImageWidth, ImageHeight]
StartCamPar := [0.005,0,0.0000075,0.0000075,320,240,640,480]
* CameraParam:[Focus, K1, K2, K3, P1, P2, Sx, Sy, Cx, Cy, ImageWidth, ImageHeight]
*StartCamPar := [0.005,0,0,0,0,0,0.0000075,0.0000075,320,240,640,480]
create_calib_data ('calibration_object', 1, 1, CalibDataID)
set_calib_data_cam_param (CalibDataID, 0, 'area_scan_division', StartCamPar)
set_calib_data_calib_object (CalibDataID, 0, 'caltab_c170.descr')
NumImages := 9
for I := 1 to NumImages by 1
read_image (Image, ImgPath +'C170_'+ I$'02')
rgb1_to_gray (Image, GrayImage)
dev_display (GrayImage)
find_calib_object (GrayImage, CalibDataID, 0, 0, I, [], [])
get_calib_data_observ_contours (Caltab, CalibDataID, 'caltab', 0, 0, I)
dev_set_color ('green')
dev_display (Caltab)
endfor
calibrate_cameras (CalibDataID, Error)
get_calib_data (CalibDataID, 'camera', 0, 'params', CamParam)
write_cam_par (CamParam, 'camera_parameters.dat')
Message := 'Interior camera parameters have'
Message[1] := 'been written to file'
disp_message (WindowHandle, Message, 'window', 12, 12, 'red', 'false')
clear_calib_data (CalibDataID)
獲取標定圖片要求:
相機拍攝不同位姿下圖片8-15張,拍攝圖片時標定板儘量覆蓋整個視場(標定板要根據工作距離、視場大小定製);拍攝圖片上的圓直徑不得小於10個像素;
標定板充滿標定視野的1/3-1/4,對於標定板成像灰度值亮度應大於128,以便halcon算子能較順利的提取到標定板