引言:
勇哥注:所谓的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
版权声明:本文为博主原创文章,转载请附上博文链接!

