*使用gen_caltab算子来制作一个标定板
* gen_caltab( : : XNum, YNum, MarkDist, DiameterRatio, CalPlateDescr, CalPlatePSFile : )
* XNum:每行黑色标志圆点的数量
* YNum:每列黑色标志圆点的数量
* MarkDist:两个就近黑色圆点中心之间的距离,单位是m
* DiameterRatio:黑色圆点直径与两圆点中心距离的比值
* CalPlateDescr:标定板描述文件的文件路径
* CalPlatePSFile :标定板图像文件路径,可以用ps打开
* Calibration 01: Code generated by Calibration 01
list_image_files ('E:/DeskTop/***', 'png', [], ImageFiles)
* 初始化标定参数
TmpCtrl_ReferenceIndex := 0
* 初始化标定描述文件
TmpCtrl_PlateDescription := 'E:/DeskTop/***/des.descr'
* 初始化相机参数
* StartParameters := ['相机模型', 焦距(mm), Kappa: 镜头畸变系数;正:枕形畸变 负:桶状畸变, 单个像元的宽Sx(um), 单个像元的高Sy(um), 中心点x坐标Cx(像素), 中心点y坐标Cy(像素), 图像宽, 图像高]
* StartParameters := [f, k, Sx, Sy, Cx, Cy, ImageWidth, ImageHeight]
StartParameters := ['area_scan_division',0.012,0,4.5e-06,4.5e-06,740,512,1480,1024]
* 要设置通用参数名称
TmpCtrl_FindCalObjParNames := ['gap_tolerance','alpha','skip_find_caltab']
* 要设置通用参数值
TmpCtrl_FindCalObjParValues := [1,1,'false']
* Calibration 01: Create calibration model for managing calibration data
* create_calib_data ('标定类型', 相机数目, 校准对象数目, 创建好的标定模型——输出参数)
create_calib_data ('calibration_object', 1, 1, CalibHandle)
* 设置相机内部初始值
* set_calib_data_cam_param (标定句柄, 相机序号, 相机类型, 与相机模型种类对应参数)
set_calib_data_cam_param (CalibHandle, 0, [], StartParameters)
* 设置标定目标
*set_calib_data_calib_object(标定句柄, 标定目标序号, 标定描述文件)
set_calib_data_calib_object (CalibHandle, 0, TmpCtrl_PlateDescription)
for Index := 1 to |ImageFiles|-2 by 1
* Calibration 01: Collect mark positions and estimated poses for all plates
read_image (Image, ImageFiles[Index])
rgb1_to_gray (Image, GrayImage)
* 寻找标定区域
* find_calib_object (标定图像, 标定句柄, 相机序号, 校准对象序号, 观察校准对象序号, 要设置通用参数名称, 要设置通用参数值)
find_calib_object (GrayImage, CalibHandle, 0, 0, 0, TmpCtrl_FindCalObjParNames, TmpCtrl_FindCalObjParValues)
endfor
* 通过同时最小化确定所有相机参数 过程
* Calibration 01: Perform the actual calibration
* calibrate_cameras (标定句柄, 化的方形误差 )
calibrate_cameras (CalibHandle, TmpCtrl_Errors)
* 查询在校准数据模型中存储或计算的数据
* get_calib_data (标定句柄, '项目类型', 项目序号, '数据名称', 数据值)
get_calib_data (CalibHandle, 'camera', 0, 'params', CameraParameters)
get_calib_data (CalibHandle, 'calib_obj_pose', [0, TmpCtrl_ReferenceIndex], 'pose', CameraPose)
* 读取标定板圆心数据
* get_calib_data_observ_points (标定句柄, 相机序号, 校准对象序号, 观察校准对象序号, 点的行坐标, 点的纵坐标, 检测到的点与观测标定对象点的对应, 观察到的校准对象相对于观察相机的大概估计姿势)
get_calib_data_observ_points (CalibHandle, 0, 0, 0, TmpCtrl_MarkRows, TmpCtrl_MarkColumns, TmpCtrl_Ind, CameraPose)
* 转换3D坐标系原点,补偿标定板厚度参数
*set_origin_pose (原始3D坐标系参数, X方向平移量, Y方向平移量, Z方向平移量, 新的3D坐标系——输出参数)
* Calibration 01: Adjust origin for plate thickness
set_origin_pose (CameraPose, 0.0, 0.0, 0.003, CameraPose1)
stop ()
* Calibration 01: Using the calibration plate as test object, the marks actually
* Calibration 01: lie above the corrected measurement plane. Therefore, we 'uncorrect'
* Calibration 01: the plane of measurement by the plate thickness here.
* Calibration 01: **********************************************************
* Calibration 01: Sample Task: Transform measurements into world coordinates
* Calibration 01: **********************************************************
* Calibration 01: First, obtain the image coordinates of some points of interest
* Calibration 01: lying in the reference plane. Here, we simply take the first
* Calibration 01: two mark center points of the plate
* 获取标定靶相邻两圆的圆心坐标
TmpCtrl_ImageRows := [TmpCtrl_MarkRows[0], TmpCtrl_MarkRows[1]]
TmpCtrl_ImageColumns := [TmpCtrl_MarkColumns[0], TmpCtrl_MarkColumns[1]]
* 不带圆角的多边形轮廓
* Calibration 01: A line between the two points, just for visualization
gen_contour_polygon_xld (TmpObj_ImageContour, TmpCtrl_ImageRows, TmpCtrl_ImageColumns)
* 将像素坐标转换为世界坐标平面z=0,单位为mm
*image_points_to_world_plane (相机内部参数, 新的3D坐标系, 要转化的行, 要转化的类, '单位', 转化后的X, 转化后的Y)
* Calibration 01: Convert image coordinate to world coordinates (using [mm]
* Calibration 01: The Z coordinates will be 0 by definition (on reference plane)
image_points_to_world_plane (CameraParameters, CameraPose1, TmpCtrl_ImageRows, TmpCtrl_ImageColumns, 'mm', TmpCtrl_WorldX, TmpCtrl_WorldY)
* Calibration 01: Determine the distance in world coordinate [mm]
* 技算两坐标距离
distance_pp (TmpCtrl_WorldY[0], TmpCtrl_WorldX[0], TmpCtrl_WorldY[1], TmpCtrl_WorldX[1], TmpCtrl_Distance)
stop ()
halcon 相机标定尺寸测量程序详解
最新推荐文章于 2024-06-22 23:05:52 发布