相机标定(标定板标定)
什么是相机标定
消除相机拍摄时所产生的畸变,提高后续测量和定位的精度。
相机图像的标定过程涉及到多个坐标系的转换关系,但仅对标定过程而言,其过程非常简单。

这里要跟后面学的九点标定做一个区分。两者的目的和应用场景都不同
- 标定板标定是用于消除相机镜头造成的图像畸变,通过矫正后就能够还原图像正常比例和大小尺寸,避免计算误差!(所有拍摄的图像都是有畸变的,只是大小不同而已)
- 九点标定主要用于图像坐标系和机械物理坐标系进行映射关系,比如图像引导机械手抓取等等场景。
由于九点标定下,包含了图像本身的畸变在内部,所以在图像畸变不大的情况下能够准确计算转换关系,但是如果图像畸变很大,建议先用标定板计算图像的畸变然后每次矫正后图像再进行标定和实际坐标转换!
相机内参和相机外参
- 内参: 描述相机内部属性的参数,包括焦距、主点(光学中心)坐标、畸变系数等。内参通常在相机标定时确定,因为它们通常对于特定相机型号是固定的,不随时间变化。一旦相机内参被确定,它们在相机的使用过程中通常是保持不变的。用于校准图像产生的畸变。
- 外参: 外参是描述相机在世界坐标系中的位置和姿态的参数,通常包括旋转矩阵和平移向量。外参在不同的相机位置或拍摄时刻可能会发生变化。用于从相机坐标系映射到世界坐标系(标定板坐标系)。
通过获取到的标定板位姿信息生成对应的齐次矩阵,即可得到这种转换关系。

径向畸变与切向畸变
径向畸变


下面给出径向畸变的图像矫正模型,在径向畸变下,图像像素距离图像中心点越远,畸变程度越高。通过构造一个多项式通过计算参数(k1、k2、k3)来实现径向畸变矫正。

切向畸变


下面给出切向畸变的图像矫正模型,在切向畸变下,图像像素畸变程度呈现椭圆形。

畸变矫正
在Halcon中提供的标定工具中,涉及到几个参数(k1、k2、k3、p1、p2)来矫正畸变图像。这里的5个参数实际上就是上面畸变矫正模型的多项式方式中需要计算的5个参数。,下面给出完整的畸变矫正模型。

相机标定方法
目前最常用的标定方法是基于标定板的张氏标定法。并且在Halcon还提供了标定助手,实现相机标定非常简单。
下面首先介绍使用Halcon标定工具的标定方法,随后再给出标定流程的代码实现过程。
Halcon标定助手
- 打开标定助手后,按照提示信息填写。对于描述文件,Halcon已经内置一些描述文件。此外,我们还可以通过
gen_caltab算子去生成自定义的描述文件。

gen_caltab算子介绍
* 7 :x方向圆点数量
* 7 :y方向圆点数量
* 0.007 两个圆之间的距离, 单位米
* 0.5 比例值: Mark直径比上Mark中心距离
* caltab.descr 描述文件,用于标定文件的生成
* caltab.ps 标定文件,用于生产标定板。
gen_caltab (7, 7, 0.007, 0.5, 'D:/caltab.descr', 'D:/caltab.ps')
在摄像机参数中,Halcon提供了两种畸变矫正模型。多项式方式下需要计算的参数更多,自然矫正精度更高,但需要拍摄更多张照片。除法方式下,虽然精度低,但需要拍摄的标定图片数量更少。
像元尺寸、焦距这些参数按照相机填写即可。
- 切换到标定栏进行标定。
- 这里最好能够排20张图片,并且每张图片下,标定板只要要占据整张图像的50%-80%。
- 要保证标定板图像能够覆盖整个相机的视野。
- 可以对标定旋转或者抬起,从而让标定更加准确。

- 加载标定图像,设置参考位姿进行标定。参考位姿的设定往往用于标定后计算相机的外参,通常选择一个标定板位于图像中央的规范图像作为参考位姿。
注意,在进行标定之前,要仔细检测每一张图片。确保标定助手能够获取到每张图像中标定板的每个标定点,否则需要重新拍摄。

-
在结果栏中读取标定结果。

-
生成标定结果代码。对于插入的标定结果,可以保存到文件中以供后续使用。

点击查看代码
*内参
CameraParameters := ['area_scan_division',0.0136233,-18.1041,8.30065e-06,8.3e-06,1584.86,940.938,3072,2048]
*外参
CameraPose := [-0.00740558,0.0438921,0.126146,0.556056,0.778647,270.823,0]
stop ()
Halcon标定代码实现
先给出一个代码实现的流程图,里面涉及到的算子直接去Halcon文档找说明即可。

标定流程代码实现
*** 1.获取相机参数
gen_cam_par_area_scan_division (0.008, 0, 8.3e-06, 8.3e-06, 3072/2, 2048/2, 3072, 2048, CameraParam)
*** 2.创建标定数据模型(使用默认参数即可)
create_calib_data ('calibration_object', 1, 1, CalibDataID)
*** 3.在标定对象中设置相机参数(使用默认参数即可)
set_calib_data_cam_param (CalibDataID, 0, [], CameraParam)
*** 4.设置标定描述文件
set_calib_data_calib_object (CalibDataID, 0, 'C:/Users/Yty/Desktop/畸变纠正图像及描述文件/caltab.descr')
*** 5.加载标定图像,进行标定
list_image_files ('./', 'default', [], ImageFiles)
for index :=0 to |ImageFiles|-1 by 1
**获取图像
read_image (Image, ImageFiles[index])
**标定图像
find_calib_object (Image, CalibDataID, 0, 0, index, [], [])
***下面的算子 都是为了可视化 来验证标定结果如何,如果有图像获取不到,就把它删掉再重新拍
**获取轮廓
get_calib_data_observ_contours (Contours, CalibDataID, 'marks', 0, 0, index)
**获取标定点
get_calib_data_observ_points (CalibDataID, 0, 0, 0, Row, Column, Index, Pose)
**生成mark点
gen_cross_contour_xld (Cross, Row, Row, 6, 0.785398)
endfor
*** 6.标定
calibrate_cameras (CalibDataID, Error)
*** 7.获取内参
get_calib_data (CalibDataID, 'camera', 0, 'params', InnerCamParam)
*** 8.获取外参
get_calib_data (CalibDataID, 'calib_obj_pose', [0,0], 'pose', OutterCanParam )
set_origin_pose (OutterCanParam, 0, 0, 0.002, NewOutterCanParam)
*** 9.保存参数
write_tuple (NewOutterCanParam, './NewOutterCanParam.tup')
write_tuple (InnerCamParam, './InnerCamParam.tup')
*** 10.释放标定句柄
clear_calib_data (CalibDataID)
综上,就是一个标定流程的完整代码实现。
下面的标定结合就是本次标定的结果。

标定后参数的使用
有了相机的内参和外参,我们就能够实现坐标系的转换以及图像的畸变矫正。
在Halcon直接调用算子即可完整图像的畸变矫正和坐标系转换。
图像的畸变矫正
点击查看代码
read_tuple ('./NewOutterCanParam.tup',NewOutterCanParam)
read_tuple ('./InnerCamParam.tup',InnerCamParam)
*畸变矫正(使用默认参数即可),生成畸变为0 相机参数
change_radial_distortion_cam_par ('adaptive', InnerCamParam, 0, CamParamOut)
* 生成畸变矫正Map(传入原相机内参和矫正后的相机内参得到坐标的映射Map)
**方式1:使用Map就行矫正
* 读取图像
read_image (Image, './Image_20250605194235401.bmp')
gen_radial_distortion_map (Map, InnerCamParam, CamParamOut, 'bilinear')
* 进行畸变矫正
map_image (Image, Map, ImageMapped)
**方式2:直接进行畸变矫正
get_domain (ImageMapped, Domain)
change_radial_distortion_image (Image, Domain, ImageRectified, InnerCamParam, CamParamOut)
#这样也可以
#change_radial_distortion_image (Image, Image, ImageRectified, InnerCamParam, CamParamOut)
像素坐标系到世界坐标系的转换
- 先读取一张畸变矫正后的标定板图像,从标定板中提取两个标定点,计算两个标定点圆心的像素坐标。

- 利用外参将其转换到世界坐标系下,计算两点的真实距离。
- 利用当前标定板的真实圆心距,去计算一个比例关系(测量距离/真实圆心距),实现更精确的测量。
此时,真实距离=测量后的距离/比例稀疏
点击查看代码
*坐标转换
read_tuple ('./NewOutterCanParam.tup',NewOutterCanParam)
read_tuple ('./InnerCamParam.tup',InnerCamParam)
rgb1_to_gray (ImageRectified, GrayImage)
threshold (GrayImage, Region, 200, 255)
connection (Region, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 286627, 325809)
fill_up (SelectedRegions, RegionFillUp)
reduce_domain (GrayImage, RegionFillUp, ImageReduced)
*获取圆心坐标
threshold (ImageReduced, Region1, 0, 90)
connection (Region1, ConnectedRegions1)
select_shape (ConnectedRegions1, SelectedRegions1, 'area', 'and', 0, 3451.18)
select_obj (SelectedRegions1, ObjectSelected1, 1)
select_obj (SelectedRegions1, ObjectSelected2, 2)
select_obj (SelectedRegions1, ObjectSelected3, 3)
area_center (ObjectSelected1, Area, Row1, Column1)
area_center (ObjectSelected2, Area, Row2, Column2)
*转换坐标(传的是矫正畸变之后的相机参数)
image_points_to_world_plane (CamParamOut, NewOutterCanParam, Row1, Column1, 'mm', X1, Y1)
image_points_to_world_plane (CamParamOut, NewOutterCanParam, Row2, Column2, 'mm', X2, Y2)
distance_pp (X1, Y1, X2, Y2, Distance)
*利用标定板再次纠正距离(测量距离与真实距离的比值)
radio:=Distance/7
realDistance:=Distance/radio

然后,计算得到的比例关系为。

矫正后的结果为。


浙公网安备 33010602011771号