halcon 相机标定尺寸测量程序详解


*使用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 ()


  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值