引言:
勇哥注:所谓的3d相机标定并不是指的3d相机的标定,而是指的是3d空间做相机的标定,这个相机仍然是2D相机。
halcon的这套标定方法,同时可以应对测量、手眼标定。
并且由于是在3d空间做标定,因此你在做测量的时候相机和拍摄平面可以不是完全垂直,
或者物料可以任意方向倾斜(当然你的相机的景深要能做得到)。
如果你是做机器人手眼标定,这套标定方法无论是hand to eye,还是eye in hand,都可以搞定。
另外,你是四轴scara机器人还是串联的6轴机器人都可以的。
对于轴动的标定,也是没有问题的。
halcon的标定方法还可以实现相机标定和确定工作平面位姿进行分离。
这意味着你标定完相机后,你的测量平面可以随时改换。
halcon的这套3d相机标定方法不是一般的强,可以搞定现在工业机器视觉的绝大部分标定方面的应用。
至少勇哥还没发现有啥子应用它还做不到的。
3d标定的理论在上一篇已经讲得很清楚了。
这一篇勇哥来做一些实验。
由于这个话题通过图文不容易讲清楚,勇哥会录制一个系列视频做配合。
标定和标定结果的保存
测试代码如下:
*标定并保存结果
ImageFiles := []
ImageFiles[0] := 'D:/交流群的问题/tmp1/image_01.png'
ImageFiles[1] := 'D:/交流群的问题/tmp1/image_02.png'
ImageFiles[2] := 'D:/交流群的问题/tmp1/image_03.png'
ImageFiles[3] := 'D:/交流群的问题/tmp1/image_04.png'
ImageFiles[4] := 'D:/交流群的问题/tmp1/image_05.png'
ImageFiles[5] := 'D:/交流群的问题/tmp1/image_06.png'
ImageFiles[6] := 'D:/交流群的问题/tmp1/image_07.png'
ImageFiles[7] := 'D:/交流群的问题/tmp1/image_08.png'
ImageFiles[8] := 'D:/交流群的问题/tmp1/image_09.png'
ImageFiles[9] := 'D:/交流群的问题/tmp1/image_10.png'
ImageFiles[10] := 'D:/交流群的问题/tmp1/image_11.png'
TmpCtrl_ReferenceIndex := 10
TmpCtrl_PlateDescription := 'E:/Program Files/MVTec/HALCON-19.11-Progress/calib/calplateHG30.cpd'
StartParameters := ['area_scan_division',0.008,0,2.2e-06,2.2e-06,1296,972,2592,1944]
TmpCtrl_FindCalObjParNames := 'sigma'
TmpCtrl_FindCalObjParValues := 1
* Calibration 01: Create calibration model for managing calibration data
create_calib_data ('calibration_object', 1, 1, CalibHandle)
set_calib_data_cam_param (CalibHandle, 0, [], StartParameters)
set_calib_data_calib_object (CalibHandle, 0, TmpCtrl_PlateDescription)
* Calibration 01: Collect mark positions and estimated poses for all plates
for Index := 0 to |ImageFiles|-1 by 1
read_image (Image, ImageFiles[Index])
find_calib_object (Image, CalibHandle, 0, 0, Index, TmpCtrl_FindCalObjParNames, TmpCtrl_FindCalObjParValues)
endfor
calibrate_cameras (CalibHandle, TmpCtrl_Errors)
write_calib_data(CalibHandle, 'D:/交流群的问题/tmp2/calib.ccd')
get_calib_data(CalibHandle, 'camera', 0, 'params', DataValue)
write_cam_par(DataValue, 'D:/交流群的问题/tmp2/内参.cal')
get_calib_data(CalibHandle, 'calib_obj_pose', [0,TmpCtrl_ReferenceIndex], 'pose', DataValue1)
write_pose(DataValue1, 'D:/交流群的问题/tmp2/外参.dat')
11张标定图片如下:
TmpCtrl_ReferenceIndex 即是标定助手中的“设为参考位姿”,其意义请看勇哥的视频讲解。
StartParameters 是起始内参,是个预设值,在标定完成后会生成计算完成的实际内参
area_scan_division对应标定助手中的“面扫描(除法)”
find_calib_object 这个是全自动找标定板特征点并收集观察数据,并且对蜂窝标定板和阵列标定板都有效果。
find_caltab和find_marks_and_pose则需要设置复杂参数且只对阵列标定板有效果。
下面左图为“蜂窝标定板”,右图为“阵列标定板”
calibrate_cameras 的详细介绍见 http://47.98.154.65/?id=1589
write_calib_data 这个是把标定数据保存到磁盘上。对应的从磁盘读取是的算子是read_calib_data。
这样我们不用每次都读取十几张标定图片进行标定了。
读取标定数据后要重新calibrate_cameras,然后才可以get_calib_data获取标定的结果。
read_calib_data('D:/交流群的问题/tmp2/calib.ccd', CalibDataID)
calibrate_cameras(CalibDataID, Error)
get_calib_data (CalibHandle, 'camera', 0, 'params', CameraParameters)
get_calib_data (CalibHandle, 'calib_obj_pose', [0, 10], 'pose', CameraPose)
标定助手标定完成后,有三个东西可以保存到磁盘: 相机内参,设定的位姿,标定数据。
其中标定数据要自己写代码来保存。
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!

