else '恢复
ZV_REUNION(modRe, tmp_re, modRe) '计算modRe和tmp_re的并集并存放到modRe中
endif
ZV_IMGCOPY(subImg, copy_subImg) '复制模板子图像到copy_subImg图像变量中
ZV_REGION(copy_subImg, modRe, 1, 0) '在模板图像上绘制modRe图像的非有效区域,绘制颜色为黑色,用于掩模
ZV_LATCH(copy_subImg, 1) '显示复制的模板图
end sub
'更新绘制橡皮擦区域
GLOBAL SUB draw_eraser()
if d_edit_m = 0 then '如果编辑模板标志
return '返回子函数,不继续往下执行
endif
DRAWRECT(c_rect(0), c_rect(1), c_rect(2), c_rect(3))'绘制橡皮擦区域
END SUB
15
在main.bas文件中添加编辑模板界面【创建模板】按钮响应的函数并关联动作函数。
↓
'编辑模板界面按下创建模板按钮时响应的函数
GLOBAL SUB btn_loc_creModel()
d_is_creModel = 1
ZV_SHAPECREATERE(subImg, modRe,s_mod, d_mod_param(0), d_mod_param(1), d_mod_param(2), d_mod_param(3), d_mod_param(4), d_mod_param(5), d_mod_param(6), d_mod_param(7), d_mod_param(8))
'创建模板
ZV_SHAPECONTOURS(s_mod, contlist1, 0) '获取第0层金字塔上的模板轮廓
ZV_GRAYTORGB(subImg, colorSubImg) '灰度图转换成RGB图
ZV_IMGINFO(colorSubImg, 0) '获取colorSubImg图像信息,并存放到table0中
ZV_GETRIGIDVECTOR(mat_rigid1, 0, 0, 0, TABLE(0)/2, TABLE(1)/2, 0)'计算刚性变换矩阵
ZV_CONTAFFINE(contlist1, mat_rigid1, tsContlist1)'对轮廓或轮廓序列进行仿射变换
ZV_CONTLIST(colorSubImg, tsContlist1, ZV_COLOR(0, 255, 0), 0)'在colorSubImg图像上绘制绿色的轮廓序列
ZV_LATCHCLEAR(2)
ZV_LATCH(colorSubImg, 2)
end sub
↓
16
在draw.bas文件中添加编辑模板界面【确定】按钮响应的函数并关联动作函数。
↓
'编辑模板界面按下确定按钮时执行的函数
GLOBAL SUB btn_erase_cfm()
ZV_LATCHCLEAR(0)
ZV_LATCH(grabImg, 0) '显示图像在锁存上
HMI_CLOSEWINDOW(12) '关闭编辑模板窗口
END SUB
↓
17
在main.bas文件中添加创建模板界面【测试】按钮响应的函数并关联动作函数。
↓
'创建模板界面按下测试按钮时响应的函数
GLOBAL SUB btn_loc_test()
if (d_is_creModel = 0) then
?'未创建模板!'
return
endif
'开始匹配
TICKS = 0
ZVOBJECT match_rst, sImg, colorImg
ZV_GAUSSBLUR(grabImg, sImg, 3)
ZV_SHAPEFIND(s_mod, sImg, match_rst, d_match_param(0), d_match_param(1), d_match_param(2), d_match_param(3), d_match_param(4), d_match_param(5), d_match_param(6))
ZV_MATINFO(match_rst, 0)
ZV_GRAYTORGB(sImg, colorImg)
if TABLE(0) > 0 then
local rowr
for rowr = 0 to TABLE(0)-1
ZV_MATGETROW(match_rst, rowr, 5, 3) '获取match_rst矩阵中第rowr行的数据到table中,table最大长度5
if(rowr = 0) then
d_match_rst(0) = TABLE(3)
d_match_rst(1) = TABLE(4)
d_match_rst(2) = TABLE(5)
d_match_rst(3) = TABLE(6)
d_match_rst(4) = TABLE(7)
ZV_GETRIGIDVECTOR(mat_rigid1, 0, 0, 0, TABLE(4), TABLE(5), TABLE(6))'计算刚性变换矩阵
ZV_CONTAFFINE(contlist1, mat_rigid1, tsContlist1)'对轮廓或轮廓序列进行仿射变换
ZV_CONTLIST(colorImg, tsContlist1, ZV_COLOR(0, 255, 0), 0)'在colorSubImg图像上绘制绿色的轮廓序列
endif
next
else
d_match_rst(0) = -1
d_match_rst(1) = -1
d_match_rst(2) = -1
d_match_rst(3) = -1
d_match_rst(4) = -1
endif
d_match_time = abs(TICKS) '匹配时间
ZV_LATCH(colorImg, 0)
end sub
↓
18
在draw.bas文件中添加创建模板界面【确定】按钮响应的函数并关联动作函数。
↓
'创建模板界面按下确定按钮时响应的函数
GLOBAL SUB btn_loc_cfm()
grab_switch = 0 '关闭补正源的连续采集
d_is_rtn_loc = 1
ZV_LATCHCLEAR(0)
ZV_LATCH(grabImg, 0) '显示图像在锁存上
ZV_LATCH(grabImg, 1) '显示图像在锁存上
HMI_CLOSEWINDOW(11)
END SUB
↓
19
在main.bas文件中添加主界面【单次执行】按钮响应的函数并关联动作函数。
↓
'主界面按下单次执行按钮时响应的函数
GLOBAL SUB btn_test()
btn_grab()'单次采集图像
btn_loc_test() '匹配测试函数
END SUB
↓
20
在main.bas文件中添加主界面【连续运行】按钮响应的函数并关联动作函数。
↓
'主界面点击连续运行按钮时响应的函数
GLOBAL SUB btn_run()
if(run_switch = 1) then
?'已开启连续运行,请勿重复操作!'
return
endif
run_switch = 1
if (1 = run_switch) then
if (0 = PROC_STATUS(main_task_id)) then
RUNTASK main_task_id, main_task
endif
endif
END SUB
'连续运行主任务内容
main_task:
while(1)
if (0 = run_switch) then
exit while
endif
'以下执行相关定位操作
btn_grab()
btn_loc_test()
wend
END
↓
21
在main.bas文件中添加主界面【停止运行】按钮响应的函数并关联动作函数。
↓
'主界面点击停止执行按钮时响应的函数
GLOBAL SUB btn_stop()
if(run_switch = 0) then
?'未开启连续运行!'
return
endif
run_switch = 0
END SUB
↓
仿真演示效果
本次,VPLC系列机器视觉运动控制一体机快速入门(三)——基于形状匹配的视觉定位就分享到这里
上一篇:力矩电机控制器输出电压是多少
下一篇:ZMC运动控制器SCARA机械手应用快速入门
推荐阅读最新更新时间:2024-11-08 09:36
- ADTJA1101-RMII: 面向S32K148EVB和i.MX8的TJA1101汽车以太网适配器
- KAZZO FC红白机游戏卡dump烧录器
- LT5575 的典型应用 - 800MHz 至 2.7GHz 高线性度直接转换正交解调器
- 具有 I2C 兼容监控功能的 LTC4222 双路热插拔控制器的典型应用
- LTC3400ES6-1 单节 AA 电池至 2.5V 同步升压转换器的典型应用电路
- NVC-MDCS71、ABBTM-NVC-MDCS71 低功耗蓝牙模块参考设计
- 51最小系统
- OP413FSZ 5V Only 18 位立体声运算放大器 DAC 的典型应用
- 使用 Aimtec 的 AM3G-2412SH30Z 的参考设计
- BD49xxx系列BD49K41电压检测IC的典型应用