1. Halcon 单相机标定

Halcon 单相机标定

示例

在这里插入图片描述

* 标定文件路径
ImgPath := '3d_machine_vision/calib/'
*关闭窗口
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')
* 
* 相机标定.
* 
* 1. 根据畸变模型生成参数数组,例程选择的是area_scan_division模型(适用场景:精度不高,标定图片数量少),所以有9参数
* area_scan_polynomial精度较高,对径向畸变、切向畸变都进行校正
* 参数 CameraParam := ['area_scan_division',Focus,Kappa,Sx,Sy,Cx,Cy,ImageWidth,ImageHeight]
* Focus: 代表焦距,按照镜头参数进行填写,远心镜头填写0* Kappa: 代表畸变大小,因为在标定之前,所以填写0* Sx,Sy: 代表像元大小,即像元尺寸,产找相应相机参数即可;0.00000375m,0.000375cm,0.00375mm,3.75um;上面的单位都是m
* Cx,Cy: 代表图像的坐标中心,即图像像素尺寸宽高的一半;
* ImageWidth, ImageHeight: 代表图像的宽和高
gen_cam_par_area_scan_division (0.012, 0, 0.00000375, 0.00000375, 640, 480, 1280, 960, StartCamPar)
* 创建标定数据模型
* CalibSetup:'calibration_object'用于标定一个或多个相机的内参以及相机位姿,其他的四个用于手眼标定
create_calib_data ('calibration_object', 1, 1, CalibDataID)
* 2. 在标定数据模型中写入标定的类型以及初始相机参数,StartCamPar 第一步已经生成,所以直接使用即可
set_calib_data_cam_param (CalibDataID, 0, [], StartCamPar)
* 3. 在标定模型中定义标定的目标,即标定板文件的相关配置,引号中应该是内置的,未找到相应文件
set_calib_data_calib_object (CalibDataID, 0, 'calplate_80mm.cpd')
* 5. 标定板识别
NumImages := 7
for I := 1 to NumImages by 1
    * 读取图像
    read_image (Image, ImgPath + 'calib_image_' + I$'02d')
    * 显示图像
    dev_display (Image)
    * 找到标定板,并向标定数据模型中写入提取到的点和finder pattern 轮廓,可以到帮助里面仔细看下finder pattern的介绍
    find_calib_object (Image, CalibDataID, 0, 0, I, [], [])
    * 从标定数据模型中获取提取到的 finder pattern 轮廓
    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
* 6. 通过标定数据模型计算相机的内参和外参,Errors:标定后投影的均方根误差,单位像素
calibrate_cameras (CalibDataID, Errors)
* 7. 获取标定数据模型中存储或计算的数据,CamParam中的数值与1中的相应项对应
get_calib_data (CalibDataID, 'camera', 0, 'params', CamParam)
* The reference image, i.e., the image in which the calibratio
* plate is located on the ruler is the first image

* 8. 获取相机的位姿
get_calib_data (CalibDataID, 'calib_obj_pose', [0,1], 'pose', Pose)
* To take the thickness of the calibration plate into account, the z-valu
* 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.
* 9. 如果将标定板的厚度考虑进去,请执行下面一条命令
set_origin_pose (Pose, 0, 0, 0.002, Pose)
* measure the distance between the pitch lines
* 10. 读取一张测试图像
read_image (Image, ImgPath + 'ruler')
dev_display (Image)
* 11. 创建一个测量句柄
gen_measure_rectangle2 (690, 680, rad(-0.25), 480, 8, 1280, 960, 'bilinear', MeasureHandle)
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))
* 12.将像素左边转换到实际坐标系中
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')

在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Halcon相机标定代码.hdev 1.初始化 for example: Full image (640*480) Subsampling (320*240) ImageWidth 640 320 ImageHeight 480 240 2.标定板初始化 CaltabName := 'caltab_30mm.descr'//标定板描述文件 set_calib_data_calib_object (CalibDataID, 0, CaltabName) 3.创建数据模型 create_calib_data ('calibration_object', 1, 1, CalibDataID) 4.获取标定图片 相机拍摄不同位姿下图片8-15张,拍摄图片时标定板尽量覆盖整个视场(标定板要根据工作距离、视场大小定制);拍摄图片上的圆直径不得小于10个像素 5.加载所有图像,寻找标定板区域,确定圆心,将结果加载到组元中 for I := 1 to NumImages by 1 ... acquire image ... find_caltab (Image, Caltab, CaltabName, SizeGauss, MarkThresh, MinDiamMarks) find_marks_and_pose (Image, Caltab, CaltabName, StartCamPar, StartThresh, \ DeltaThresh, MinThresh, Alpha, MinContLength, MaxDiamMarks, RCoord, CCoord, StartPose) set_calib_data_observ_points (CalibDataID, 0, 0, I, RCoord, CCoord, 'all', StartPose) endfor 下面将Halcon中提取目标点的大致原理说一下: 首先find_caltab 算子对图像高斯滤波(核大小为SizeGauss),接着阈值分割(与之大小为MarkThresh)将标定板的区域找出来, find_marks_and_pose 算子对区域中的圆进行分割,找到圆的个数,周长,坐标位置等应该和标定板描述文件中的一致,否则会自动调整StartThresh,使得StartThresh按照DeltaThresh步长减小到MinThresh,知道找到准确的圆心。 6.有了所有图像中的圆心就可以标定了 calibrate_cameras (CalibDataID, Errors) 返回平均投影误差Errors

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值