当前位置:
首页 >
Halcon例程(基于多个标定图的单目相机标定)详解—— Camera_calibration_multi_image.hdev
发布时间:2023/12/10
89
豆豆
生活随笔
收集整理的这篇文章主要介绍了
Halcon例程(基于多个标定图的单目相机标定)详解—— Camera_calibration_multi_image.hdev
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
一、前言
在我的工业相机专栏里已经将相机标定涉及到的理论部分讲解完毕,为什么要标定以及标定要求出什么参数呢,用一个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') * * 相机标定过程 * * 生成面阵相机初始参数,参数均为相机已知参数 * (: : 焦距, 畸变因子, Sx, Sy, Cx, Cy, 图像宽度, 图像高度 : CameraParam存储元组) * (Sx, Sy为传感器芯片上两个相邻单元之间的水平竖直距离,也就是像素的大小,单位为m/像素;Cx, Cy为图像原点的行列坐标,单位为像素;) gen_cam_par_area_scan_division (0.012, 0, 0.00000375, 0.00000375, 640, 480, 1280, 960, StartCamPar) *创建Halcon标定数据模型(标定类型,相机数量,标定物数量,模型句柄) *其作用在于指定相机标定类型,设置标定过程,存储标定数据和结果。 create_calib_data ('calibration_object', 1, 1, CalibDataID) *设定相机初始参数(句柄,相机参数索引,相机类型,起始相机参数) *此段程序跑完的句柄见下图。 set_calib_data_cam_param (CalibDataID, 0, [], StartCamPar) *设定标定板初始参数(句柄,标定板数量索引,标定板描述(文件名或者标定板所有点的三维坐标))此例生成三维坐标系坐标值(x,y,z),其中z为0;坐标原点在finder模式的中心Mark点中心,坐标系的z轴指向标定板,x轴指向右侧,y轴指向下方,视角沿z轴。 set_calib_data_calib_object (CalibDataID, 0, 'calplate_80mm.cpd')//此文件可用记事本打开,里面记录了标定板五个mark模式的点坐标和半径。 calibration marks at y = -0.0290538 m -0.0374193548387097 -0.0290537554818005 0.000645161290322581 *读图,并生成落轮廓和点的特征参数值 NumImages := 7 for I := 1 to NumImages by 1 *读图,路径在C盘用户公共文档里,% 2d是将数字按宽度为2,采用右对齐方式输出,若数据位数不到2位,则左边补空格,所以文件名为calib_0X。read_image (Image, ImgPath + 'calib_image_' + I$'02d')dev_display (Image)*寻找标定板并在模型中设定提取的点和轮廓信息*(图像变量,句柄,相机的索引,标定板的索引,计数变量,参数名(使用六边形标定板,设置额外的参数值,可以使图像平滑等),参数值)*该算子将标定板每个点的轮廓和点坐标,索引和此图像标定板相对于相机坐标系的位姿提取出来,保存在句柄中。*find_caltab在图像中寻找标定板是基于标定板的特征——在一个亮的区域中存在黑色Mark点*算子对图像高斯滤波(核大小为SizeGauss),接着阈值分割(与之大小为MarkThresh)将标定板的区域找出来.find_calib_object (Image, CalibDataID, 0, 0, I, [], [])*从标定数据模型中获取基于轮廓的观测数据*(轮廓变量,句柄,返回标定板查找模式的轮廓内含三个参数(marks(返回每一个轮廓,calib(返回查找模式的轮廓),last_caltab(会返回上次成功的查找结果,但会忽略索引信息)),相机索引,标定板索引,变量)* 标定板查找器:有两种模式,一种是特殊标记六边形(即一个标记及其六个相邻标记),其中四个或六个标记包含一个孔;另外是带有矩形排列标记的校准板:校准板的边缘在一角有一个三角形。这里是第一种,结果如下图所示。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')*画出坐标的轮廓,轮廓以中心点的方式显示(窗口句柄,中心点行坐标,列坐标,半径)tuple_gen_const(: : Length, Const : Newtuple)(元组长度,常量初始值)disp_circle (WindowHandle, Row, Column, gen_tuple_const(|Row|,1.5)) endfor
关于find_calib的更多细节见链接:
Halcon相机标定
三、总结
Halcon 的标定步骤总结如下:
综合下来,感觉HALCON标定的过程还是比较清晰的,关键算子里面的程序还是需要理解一下。
总结
以上是生活随笔为你收集整理的Halcon例程(基于多个标定图的单目相机标定)详解—— Camera_calibration_multi_image.hdev的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: csharp:Nhibernate
- 下一篇: Halcon例程详解 (深度图转换为3D