一,金字塔
1,金字塔工作原理
图像金字塔是通过连续下采样原始图像创建的多个分辨率版本 匹配过程从最粗糙的金字塔层(最小图像)开始,快速定位大致位置 然后在更精细的层上逐步细化位置和旋转角度
2,根据图像采集助手 显示一张图片
open_framegrabber ('File', 1, 1, 0, 0, 0, 0, 'default', -1, 'default', -1, 'false', 'D:/Halcon/HALCON-25.11-Progress/examples/images/rings/rings.seq', 'default', 1, -1, AcqHandle)
grab_image (Image, AcqHandle) // 显示一张图片dev_set_draw ('margin')
dev_set_line_width (3)
3,制作模版 绘制模版区域
gen_circle (ROI_0, 247.225, 199.037, 103.427)
reduce_domain (Image, ROI_0, ImageReduced)
4,检测区域模版 获取不同分辨率下的图片
参数:
ImageReduced:用哪块图做模板
ModelImages:输出多层模糊图
ModelRegions:输出真正的模板轮廓(最重要)
NumLevels:金字塔层数(控制速度)
Contrast:对比度阈值(控制边缘干净度)
inspect_shape_model (ImageReduced, ModelImages, ModelRegions,6, 30)
dev_display (ModelImages)
5,创建模板
create_shape_model (ImageReduced, 'auto', rad(0), rad(360), 'auto', 'auto', 'use_polarity','auto', 'auto', ModelID)
get_shape_model_contours (ModelContours, ModelID,5)
二,测量边缘对
1,根据ROI创建找边区域 并导入代码如下
gen_rectangle2 (ROI_0, 57.3401, 474.14, 0, 414.788, 8.73625)
2,创建一个仿射矩形的测量模型
前五个参数要和绘制矩形的区域保持一致
Width, Height 设置图像的宽度和高度
nearest_neighbor 找边的一个算法
MeasureHandle 测量对象的句柄
gen_measure_rectangle2 (57.3401, 474.14, 0, 414.788, 8.73625, Width, Height, 'nearest_neighbor', MeasureHandle)
3,测量边缘对的算子
1 输入图片
2 测量对象
3 平滑程度 值越大越模糊
4 30 阈值范围
5 Transition:过渡, all 忽略极性, positive:由暗到亮, negative: 由亮到暗
6 select 找到第几个边, all 找到所有的边, first 找第一个边, last找到最后一个边
7/8/9 第一条边的坐标和边缘幅度
1011/12 第二条边的坐标和边缘幅度
13 IntraDistance, 俩个边之间的距离 相当于引脚的宽度
14 InterDistance 边缘对之间距离
measure_pairs (Image, MeasureHandle, 1, 30, 'all', 'all', RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, IntraDistance, InterDistance)
4,绘制线的方法
disp_line (WindowHandle, RowEdgeFirst, ColumnEdgeFirst, RowEdgeSecond, ColumnEdgeSecond)
dev_disp_text ('引脚的个数:'+|RowEdgeFirst|, 'image', 100, 100, 'black', [], [])
dev_set_color ('yellow')
tuple_remove (RowEdgeFirst, 0, Reduced1) // 移除RowEdgeFirst 第一个边行坐标
tuple_remove (ColumnEdgeFirst, 0, Reduced2)//移除ColumnEdgeFirst 第一个边列坐标tuple_remove (RowEdgeSecond, |RowEdgeSecond|-1, Reduced3) //移除RowEdgeSecond 第后一个边
tuple_remove (ColumnEdgeSecond, |ColumnEdgeSecond|-1, Reduced4) //移除ColumnEdgeSecond 第后一个边*disp_line (WindowHandle, Reduced1, Reduced2, Reduced3, Reduced4)
gen_region_line (Image, Reduced1, Reduced2, Reduced3, Reduced4)sum1:= sum(IntraDistance) // 求所有引脚宽度和
count:= |RowEdgeFirst|
avg:= (sum1 /count)$'.2f'dev_disp_text ('引脚的平均宽度:'+avg, 'image', 200, 200, 'black', [], [])
三, 测量边缘
1,代码拆析
【1】,创建测量模型
'nearest_neighbor 最近邻插值 不计算、不平均直接找离目标位置最近的那个像素直接用它的灰度值
gen_measure_rectangle2 (506.046, 401.258, rad(-90), 479.792, 55.9476, Width, Height, 'nearest_neighbor', MeasureHandle)
【2】,测量边
输出参数
RowEdge, 边行坐标
ColumnEdge, 列的坐标
Amplitude, 边缘幅度
Distance 距离
measure_pos (Image, MeasureHandle, 1, 30, 'all', 'all', RowEdge, ColumnEdge, Amplitude, Distance)
gen_cross_contour_xld (Cross, RowEdge, ColumnEdge, 10, 0) //绘制十字形
【3】,画线
gen_region_line (RegionLines, RowEdge[0], ColumnEdge[0], RowEdge[1], ColumnEdge[1])
2,完整代码
read_image (Image, 'ic_pin')
dev_set_draw ('margin')
get_image_size (Image, Width, Height)
gen_rectangle2 (ROI_0, 506.046, 401.258, rad(-90), 479.792, 55.9476)*创建测量模型
gen_measure_rectangle2 (506.046, 401.258, rad(-90), 479.792, 55.9476, Width, Height, 'nearest_neighbor', MeasureHandle)*测量边的
*输出参数
*RowEdge, 边行坐标
*ColumnEdge, 列的坐标
*Amplitude, 边缘幅度
*Distance 距离
measure_pos (Image, MeasureHandle, 1, 30, 'all', 'all', RowEdge, ColumnEdge, Amplitude, Distance)
gen_cross_contour_xld (Cross, RowEdge, ColumnEdge, 10, 0)dev_disp_text ('上高度:'+ Distance[0], 'image', 100, 100, 'black', [], [])
dev_disp_text ('中间高度:'+ Distance[1], 'image', 100, 500, 'black', [], [])
dev_disp_text ('下高度:'+ Distance[2], 'image', 100, 900, 'black', [], [])
gen_region_line (RegionLines, RowEdge[0], ColumnEdge[0], RowEdge[1], ColumnEdge[1])
输出结果:
