1.内参标定:
(1)打开标定助手

(2)选择标定板的描述文件

(3)选择相机模型

(4)填入单个像素的宽高(看相机说明)和焦距(看镜头说明书)

(5)点击标定按钮

(6)保存内参文件

2.外参标定
代码如下所示:
cpp
* Attention:
* This program reads the internal camera parameters from the file
* 'camera_parameters.dat', which, e.g., could be generated by the program
* 'camera_calibration_internal.hdev'
*
ImgPath := 'E:/VS************/pantograph_picture20260110/BR - new2/'
*########################test_code##########################
*获取图片在系统中的绝对路径
get_system ('image_dir', WorkingDirectory)
*########################test_code##########################
dev_close_window ()
dev_open_window (0, 0, 852, 700, 'black', WindowHandle)
dev_update_off ()
dev_set_draw ('margin')
dev_set_line_width (1)
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
* Read the internal camera parameters from file
try
*!!读取相机内参
cacamera_param_Path:='E:/************/CamParam_New.cal'
read_cam_par (cacamera_param_Path, CamParam)
catch (Exception)
* run 'camera_calibration_internal.hdev' first to generate camera
* parameter file 'camera_parameters.dat'
stop ()
endtry
*
* Determine the external camera parameters and world coodinates from image points
*
* The external camera parameters can be determined from an image, where the
* calibration plate is positioned directly on the measurement plane
*??(这句话可能是错的)通过将标定板直接放置在测量尺子的平面上,就能获取图像点到世界坐标的外部参数
*#######################################原始代码_start###################################
* read_image (Image, ImgPath + 'calib_11')
*#######################################原始代码_end###################################
read_image (Image, ImgPath + 'pic1')
*#######################################new_code_end###################################
dev_display (Image)
CaltabName:='E:/*************/caltab_1000mm.descr'
*#######################################new_code_start###################################
*这个是'caltab_30mm.descr'文件路径
* CaltabName := 'E:/**********calib/caltab_30mm.descr'
*#######################################new_code_end###################################
*!!创建了一个标定数据容器,用于存储和管理所有标定相关的信息和参数。
*参数1:标定装置类型,默认使用标定板。参数2:相机数量。参数3:标定物体数量
create_calib_data ('calibration_object', 1, 1, CalibDataID)
* Here, the final camera parameters are already known and can be used instead
* of the starting values used in the program 'camera_calibration_internal.hdev'
*!!设置标定数据模型的相机初始化参数和类型。参数1:用于标识和管理整个标定过程的数据结构
*!!参数2:相机索引。参数3:相机类型。参数4:相机内参
set_calib_data_cam_param (CalibDataID, 0, [], CamParam)
*!!在标定模型中定义一个标定对象。参数1:标定数据模型的句柄。参数2:标定对象的下标
*!!参数3:标定板的描述文件名(里面包含标定板的各个信息,包括标定点的直径,单位为mm,行列数,行列间距,单位为mm。等信息)
set_calib_data_calib_object (CalibDataID, 0, CaltabName)
*!!找到标定板,并在标定数据模型中设置抽取的点和轮廓。参数1:输入的图像。
*!!参数2:标定数据句柄,包含相机参数和标定板信息。参数3:相机索引。参数4:标定物体索引
*!!参数5:位姿索引号,它要与get_calib_data_observ_points算子的参数4保持一致
*!!参数6,参数7:初始化行列坐标,这两个参数可选
find_calib_object (Image, CalibDataID, 0, 0, 1, [], [])
*!!用于获取标定板检测结果的可视化轮廓。它从标定数据对象中提取之前通过find_calib_object检测到的标定板的边界轮廓。
*!!参数1:检测到的标定板边缘轮廓。参数2:标定数据句柄。参数3: 指定要获取的轮廓类型
*!!参数4:相机索引。参数5:标定物体索引。参数6:位姿索引
get_calib_data_observ_contours (Caltab, CalibDataID, 'caltab', 0, 0, 1)
*!!从标定数据模型中,获取用于标定的特定图像上观测到的所有校准板(标定板)角点的实际图像坐标。
*即标定过程中,第几张图片的第几个标定板上的角点,在图像中具体的像素位置。参数1:标定数据模型的句柄。
*参数2:要查询的相机的索引号。参数3:要查询的标定板对象的索引号。参数4:要查询的图像的索引号。
*参数5、参数6:角点的行、列坐标。单位都是像素。参数7:角点在图中的索引号,从左上角开始计数。
*参数8:返回参数4的图像中,标定坐标系相对于相机坐标系的位姿。注意!!!!!它就是计算出来的外参!!!!!!!!
get_calib_data_observ_points (CalibDataID, 0, 0, 1, RCoord, CCoord, Index, PoseForCalibrationPlate)
dev_set_color ('green')
dev_display (Caltab)
dev_set_color ('red')
*!!显示标定板的轮廓。在图像中投影和可视化标定板的3D模型。参数1:标定板应可视化的窗口。
*参数2:标定板描述文件的名称。参数3:相机内参。参数4:标定板相对于相机的位姿。
*参数5:缩放因子。>1:放大标定板。0到1之间:缩小标定板。等于1:以真实世界尺寸(1:1)显示。
disp_caltab (WindowHandle, CaltabName, CamParam, PoseForCalibrationPlate, 1)
dev_set_line_width (3)
*!!根据给定的横纵坐标和半径,在图中画圆
disp_circle (WindowHandle, RCoord, CCoord, gen_tuple_const(|RCoord|,1.5))
* caltab_points (CaltabName, X, Y, Z)
* calibrate_cameras (CalibDataID, Error)
* To take the thickness of the calibration plate into account, the z-value
* of the origin given by the camera pose has to be translated by the
* thickness of the calibration plate.
* Deactivate the following line if you do not want to add the correction.
*!!将PoseForCalibrationPlate中的坐标原点,沿着它的X、Y、Z轴平移(参数2,参数3,参数4)个单位
*该单位是以 PoseForCalibrationPlate中的坐标系单位计算的。得到新的坐标原点PoseForCalibrationPlate
set_origin_pose (PoseForCalibrationPlate, 0, 0, 0.00075, PoseForCalibrationPlate)
clear_calib_data (CalibDataID)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
*############方法1结束############
*###############################test_code_start#########################################
*测试用计算出的外参和内参,反推出标定板的真实长宽
ImageRows:=[528,455]
ImageCols:=[693,2065]
* ImageRows:=[529,1858]
* ImageCols:=[693,793]
image_points_to_world_plane (CamParam,PoseForCalibrationPlate,ImageRows,ImageCols,'m',WorldX,WorldY)
Distance := sqrt((WorldX[1]-WorldX[0])*(WorldX[1]-WorldX[0]) + (WorldY[1]-WorldY[0])*(WorldY[1]-WorldY[0]))
(1)读取上面内参标定保存的文件

(2)

(3)计算出标定的外参(单张图片的)

(4)测试标定结果的准确性
