【机器视觉】线阵相机模型说明以及使用HALCON标定助手对线阵相机进行标定

1 相机内外参数(Intrinsics & Extrinsics)说明

线阵相机矫正所需参数共17个,其中11个参数为内参,6个参数为外参。

1.1 内参(Intrinsics ) 说明

线阵相机内参CamParam数量共11个,模型如下:

CamParam:= [Focus, Kappa, Sx, Sy, Cx, Cy, ImageWidth, ImageHeight, Vx, Vy, Vz]
在这里插入图片描述

Focus : 镜头焦距;
Kappa: 镜头畸变系数;正:枕形畸变 负:桶状畸变
Sx: 传感器像元宽度;
Sy: 传感器像元高度;
Cx: 表示镜头光轴在像平面坐标上的投影横坐标,一般初始化的时候设置为width/2;
Cy: 表示镜头光轴在像平面坐标上的投影纵坐标,一般初始化的时候设置为0,因为是一条线,所以纵坐标为0;
ImageWidth: 完整图片像素宽度;
ImageHeight: 完整图片像素高度;
Vx : 误差所致。x方向上运动速度,其实就是每拍摄一条线,x方向上的运动距离(宽),相机和运动方向不可能完全垂直,理论上为0最理想。
Vy: y方向上运动速度,其实就是在扫描的时候,多远距离拍摄一条线(高)
Vz: 误差所致。z方向上运动速度,其实就是每拍摄一条线,z方向上走的距离(深度),理论上为0最理想

1.2 外参(Extrinsics)说明

世界坐标系到相机坐标系(外参)。共有6个参数,表示了世界坐标系在相机坐标中的三维姿态。
在这里插入图片描述
六个参数分别为x,y,z三个轴的旋转角度和x,y,z三个轴的平移量。
摄像机坐标(xc,yc,zc)到世界坐标(xw,yw,zw),
也就是外在参数模型如下,其中,代表旋转
矩阵和平移向量在这里插入图片描述

2 使用Halcon标定助手进行相机标定

2.1 使用HALCON标定工具,设置标定板描述文件路径,以及相关参数

在这里插入图片描述

2.2 标定设置

2.2.1 Setup

->选取合适的标定板文件或者自定义生成的标定板描述文件
->设定标定板厚度
->选取相机模型(线阵-多项式)
->设定像元大小、镜头焦距、运动速度等
在这里插入图片描述

2.2.2 Calibration

->取已经拍摄的用于标定的图像或使用相机助手获取标定板图像。
->在所有文件检测均有效后Calibrate按钮将由disable变为enable
->选中一张图像点击Set Reference设置参考文件。
->完成后点击Calibrate
设置参考的作用是什么?设置的是当你标定完成之后,使用相机内参外参进行矫正之后的图片。HALCON会将这个图片上的标定板中心点作为远点坐标,并且这张变换后的图片作为相机垂直照射的平面参考。
在这里插入图片描述
下图由于导入的图像中标记提取失败,所以无法标定。必须保证所有图像都能提取到标记。提示检出质量问题时,如果对标定精度要求不是很高也是可以做标定的。此时Calibrate按钮是灰色的。
如果加载的图片找不到标定板,可以在最下方的标定板提取参数中改变参数,一般就能找提取到标定板了。最后点击标定按钮,就可以得到标定的参数了。
在这里插入图片描述

删除提取标记失败的55号图像,Calibrate变为高亮,点击即可进行标定。
在这里插入图片描述

2.2.3 Results

标定完成后即可获得标定的相机内参和外参结果。点击对应的Save按钮将参数保存到指定位置。
在这里插入图片描述

2.2.4 Code Generation

在这里插入图片描述

HALCON内代码生成:“*”星号代表注释

* Calibration 01: Code generated by Calibration 01
CameraParameters := ['line_scan_polynomial',0.153733,-114.127,93051.7,-4.24526e+07,-0.0433822,-3.50799e-05,7.04e-06,7.04e-06,3940.36,-0.362735,8192,6000,2.24896e-08,4.16196e-05,1.75223e-07]
CameraPose := [0.0177446,0.110862,0.898555,2.62363,347.663,180.539,0]

* Calibration 01: Sample code generated by Calibration 01
* Calibration 01: For demonstration purposes, we use the calibration
* Calibration 01: plate itself as sample object.
* Calibration 01: Therefore, we load the reference image
read_image (Image, 'C:/Users/Public/Documents/MVTec/HALCON-20.11-Steady/examples/images/calib/calib_distorted_01.png')
* Calibration 01: Extract plate data from the image
TmpCtrl_PlateDescription := 'C:/Program Files/MVTec/HALCON-20.11-Steady/calib/caltab_30mm.descr'
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 ('calibration_object', 1, 1, CalibHandle)
set_calib_data_cam_param (CalibHandle, 0, [], CameraParameters)
set_calib_data_calib_object (CalibHandle, 0, TmpCtrl_PlateDescription)
find_calib_object (Image, CalibHandle, 0, 0, 0, TmpCtrl_FindCalObjParNames, TmpCtrl_FindCalObjParValues)
get_calib_data_observ_points (CalibHandle, 0, 0, 0, TmpCtrl_MarkRows, TmpCtrl_MarkColumns, TmpCtrl_Ind, CameraPose)
* 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.
set_origin_pose (CameraPose, 0.0, 0.0, 0.001, CameraPose)
* Calibration 01: **********************************************************
* Calibration 01: Sample Task: Pose Estimation
* Calibration 01: **********************************************************
* Calibration 01: With known camera parameters, one image is enough to 
* Calibration 01: determine the new pose
* Calibration 01: **********************************************************
* Calibration 01: Sample Task: Image Rectification
* Calibration 01: **********************************************************
* Calibration 01: Choose the desired width of the visible area in world coordinates [mm]
TmpCtrl_RectificationWidth := 74
* Calibration 01: Convert to [m]
TmpCtrl_RectificationWidth := TmpCtrl_RectificationWidth / 1000.0
* Calibration 01: Adjust origin so the plate is roughly centered
set_origin_pose (CameraPose, -0.5*TmpCtrl_RectificationWidth, -0.4*TmpCtrl_RectificationWidth, 0, TmpCtrl_RectificationPose)
* Calibration 01: Generate the rectification map
gen_image_to_world_plane_map (TmpObj_RectificationMap, CameraParameters, TmpCtrl_RectificationPose, 640, 512, 640, 512, TmpCtrl_RectificationWidth / 640, 'bilinear')
* Calibration 01: Now, images can be rectified using the rectification map
map_image (Image, TmpObj_RectificationMap, TmpObj_RectifiedImage)
stop ()
  • 4
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值