halcon第二十三讲:标定助手标定测量

1.生成标定板 文件ps格式,可通过ps软件打印出来, 以及标定板的描述文件descr格式

gen_caltab (7, 7, 0.0125, 0.5, 'caltab.descr', 'caltab.ps')

2.打开标定助手进行标定:输入相机像素尺寸,焦距参数,加载描述文件,移动标定板到整个视野的不同地方,旋转不同的角度进行采集,采集到十张左右就差不多了,然后选择其中一张为参考位姿,即图像坐标系,最后标定。标定完最好在结果栏中勾选原点在图像角上,则图像坐标系和像素坐标系就重合了,此时像素和实际距离只是比例关系了。             

3.生成代码并插入代码 

*标定得到的相机参数
CameraParameters := [0.189115,87.4045,2.21885e-006,2.2e-006,2700.85,-118.133,2592,1944]
*相机在世界坐标系中的位姿
CameraPose := [-0.344824,0.0149449,10.9193,0.721803,4.27061,0.733757,0]
stop ()

4.像素坐标系转换为世界坐标系

*像素坐标系到世界坐标系转换(通过比例换算可知道每个像素长度实际代表多少毫米)
*第一个参数为相机参数,第二个参数为相机位姿,第五个参数为计量单位,一般选mm,即100个像素尺寸实际长为X个mm
image_points_to_world_plane (CameraParameters, CameraPose, 100, 100, 'mm', X, Y)

5.测量

*打开相机对待侧物体进行测量
open_framegrabber ('DahengCAM', 1, 1, 0, 0, 0, 0, 'interlaced', 8, 'gray', -1, 'false', 'HV-xx51', '1', 1, -1, AcqHandle)
grab_image_start (AcqHandle, -1)
wait_seconds (1)
grab_image_async (Image, AcqHandle, -1)
dev_display (Image)

threshold (Image, Regions, 166, 255)
connection (Regions, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 55908.3, 130688)
fill_up (SelectedRegions, RegionFillUp)
gen_contour_region_xld (RegionFillUp, Contours1, 'border')
fit_circle_contour_xld (Contours1, 'algebraic', -1, 0, 0, 3, 2, Row2, Column2, Radius1, StartPhi1, EndPhi1, PointOrder1)

*显示信息
dev_display (Image)
dev_set_draw ('margin')
disp_circle (3600, Row2, Column2, Radius1)
RealDiameter:=Radius1*2/(100/X)
disp_message (3600, '实际直径:'+RealDiameter+'mm', 'image', Row2, Column2, 'black', 'true')
stop()

 

 实际测量了一下该圆齿轮的直径大概在52mm左右,通过标定助手测量得到的结果为53.4278mm,有点误差,因为标定时设置参考位姿是大致摆正标定板使得和像素坐标方向一致,实际上摆的不一定很正,所以会存在误差。实际应用过程中,要拍标定图像经过仿射变换到竖直方向,使得位姿参考即图像坐标系和像素坐标系在x和y方向上是相互平行的,保存后加载该图像进行标定并以它为位姿参考。或者用直尺拉一道竖直的线,将标定板靠着这条线放然后采集标定。

猜你喜欢

转载自blog.csdn.net/qq_24946843/article/details/84137686