相机是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算子能较顺利的提取到标定板