*通过测量模型找直线:
•创建测量模型句柄:create_metrology_model ()
•设置测量对象参数:set_metrology_object_param()
•获取计量对象的测量点 / 卡尺轮廓:get_metrology_object_measures()
•获取计量对象的模型轮廓:get_metrology_object_model_contour()

*// 获取图像
read_image (Image, 'printer_chip/printer_chip_01')
*// 设置填充模式
dev_set_draw ('margin')
*// 颜色
dev_set_color ('red')
*// 设置线宽
dev_set_line_width (3)
*// 获取窗体句柄
dev_get_window (WindowHandle)
*// 获取图片大小
get_image_size (Image, Width, Height)
*// 1.手动绘制大致区域
gen_region_line (ROI_0, 37.4127, 749.969, 266.19, 751.27)
*// 2.创建测量模型句柄
create_metrology_model (MetrologyHandle)
*// 3.设置测量模型图像的大小 和图像的大小保持一致
set_metrology_model_image_size (MetrologyHandle, Width, Height)
*// 4.添加一个具体的测量形状/实例
*// 参数2 circle 圆形的测量形状;line 线的测量形状;rectangle2 仿射矩形形状
*// 参数3 不同形状的测量实例,参数3对应的值不一样
*// line: [r1,c1,r2,c2] 起始点的坐标和结束点坐标
*// circle: [r1,c1,r] 圆心坐标和半径
*// 参数4 20 测量区域的长度 相当于卡尺的长度 垂直与测量方向的长度
*// 参数5 5 相当于卡尺的宽度
*// 参数6 平滑程度
*// 参数7 30 对比度阈值
*// 参数8、9 [] [] 预留参数
*// 参数10 实例的索引 Index自动递增
add_metrology_object_generic (MetrologyHandle, 'line',[37.4127, 749.969, 266.19, 751.27], 20, 5, 1, 30, [], [], Index)
*// 5.设置测量的对象的一些参数
*// 设置卡尺的数量
set_metrology_object_param (MetrologyHandle, 'all', 'num_measures', 10)
*// 设置边缘极性'measure_transition' 设置为'all'不考虑边缘极性
set_metrology_object_param (MetrologyHandle, 'all', 'measure_transition', 'all')
*// 设置查找实例最大个数
set_metrology_object_param (MetrologyHandle, 'all', 'num_instances', 30)
*// 6.应用测量模型
apply_metrology_model (Image, MetrologyHandle)
*// 7.获取测量之后的各种轮廓和位置信息
*// 获取卡尺轮廓和卡尺位置信息
*// Contours 卡尺轮廓
*// 参数3 找所有的实例
get_metrology_object_measures (Contours, MetrologyHandle, 'all', 'all', Row, Column)
*// 绘制十字 在测量出来的实际的点绘制
gen_cross_contour_xld (Cross, Row, Column, 6, 0.785398)
dev_display (Image)
*// 获取结果轮廓 实际测量出来的线的轮廓 实际找出的边 重点
get_metrology_object_result_contour (Contour, MetrologyHandle, 'all', 'all', 1.5)
dev_set_color ('green')
*// 显示实际检测到的边缘轮廓
dev_display (Contour)
*// 获取手动绘制的检测区域的轮廓
get_metrology_object_model_contour (Contour1, MetrologyHandle, 0, 1.5)
dev_set_color ('blue')
*// 显示手动绘制的测量区域轮廓
dev_display (Contours)
*通过测量模型找圆:

*// 获取图像
read_image (Image, 'printer_chip/printer_chip_01')
*// 设置填充模式
dev_set_draw ('margin')
*// 设置颜色
dev_set_color ('green')
*// 设置线宽
dev_set_line_width (3)
*// 获取窗体句柄
dev_get_window (WindowHandle)
*// 获取图像大小
get_image_size (Image, Width, Height)
*// 1.手动绘制大致区域
gen_circle (ROI_01, 340.057, 1029.53, 18.807)
*// 2.创建测量模型句柄
create_metrology_model (MetrologyHandle1)
*// 3.设置测量模型图像的大小 和图像的大小保持一致
set_metrology_model_image_size (MetrologyHandle1, Width, Height)
*// 4.添加一个具体的测量实例
add_metrology_object_generic (MetrologyHandle1, 'circle', [340.057, 1029.53, 18.807], 15, 5, 1, 30, [], [], Index1)
*// 5.设置测量的对象的一些参数
*// 设置卡尺的数量
set_metrology_object_param (MetrologyHandle1, 'all', 'num_measures', 8)
*// 设置边缘极性'measure_transition' 设置为'all'不考虑边缘极性 positive从暗到亮找;negative从亮到暗找
set_metrology_object_param (MetrologyHandle1, 'all', 'measure_transition', 'positive')
*// 设置查找实例最大个数
set_metrology_object_param (MetrologyHandle1, 'all', 'num_instances', 30)
*// 6.应用测量模型
apply_metrology_model (Image, MetrologyHandle1)
*// 7.获取测量之后的各种轮廓和位置信息
*// 获取卡尺轮廓和卡尺位置信息
*// Contours 卡尺轮廓
*// 参数3 找所有的实例
get_metrology_object_measures (Contours1, MetrologyHandle1, 'all', 'all', Row1, Column1)
*// 绘制十字 在测量出来的实际的点绘制
gen_cross_contour_xld (Cross1, Row1, Column1, 6, 0.785398)
*// 获取结果轮廓 实际测量出来的线的轮廓 实际找出的边 重点
get_metrology_object_result_contour (Contour2, MetrologyHandle1, 'all', 'all', 1.5)
*// 获取手动绘制的检测区域的轮廓
get_metrology_object_model_contour (Contour3, MetrologyHandle1, 0, 1.5)
*// 清空窗体内容
dev_clear_window ()
*// 展示原图
dev_display(Image)
*// 展示卡尺
dev_display (Contours1)
*// 设置圆的颜色
dev_set_color ('yellow')
*// 展示圆
dev_display (Contour2)
*模板匹配 + 对齐测量模型 + 直线间距测量:
•绘制直线:draw_line()
•生成直线区域:gen_region_line()
•创建空对象:gen_empty_obj ()
•计算两个区域之间的最小距离:distance_rr_min ()
•设置文本显示位置:set_tposition ()
•输出的内容: write_string()

*// 获取图像
read_image (Image, 'dip_switch/dip_switch_model.png')
*// 获取图片的大小
get_image_size (Image, Width, Height)
*// 展示图像
dev_display (Image)
*// 设置填充模式
dev_set_draw ('margin')
*// 设置颜色
dev_set_color ('green')
*// 获取窗体句柄
dev_get_window (WindowHandle)
*// *******************绘制两条直线的ROI********************
*// 手动绘制左边一条线
draw_line (WindowHandle, RowLeft1, ColumnLeft1, RowLeft2, ColumnLeft2)
*// 生成直线
gen_region_line (RegionLines, RowLeft1, ColumnLeft1, RowLeft2, ColumnLeft2)
*// 展示
dev_display (RegionLines)
*// 手动绘制右边一条线
draw_line (WindowHandle, RowRight1, ColumnRight1, RowRight2, ColumnRight2)
*// 生成直线
gen_region_line (RegionLines1, RowRight1, ColumnRight1, RowRight2, ColumnRight2)
*// 展示
dev_display (RegionLines1)
*// 停止运行
stop ()
*// *******************绘制模板匹配的ROI********************
*// 绘制一个仿射矩形
draw_rectangle2 (WindowHandle, Row, Column, Phi, Length1, Length2)
*// 生成一个仿射矩形
gen_rectangle2 (Rectangle, Row, Column, Phi, Length1, Length2)
*// 裁剪抠图ROI区域
reduce_domain (Image, Rectangle, ImageReduced)
*// 创建基于形状的模板
create_shape_model (ImageReduced, 'auto', 0, rad(360), 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID)
*// 获取模板匹配的轮廓 默认位置在左上角
get_shape_model_contours (ModelContours, ModelID, 1)
*// 仿射变换进行移动和旋转
vector_angle_to_rigid (0, 0, 0, Row, Column, Phi, HomMat2D)
*// 应用仿射变换
affine_trans_contour_xld (ModelContours, ContoursAffineTrans, HomMat2D)
*// 查找匹配结果
find_shape_model (Image, ModelID, 0, rad(360), 0.5, 1, 0.5, 'least_squares', 2, 0.9, Row1, Column1, Angle, Score)
*// 停止运行
stop ()
*// *******************创建找线测量模型********************
*// 左边线的元组
lineLeft:=[RowLeft1, ColumnLeft1,RowLeft2, ColumnLeft2]
*// 右边线的元组
lineRight:=[RowRight1, ColumnRight1, RowRight2, ColumnRight2]
*// 创建一个测量对象
create_metrology_model (MetrologyHandle)
*// 设置测量模型图像大小
set_metrology_model_image_size (MetrologyHandle, Width, Height)
*// 添加一个测量形状
add_metrology_object_generic (MetrologyHandle, 'line', [lineLeft,lineRight], 20, 5, 1, 20, [], [], Index)
*// 设置卡尺数量
set_metrology_object_param (MetrologyHandle, 'all', 'num_measures', 6)
*// 设置边缘极性
set_metrology_object_param (MetrologyHandle, 'all', 'measure_transition', 'all')
*// 获取卡尺轮廓和卡尺的位置信息
get_metrology_object_measures (Contours, MetrologyHandle, 'all', 'all', Row2, Column2)
*// 找到点
gen_cross_contour_xld (Cross, Row2, Column2, 6, 0)
*// 获取结果轮廓 实际测量出来的线的轮廓 实际找出的边 重点
get_metrology_object_result_contour (Contour, MetrologyHandle, 'all', 'all', 1.5)
*// 设置模版的关联的坐标
set_metrology_model_param (MetrologyHandle, 'reference_system', [Row1, Column1, 0])
*// 应用测量模型
apply_metrology_model (Image, MetrologyHandle)
*// 设置原图
dev_display (Image)
*// 展示轮廓线
dev_display (Contour)
*// 展示卡尺轮廓
dev_display (Contours)
*// 停止运行
stop ()
*// *******************开始测试********************
*// 获取照片集合
list_files ('D:/ChuanDingZN/全部学习记录/第三阶段 Halcon/day06/新建文件夹', 'files', Files)
*// 遍历图片
for Index1 := 0 to |Files|-1 by 1
read_image (Image1,Files[Index1])
dev_display (Image1)
*// 查找匹配结果
find_shape_model (Image1, ModelID, 0, rad(360), 0.5, 1, 0.5,'least_squares', 2, 0.9, Row3, Column3, Angle3, Score3)
*// 展示查找的模板
dev_display_shape_matching_results (ModelID, 'red', Row3, Column3, Angle3, 1, 1, 0)
*// 对齐测量模型 相当于Visionpro命名空间作用
align_metrology_model (MetrologyHandle,Row3, Column3, Angle3)
*// 应用测量模型
apply_metrology_model (Image1, MetrologyHandle)
*// 获取测量的起始点行坐标
get_metrology_object_result (MetrologyHandle,'all', 'all', 'result_type', 'row_begin', rowBegin)
*// 获取测量的起始点列坐标
get_metrology_object_result (MetrologyHandle, 'all', 'all', 'result_type', 'column_begin', columnBegin)
*// 获取测量的结束点行坐标
get_metrology_object_result (MetrologyHandle, 'all', 'all', 'result_type', 'row_end', rowEnd)
*// 获取测量的结束点列坐标
get_metrology_object_result (MetrologyHandle,'all', 'all', 'result_type', 'column_end', columnEnd)
*// 获取卡尺轮廓和卡尺的位置信息
*// Row4, Column4 找到点的坐标
get_metrology_object_measures (ContoursNew, MetrologyHandle, 'all', 'all', Row4, Column4)
*// 绘制找到的点
gen_cross_contour_xld (Cross1, Row4, Column4, 6, 0)
*// 获取结果轮廓 实际测量出来的线的轮廓 实际找出的边 重点
get_metrology_object_result_contour (Contour1, MetrologyHandle, 'all', 'all', 1.5)
*// 设置结果轮廓线的颜色
dev_set_color ('yellow')
*// 展示结果轮廓线
dev_display (Contour1)
*// 停止运行
stop ()
*// *******************开始计算宽度********************
*// 创建一个空对象
gen_empty_obj (EmptyObject)
for Index2 := 0 to 1 by 1
*// 创建一条线
gen_region_line (RegionLines2,rowBegin[Index2], columnBegin[Index2], rowEnd[Index2], columnEnd[Index2])
*// 合并两个区域
concat_obj (EmptyObject, RegionLines2, EmptyObject)
endfor
*// 取出第一条线
select_obj (EmptyObject, First, 1)
*// 取出第二条线
select_obj (EmptyObject, Seconde, 2)
*// 获取两个区域之间的最小距离
distance_rr_min (First, Seconde, MinDistance, Row11, Column11, Row21, Column21)
*// 设置文本位置
set_tposition (WindowHandle,100, 100)
*// 写的内容
write_string (WindowHandle, MinDistance)
*// 停止运行
stop ()
endfor
希望对大家有所帮助, 感谢大家的关注和点赞。
1603

被折叠的 条评论
为什么被折叠?



