HALCON高级篇:3d相机标定(二)标定和标定结果的保存

引言:

C#
勇哥注:所谓的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张标定图片如下:

image.png


TmpCtrl_ReferenceIndex 即是标定助手中的“设为参考位姿”,其意义请看勇哥的视频讲解。

image.png

StartParameters  是起始内参,是个预设值,在标定完成后会生成计算完成的实际内参

area_scan_division对应标定助手中的“面扫描(除法)”

image.png


find_calib_object  这个是全自动找标定板特征点并收集观察数据,并且对蜂窝标定板和阵列标定板都有效果。

find_caltab和find_marks_and_pose则需要设置复杂参数且只对阵列标定板有效果。

下面左图为“蜂窝标定板”,右图为“阵列标定板”

image.png


calibrate_cameras 的详细介绍见 http://www.skcircle.com/?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

版权声明:本文为博主原创文章,转载请附上博文链接!


本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年4月    »
1234567
891011121314
15161718192021
22232425262728
2930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864