采用多幅图像对面阵摄像机进行标定
最佳答案 问答题库568位专家为你答疑解惑
1.1 应用示例目的与思路
(1) 创建一个HALCON相机标定数据模型;
(2) 在标定数据模型中设置相机的类型和初始参数。
(3) 在标定模型中定义标定对象;
(4) 遍历HALCON标定板图像,并在标定数据模型中设置提取的点和轮廓;
(5) 相机标定获取相机的内参和外参;
(6) 检验标定效果。
1.2 应用示例相关算子介绍
(1) create_calib_data( : : CalibSetup, NumCameras, NumCalibObjects : CalibDataID)
功能:创建一个Halcon标定数据模型(即建立标定对象),用于存储相机标定的过程、标定数据以及相机标定或手眼标定的结果。
控制输入参数1:CalibSetup:标定类型,Default value: 'calibration_object',
'calibration_object'类型用于基于从对象标定的观测中提取的度量信息来校准一个或多个相机的相机内参和相机姿态(相机外参);
控制输入参数2:NumCameras:指定用于同时标定的摄像机数量,默认值1
控制输入参数3:NumCalibObjects:指定摄影机观察到的标定对象(标定板)的数量,默认值1
控制输出参数: CalibDataID:标定数据模型句柄(简称标定模型句柄)。
(2) set_calib_data_cam_param( : : CalibDataID, CameraIdx, CameraType, CameraParam : )
功能:在标定数据模型中设置相机的类型和初始参数。
控制输入参数1:CalibDataID:标定数据模型句柄;
控制输入参数2:CameraIdx:摄像机索引,默认值为0;
控制输入参数3:CameraType:摄像机类型,默认值: [];
控制输入参数4:CameraParam:摄像机初始内参。
(3) set_calib_data_calib_object( : : CalibDataID, CalibObjIdx, CalibObjDescr : )
功能:在标定模型中定义标定对象(设置标定板描述文件)。
控制输入参数1:CalibDataID:标定数据模型句柄;
控制输入参数2:CalibObjIdx:标定板索引,默认值0;
控制输入参数3:CalibObjDescr:标定板三维点坐标或标定板描述文件名。
(4) find_calib_object(Image : : CalibDataID, CameraIdx, CalibObjIdx, CalibObjPoseIdx, GenParamName, GenParamValue : )
功能:找到Halcon标定板,并在标定数据模型中设置提取的点和轮廓。
图像输入参数1:Image:输入图像;
控制输入参数1:CalibDataID:标定数据模型句柄;
控制输入参数2:CameraIdx:摄像机索引,默认值为0;
控制输入参数3:CalibObjIdx:标定板索引,默认值0;
控制输入参数4:CalibObjPoseIdx:观察到的标定版的索引;
控制输入参数5:GenParamName:待设置的通用参数的名称,默认值[];
控制输入参数6:GenParamValue:待设置的通用参数的值,默认值[]。
(5) get_calib_data_observ_points( : : CalibDataID, CameraIdx, CalibObjIdx, CalibObjPoseIdx : Row, Column, Index, Pose)
功能:从标定数据模型中提取标记点坐标。
控制输入参数1:CalibDataID:标定数据模型句柄;
控制输入参数2:CameraIdx:摄像机索引,默认值为0;
控制输入参数3:CalibObjIdx:标定板索引,默认值0;
控制输入参数4:CalibObjPoseIdx:观察到的标定板位姿的索引;
控制输出参数1:( Row, Column):检测到的标记点坐标;
控制输出参数2: Index:检测到的点与观测到的标定板上的点的对应关系。
控制输出参数3: Pose:粗略估计观测到的标定板相对于观测相机的姿态。
(6) calibrate_cameras( : : CalibDataID : Error)
功能:标定相机的内参和外参。
控制输入参数:CalibDataID:标定数据模型句柄;
控制输出参数:Error:均方根误差 (RMSE)
(7) get_calib_data( : : CalibDataID, ItemType, ItemIdx, DataName : DataValue)
功能:查询存储在标定模型中的数据(比如相机的内参和外参)。
控制输入参数1:CalibDataID:标定数据模型句柄;
控制输入参数2:ItemType:数据类型,'camera':表示要获取数据类型是与摄像机相关数据; 'calib_obj_pose':表示要获取数据类型与标定板位姿相关数据
控制输入参数3:ItemIdx:ItemIdx:输入参数,ItemType='camera'时,ItemIdx表示摄像机索引;ItemType='calib_obj_pose'时,ItemIdx是一个数组[CalibObjIdx, CalibObjPoseIdx],其中CalibObjIdx表示标定板索引,CalibObjPoseIdx表示参考位姿的图像索引;
控制输入参数4:DataName:输入要查询的属性名,'params'表示摄像机内参数;
'pose'表示摄像机外参数;
控制输出参数:DataValue:查询的结果。
例如:
*查询摄像机0的摄像机参数(内参)
get_calib_data (CaliDataID, 'camera', 0, 'params', DataValue)
*查询摄像机位姿(外参)
get_calib_data (CaliDataID, 'calib_obj_pose', [0,CalibObjPoseIdx], 'pose', Pose)
(8) set_origin_pose( : : PoseIn, DX, DY, DZ : PoseNewOrigin)
功能:计算原始的3D位姿经过向量平移之后新的位姿。
控制输入参数1:PoseIn:原始的3D位姿;
控制输入参数2:DX:沿着世界坐标的X轴的平移量;
控制输入参数3:DY:沿着世界坐标Y轴的平移量;
控制输入参数4:DZ:沿着世界坐标Z轴的平移量;
控制输出参数:PoseNewOrigin:输出新的位姿。
(9) image_points_to_world_plane( : : CameraParam, WorldPose, Rows, Cols, Scale : X, Y)
功能:将图像点变换到世界坐标系的z=0平面中,并返回它们在3D坐标中的X和Y值。
控制输入参数1: CameraParam:相机内参;
控制输入参数2:WorldPose:相机坐标系中世界坐标系的三维姿态(相机外参);
控制输入参数3: (Rows, Cols):待转换点的坐标;
控制输入参数4:Scale:比例或尺寸,Default value: 'm';
控制输出参数:X:世界坐标系中点的X坐标;
控制输出参数:Y:世界坐标系中点的Y坐标。
1.3 应用示例示例代码
ImgPath := './area_scan_calib_imgs/'
dev_close_window ()
dev_open_window (0, 0, 640, 480, 'black', WindowHandle)
dev_update_off ()
dev_set_draw ('margin')
dev_set_line_width (3)
set_display_font (WindowHandle, 22, 'mono', 'true', 'false')
*相机参数元组
gen_cam_par_area_scan_division (0.012, 0, 0.00000375, 0.00000375, 640, 480, 1280, 960, StartCamPar)
*创建一个HALCON相机标定数据模型
create_calib_data ('calibration_object', 1, 1, CalibDataID)
*在标定数据模型中设置相机的类型和初始参数。
set_calib_data_cam_param (CalibDataID, 0, [], StartCamPar)
*在标定模型中定义标定对象
set_calib_data_calib_object (CalibDataID, 0, 'calplate_80mm.cpd')
NumImages := 7
for I := 1 to NumImages by 1read_image (Image, ImgPath + 'calib_image_' + I$'02d')dev_display (Image)*找到HALCON标定板,并在标定数据模型中设置提取的点和轮廓find_calib_object (Image, CalibDataID, 0, 0, I, [], [])*从标定数据模型中提取轮廓get_calib_data_observ_contours (Caltab, CalibDataID, 'caltab', 0, 0, I)*从标定数据模型中提取点get_calib_data_observ_points (CalibDataID, 0, 0, I, Row, Column, Index, StartPose)dev_set_color ('green')dev_display (Caltab)dev_set_color ('red')disp_circle (WindowHandle, Row, Column, gen_tuple_const(|Row|,1.5))
endfor
*标定相机所有参数
calibrate_cameras (CalibDataID, Errors)
*获取相机内参
get_calib_data (CalibDataID, 'camera', 0, 'params', CamParam)
*获取相机外参
get_calib_data (CalibDataID, 'calib_obj_pose', [0, 1], 'pose', Pose)
*为了将校准板的厚度考虑在内,必须将相机姿态给出的原点的z值转换为校准板的宽度。
*如果不想添加校正,请停用以下行。
set_origin_pose (Pose, 0, 0, 0.002, Pose)
read_image (Image, ImgPath + 'ruler')
dev_display (Image)
gen_measure_rectangle2 (690, 680, rad(-0.25), 480, 8, 1280, 960, 'bilinear', MeasureHandle)
gen_rectangle2_contour_xld (Rectangle,690, 680, rad(-0.25), 480, 80)
measure_pairs (Image, MeasureHandle, 0.5, 5, 'all', 'all', RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, IntraDistance, InterDistance)
Row := (RowEdgeFirst + RowEdgeSecond) / 2.0
Col := (ColumnEdgeFirst + ColumnEdgeSecond) / 2.0
disp_cross (WindowHandle, Row, Col, 20, rad(45))
image_points_to_world_plane (CamParam, Pose, Row, Col, 'mm', X1, Y1)
distance_pp (X1[0:11], Y1[0:11], X1[1:12], Y1[1:12], Distance)
tuple_mean (Distance, MeanDistance)
tuple_deviation (Distance, DeviationDistance)
disp_message (WindowHandle, 'Mean distance: ' + MeanDistance$'.3f' + 'mm +/- ' + DeviationDistance$'.3f' + 'mm', 'window', 30, 60, 'yellow', 'false')
99%的人还看了
相似问题
猜你感兴趣
版权申明
本文"采用多幅图像对面阵摄像机进行标定":http://eshow365.cn/6-10004-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!
- 上一篇: 力扣第47天--- 第647题、第516题
- 下一篇: Python基础语法规则和Java不同的地方