1. 标定参数的构成
• 标定参数分为相机的内参和外参;
• 内参:内参标定的是摄像系统的内部结构和关系,镜头的畸变在出厂的时候就已经固定下来的,唯一可能改变的是镜头和相机之间的组装关系。所以如果相机和镜头没有拆卸过,就不需要重新标定相机的内参了;
• 外参:外参是指摄像系统的坐标系与世界坐标系之间的关系,如果测量表面上下移动了,或测量表面旋转了,这时需要重新标定相机的外参,也就是重新确定摄像机在世界坐标系中的姿态。而标定外参只需要一张图像即可。
世界到相机的变换矩阵如下,object to camera
相机到世界的变换矩阵如下,camera to world
2. 标定流程代码
Halcon代码以及标定板图片/标定板参数文件下载地址:
链接:https://pan.baidu.com/s/1jbF9KIvPIwte1dOR7nk4fA
提取码:3qml
以下是halcon代码:以下代码完成的事情和使用标定助手完成内外参标定是一样的。
open_framegrabber ('KsjCamera_Release-19_11_x64', 1, 1, 0, 0, 0, 0, 'progressive', 8, 'default', -1, 'false', 'default', '255', 0, -1, AcqHandle)
grab_image_start (AcqHandle, -1)
* 1.创建标定模型
create_calib_data ('calibration_object', 1, 1, CalibDataID)
* 2.设置相机初始参数
* 相机类型/焦距/Kappa/像元尺寸/中心点坐标/分辨率
StartParameters:=['area_scan_division',0.008,0,3.2e-006,3.2e-006,1024,768,2048,1536]
set_calib_data_cam_param (CalibDataID, 0, [], StartParameters)
* 3.设置标定板参数
set_calib_data_calib_object (CalibDataID, 0, './Mycaltab.descr')
dev_get_window (WindowHandle)
for Index := 1 to 12 by 1
grab_image_async (Image, AcqHandle, -1)
write_image (Image, 'jpeg', 0, './'+Index)
* 4.标定板的查找(圆形阵列、蜂窝)
try
find_calib_object (Image, CalibDataID, 0, 0, Index-1, [], [])
* 5.显示
get_calib_data_observ_points (CalibDataID, 0, 0, Index-1, Row, Column, Index1, Pose)
gen_cross_contour_xld (Cross, Row, Column, 26, 0.785398)
get_calib_data_observ_contours (Contours, CalibDataID, 'caltab', 0, 0, Index-1)
disp_3d_coord_system (WindowHandle, StartParameters, Pose, 0.02)
catch (Exception)
Index:=Index-1
endtry
stop()
endfor
close_framegrabber (AcqHandle)
* 6.摄像机标定
calibrate_cameras (CalibDataID, Error)
* 7.获得内外参
get_calib_data (CalibDataID, 'camera', 0, 'params', CameraParam)
get_calib_data (CalibDataID, 'calib_obj_pose', [0,0], 'pose', obj_in_camera)
* 去掉厚度
set_origin_pose (obj_in_camera, 0, 0, 0.001, PoseNewOrigin)//标定板厚度1mm
* 保存内外参
write_cam_par (CameraParam, './campar.dat')
write_pose (PoseNewOrigin, './campose.dat')