求助问题
1.Halcon在完成标定后,如何测量环形零件(轴承密封圈)的外直径和内直径?测量圆的卡尺命令在这里可以用吗?有没有类似的链接
我的步骤是:
用亚像素算子得到圆形图像的边缘;
Edges边缘转换为xld;xld转换成点的坐标;
用【image_points_to_world_plane】把最上、最下、最左、最右的点转换到世界坐标系下的(x,y)坐标,利用两点间的距离公式求出最上点到最下点的距离D1、最左点到最右点的距离D2,D1和D2可以作为想要测量的直径,但这种方法实在是有点“笨”。
2.硬件:迈德威视黑白相机,分辨率为630万(3088×2064)
目标精度:0.01mm
具体测量内容:利用亚像素方法测量轴承密封圈内直径和外直径的平均值、最大值、最小值。
之前咨询过一位蔡司三坐标测量仪的测量员,圆形零件的尺寸测量一般是基于点的拟合,利用亚像素方法得到圆形零件边缘的轮廓点,比如可以得到500个点,对这些点进行最小二乘拟合,得到的就是平均直径;对这些点进行最小外接拟合,得到的就是“最大直径”;对这些点进行最大外切拟合,得到的就是“最小直径”。
3.我希望在亚像素测量方法上有所创新(在已有的方法上进行一点点改进也算是创新),现在的亚像素方法主要有三种:插值法(多项式插值、三次样条插值、最邻近插值);拟合法(最小二乘拟合等);矩方法(灰度矩方法、Zernike矩方法、灰度矩方法)。
4.能够基于C++或C#开发出一款简易的测量软件,仅仅用于测量密封圈(密封圈的型号有很多)。这款软件可以安装在别的计算机上,连接工业相机,标定之后就可以测量。
- *标定之后获得的相机的内外参数
- CameraParameters := ['area_scan_division',0.0168107,-1.898,2.39981e-006,2.4e-006,1515.93,1018.5,3088,2064]
- CameraPose := [-0.00419203,0.00225051,0.31692,359.248,359.479,88.9519,0]
- edges_sub_pix (Image, Edges, 'canny', 1, 60, 100)
- *选取两条最长的轮廓,目的是删除可能带来干扰的轮廓
- select_contours_xld (Edges, SelectedContours1, 'contour_length', 800, 9000,800,12000)
- count_obj (SelectedContours1, Number)
- *找到外圆(内圆)的亚像素轮廓
- select_obj (SelectedContours1, ObjectSelected1, 1)
- dev_display (ObjectSelected1)
- *内(外)轮廓转换成点,得到点的坐标
- get_contour_xld (ObjectSelected1, Row1, Col1)
- tuple_max (Row1, Upper1)
- tuple_min (Row1, Lower1)
- tuple_max (Col1, Right)
- tuple_min (Col1, Left)
- *最高点世界坐标
- image_points_to_world_plane (CameraParameters, CameraPose, (Upper1+Lower1)/2, Left, 'mm', X1, Y1)
- *最低点世界坐标
- image_points_to_world_plane (CameraParameters, CameraPose, (Upper1+Lower1)/2, Right, 'mm', X2, Y2)
- *竖向直径=最高点和最低点的欧氏距离
- Diameter1 := sqrt((X2-X1)*(X2-X1)+(Y2-Y1)*(Y2-Y1))
- *最左点世界坐标
- image_points_to_world_plane (CameraParameters, CameraPose, Upper1, (Right+Left)/2, 'mm', X3, Y3)
- *最右点世界坐标
- image_points_to_world_plane (CameraParameters, CameraPose, Lower1, (Right+Left)/2, 'mm', X4, Y4)
- *横向直径=最左点和最右点的欧氏距离
- Diameter2 := sqrt((X4-X3)*(X4-X3)+(Y4-Y3)*(Y4-Y3))
复制代码
待测零件图像
|