《【正运动】机器视觉运动控制一体机应用例程〔九〕线束颜色排序识别.docx》由会员分享,可在线阅读,更多相关《【正运动】机器视觉运动控制一体机应用例程〔九〕线束颜色排序识别.docx(49页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、【正运动】机器视觉运动控制一体机应用例程九线束颜色排序识别【正运动】机器视觉运动控制一体机应用例程九线束颜色排序识别导语:线材在消费制造经过中需要按标准的颜色来进展排序,以往用传统人工去检测易出现漏检、错检的情况,通过正运动技术机器视觉运动控制一体机线束颜色排序识别系统,可自动识别线束颜色及排列顺序是否有误或者插错空位等情况。线材在消费制造经过中需要按标准的颜色来进展排序,以往用传统人工去检测易出现漏检、错检的情况,通过正运动技术机器视觉运动控制一体机线束颜色排序识别系统,可自动识别线束颜色及排列顺序是否有误或者插错空位等情况。它可以24小时不停顿运行,工作效率高,进步产能。以及它的检测结果和
2、人工检测相比一致性较高、可靠性强。上期课程,我们讲述了机器视觉方案中零件分拣的应用例程,本期课程我们将和大家一起共享怎样实现线束颜色排序识别的功能。教学视频一检测原理梯形图介绍(一)检测需求识别出线束的线材颜色排序是否标准,并显示当前的线材识别的颜色和检测结果。 (二)软件算法先用彩色相机拍摄图片后依次截取线束上不同颜色区域进展颜色样本学习,将颜色样本结果存放到列表中。其次将RGB图像转为灰度图后用外形匹配工具学习模板,将模板位置结果作为基准位置。当前匹配到的目的结果和基准位置结果进展计算输出位置变换矩阵,3个颜色识别的ROI区域和创立模板时设置的ROI区域位置使用同一个变换矩阵进展仿射变换,
3、即使用外形匹配作为识别颜色区域的补正源。最后将识别的线束颜色的颜色排序为“red“black“yellow才会输出“OK的状态结果,否那么输出“NG的状态结果。二软件实现梯形图介绍(一)软件实现1.翻开ZDevelop软件:新建工程新建“HMI文件新建“main.bas文件,用于编写界面响应函数新建“global_variable.bas文件用于存放全局变量并开启HMI自动运行任务新建“InitLocator.bas文件用于初始化测量参数新建“camera.bas文件用于实现相机收集功能新建draw.bas文件用于更新绘制图形刷新界面文件添加到工程。2.设计HMI界面。3.在“global_v
4、ariable.bas文件中定义全局变量,定义完成后运行“Hmi.hmi文件。全局变量大局部使用数组构造注:basic编程中很多函数会以TABLE(系统的数据构造)做为参数table讲明table讲明01获取到的图像宽高1518定位器roi图像坐标数据01匹配结果矩阵的行列数2528定位器roi控件和图像数据37匹配结果3031橡皮擦roi坐标1112鼠标操纵时获取的坐标5081线1识别颜色结果82113线2识别颜色结果114145线3识别颜色结果160识别分数150线1识别ID151线2识别ID152线3识别ID170172线1ROI区域数据173175线2ROI区域数据176178线3RO
5、I区域数据225228训练样本ROI控件坐标数据231235线1ROI控件坐标数据331335线2ROI控件坐标数据431435线3ROI控件坐标数据VR(0)模板保存标志,1-已保存VR(1)参数保存标志,1-已保存VR(10)(18)模板参数断电保存地址VR(20)(26)匹配参数断电保存地址VR(30)(34)线1ROI坐标数据VR(40)(44)线2ROI坐标数据VR(50)(54)线3ROI坐标数据VR(60)(63)训练学习ROI坐标数据VR(70)(74)匹配基准数据VR(76)识别分数*定义程序任务相关变量*主任务状态0-未初始化1-停顿2-运行中3-正在停顿GLOBALDIM
6、main_task_statemain_task_state=1运行任务开关GLOBALDIMrun_switchrun_switch=0收集任务开关0-停顿收集1-恳求收集GLOBALDIMgrab_switchgrab_switch=0定位检测主任务id-10GLOBALDIMmain_task_idmain_task_id=10相机连续收集线程id-7GLOBALDIMgrab_task_idgrab_task_id=7*完毕定义程序任务相关变量*定义相机收集相关变量*相机种类,此处使用海康相机-mvisionGLOBALDIMCAMERA_TYPE(100)CAMERA_TYPE=mi
7、ndvision;basler;mvision;huaray;zmotionCAMERA_TYPE=mvision相机个数GLOBALcam_numcam_num=0相机形式,-1连续收集,0-软件触发收集GLOBALcam_modecam_mode=0*完毕定义相机收集相关变量*定义返回主界面标志,1-已返回,0-未返回GLOBALDIMd_is_rtn_locd_is_rtn_loc=1*定义模板相关变量*定义鼠标按下标志位,1-已按下,0-未按下GLOBALDIMis_set_roi_m_downis_set_roi_m_down=0定义创立模板标志位,1-已创立模板,0-未创立模板GL
8、OBALDIMd_is_creModeld_is_creModel=0学习模板参数,starAngle、endAngle、minScale、maxScale、thresh、numlevel、reduce、angleStep、scaleStepGLOBALDIMd_mod_param(9)*完毕定义模板相关变量*定义编辑模板相关变量*定义编辑模板标志,0-表示不编辑模板,1-表示编辑模板GLOBALDIMd_edit_md_edit_m=0定义使用橡皮擦功能标志,0-表示恢复擦除的区域,1-表示擦除区域GLOBALDIMd_isMask_md_isMask_m=1定义橡皮擦的roi参数,依次是矩
9、形左上角和右下角图像坐标x、y、x、yGLOBALDIMd_locator_roi(4),d_eraser_roi(4)定义正方形橡皮擦尺寸宽度GLOBALDIMd_eraser_sized_eraser_size=5定义界面控件上橡皮擦的矩形区域GLOBALDIMc_rect(4)定义鼠标状态标志,0-表示鼠标处于松开状态,1-表示鼠标处于按下状态GLOBALDIMd_mouse_sd_mouse_s=0*完毕定义编辑模板相关变量*定义匹配检测相关变量*匹配检测参数,minScore、matchNum、minDist、thresh、accuracy、speed、polorGLOBALDIMd
10、_match_param(7)定义学习模板的roi参数和橡皮擦的roi参数,依次是矩形左上角和右下角图像坐标x、y、x、yGLOBALDIMd_locator_roi(4),d_eraser_roi(4)匹配结果,score、x、y、angle、scale,目前对于多目的匹配也只存第一个目的GLOBALDIMd_match_rst(5)GLOBALDIMd_match_time定义匹配定位消耗的时间变量d_match_time=0*完毕定义匹配检测相关变量*定义程序执行经过中缓存中间图片和结果图片的变量GLOBALZVOBJECTgrabImg,colorImgGLOBALZVOBJECTsu
11、bImg,copy_subImg,colorSubImg,s_modGLOBALZVOBJECTmodRe定义程序执行经过中颜色样本模板变量和颜色模板列表变量GLOBALZVOBJECTgrabImg,ColorMod,Clrmod_list设置创立模板的基准坐标GLOBALDIMd_match_base_rst(5)定义检测识别颜色的ROI区域GLOBALDIMd_reg_roi1(5),d_reg_roi2(5),d_reg_roi3(5)定义训练学习颜色样本的ROI区域GLOBALDIMd_learn_roi(4)定义选择颜色识别ROI的类型GLOBALDIMd_select_regRO
12、Id_select_regROI=0定义排线颜色顺序检测结果状态GLOBALDIMd_rst_statusd_rst_status=0常用颜色变量GLOBALC_RED,C_GREEN,C_BLUE,C_YELLOW,C_WHITEC_RED=RGB(255,0,0)C_GREEN=RGB(0,255,0)C_BLUE=RGB(0,0,255)C_YELLOW=RGB(255,255,0)C_WHITE=RGB(255,255,255)定义输入需要进展学习的颜色样本名称GLOBALDIMd_sample_name(128)d_sample_name=定义检测到的颜色结果GLOBALDIMd_c
13、olor_rst1(32),d_color_rst2(32),d_color_rst3(32)GLOBALDIMd_detect_time定义消耗的时间变量d_detect_time=0*定义读取本地文件功能相关变量*留意,该功能只在使用仿真器时有效定义是否使用本地图片标志GLOBALDIMd_use_imgfile定义本地图片索引GLOBALDIMd_index定义读取图片的途径GLOBALDIMFile_Name(100)*完毕定义读取本地文件功能相关变量*初始化全局变量完成后开启HMI文件RUNHmi1.hmi,14.在“InitLocator.bas文件中初始化测量参数。endGLOB
14、ALSUBinit_meas_param()初始化测量参数初始化定位器roi参数d_locator_roi(0)=240左上角xd_locator_roi(1)=180左上角yd_locator_roi(2)=400右下角xd_locator_roi(3)=300右下角y初始化模板参数d_mod_param(0)=-180起始角度d_mod_param(1)=180终止角度d_mod_param(2)=1最小缩放d_mod_param(3)=1最大缩放d_mod_param(4)=80阈值d_mod_param(5)=0默认金字塔层数d_mod_param(6)=0默认约简特征点d_mod_p
15、aram(7)=0默认角度步长d_mod_param(8)=0默认缩放步长初始化匹配测量参数d_match_param(0)=50最小分数d_match_param(1)=1匹配个数d_match_param(2)=10默认最小间距d_match_param(3)=40最小阈值d_match_param(4)=0精度d_match_param(5)=9速度d_match_param(6)=0极性初始化匹配定位结果d_match_rst(0)=0分数d_match_rst(1)=0位置Xd_match_rst(2)=0位置Yd_match_rst(3)=0角度d_match_rst(4)=0比例
16、d_reg_roi1(0)=160识别颜色ROI1d_reg_roi1(1)=110d_reg_roi1(2)=40d_reg_roi1(3)=40d_reg_roi1(4)=0d_reg_roi2(0)=260识别颜色ROI1d_reg_roi2(1)=110d_reg_roi2(2)=40d_reg_roi2(3)=40d_reg_roi2(4)=0d_reg_roi3(0)=360识别颜色ROI1d_reg_roi3(1)=110d_reg_roi3(2)=40d_reg_roi3(3)=40d_reg_roi3(4)=0d_learn_roi(0)=360d_learn_roi(1)=
17、190d_learn_roi(2)=400d_learn_roi(3)=230TABLE(160)=60初始化匹配定位消耗时间d_match_time=0d_use_imgfile=1默认使用本地图片d_index=0ENDSUB5.关联HMI界面控件变量。6.在“main.bas文件中添加HMI界面初始化函数并在Hmi系统设置中关联初始化函数。endHMI界面初始化函数,上电执行一次GLOBALSUBhmi_init()ZV_ENVINIT()DMSETtable(50,96,0)ZV_SETSYSSTR(DataDir,)设置默认数据目录ZV_SETSYSINT(LineWidth,6)设
18、置线宽为10ZV_RESETCLIPSIZE(1280,1024)根据图像分辨率设置图像区域的裁剪尺寸,此处图像分辨率为1280x1024ZV_LATCHSETSIZE(0,HMI_CONTROLSIZEX(10,2),HMI_CONTROLSIZEY(10,2)设置锁存的大小init_meas_param()初始化测量参数ZV_IMGGENCONST(subImg,40,30,1,0,0)初始化模板子图像初始化匹配使用到的中间变量ZVOBJECTcontlist1,tsContlist1,mat_rigid1ZVOBJECTcontlist2,tsContlist2,mat_rigid2ZV
19、_IMGREAD(colorImg,颜色排序/0.bmp,0)ZV_LATCH(colorImg,0)ifVR(0)=1then假如已经保存过模板ZV_READSHAPEMOD(s_mod,颜色排序/shape.zvb)读取当前途径下的外形模板?读取模板成功!d_is_creModel=1ZV_READIMAGE(subImg,颜色排序/subimg.bmp,0)读取模板子图像ZV_SHAPECONTOURS(s_mod,contlist1,0)将模板轮廓绘制在子图像上并显示在锁存通道2中ZV_GRAYTORGB(subImg,colorSubImg)ZV_IMGINFO(colorSubIm
20、g,0)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)ZV_LATCHCLEAR(2)ZV_LATCH(colorSubImg,2)endififVR(1)=1then假如已经保存过模板匹配参数fori=0to8d_mod_param(i)=VR(10+i)nextfori=0to6d_match_param(i)=VR
21、(20+i)nextfori=0to4d_reg_roi1(i)=VR(30+i)d_reg_roi2(i)=VR(40+i)d_reg_roi3(i)=VR(50+i)d_match_base_rst(i)=VR(70+i)nextfori=0to3d_learn_roi(i)=VR(60+i)nextTABLE(160)=VR(76)endif将ROI1的中心坐标x,y,宽,高,角度等图像坐标数据转换到控件坐标数据TABLE(231,d_reg_roi1(0),d_reg_roi1(1)ZV_POSFROMIMG(0,1,231,231)TABLE(233)=ZV_LENFROMIMG(0
22、,d_reg_roi1(2)TABLE(234)=ZV_LENFROMIMG(0,d_reg_roi1(3)TABLE(235)=d_reg_roi1(4)将ROI2的中心坐标x,y,宽,高,角度等图像坐标数据转换到控件坐标数据TABLE(331,d_reg_roi2(0),d_reg_roi2(1)ZV_POSFROMIMG(0,1,331,331)TABLE(333)=ZV_LENFROMIMG(0,d_reg_roi2(2)TABLE(334)=ZV_LENFROMIMG(0,d_reg_roi2(3)TABLE(335)=d_reg_roi2(4)将ROI3的中心坐标x,y,宽,高,角
23、度等图像坐标数据转换到控件坐标数据TABLE(431,d_reg_roi3(0),d_reg_roi3(1)ZV_POSFROMIMG(0,1,431,431)TABLE(433)=ZV_LENFROMIMG(0,d_reg_roi3(2)TABLE(434)=ZV_LENFROMIMG(0,d_reg_roi3(3)TABLE(435)=d_reg_roi3(4)ZV_LATCHCLEAR(0)清空锁存通道ENDSUB7.在“camera.bas文件中添加HMI界面中收集相关按钮响应的函数并关联动作函数。(讲明:详细实现函数前面两篇课程内容已经有操纵演示,此处不做赘述。)8.点击元件新建窗口
24、,新建学习颜色样本窗口,设计窗口布局,并关联变量和设置软键盘窗口号。9.在“main.bas文件中添加主界面【训练样本】按钮响应的函数并关联动作函数。HMI界面按下训练样本按钮时响应的函数GLOBALSUBbtn_OpenLearning()ZV_LATCHCLEAR(0)ZV_LATCHSETSIZE(0,HMI_CONTROLSIZEX(13,1),HMI_CONTROLSIZEY(13,1)设置创立模板窗口锁存通道0的锁存大小ZV_LATCH(colorImg,0)将训练学习ROI的中心坐标x,y,宽,高,角度等图像坐标数据转换到控件坐标数据TABLE(225,d_learn_roi(0
25、),d_learn_roi(1),d_learn_roi(2),d_learn_roi(3)ZV_POSFROMIMG(0,2,225,225)HMI_SHOWWINDOW(13)ENDSUB10.在“main.bas文件中添加学习颜色样本界面【学习样本】按钮响应的函数并关联动作函数。定义训练颜色样本界面按下学习样本按钮时响应的函数GLOBALSUBbtn_Learning()ZVOBJECTregionZV_REGENRECT(region,d_learn_roi(0),d_learn_roi(1),d_learn_roi(2)-d_learn_roi(0)+1,d_learn_roi(3)
26、-d_learn_roi(1)+1)生成矩形区域if(STRCOMP(d_sample_name,)=0)then?请先输入需要学习的颜色样本名称!returnelseZV_CLRGENMODELRE(colorImg,region,ColorMod,d_sample_name,0)在RGB颜色空间生成颜色模型ZV_LISTINSERT(ColorMod,Clrmod_list,-1)将颜色模型插入到列表?学习d_sample_name样本成功!endifENDSUB11.在“main.bas文件中添加学习颜色样本界面【清空样本】按钮响应的函数并关联动作函数。定义训练颜色样本界面按下清空样本按
27、钮时响应的函数GLOBALSUBbtn_Clear()if(ZV_ISEMPTY(Clrmod_list)=0)then假如训练样本库不为空ZV_CLEAR(Clrmod_list)?已清空样本列表!endifENDSUB12.在“main.bas文件中添加学习颜色样本界面【确定】按钮响应的函数并关联动作函数。定义训练颜色样本界面按下确定按钮时响应的函数GLOBALSUBbtn_Confirm()HMI_CLOSEWINDOW(13)ZV_LATCHCLEAR(0)ZV_LATCHSETSIZE(0,HMI_CONTROLSIZEX(10,2),HMI_CONTROLSIZEY(10,2)ZV
28、_LATCH(colorImg,0)ENDSUB13.在“draw.bas文件中添加学习样本区域更新绘制函数,并在学习颜色样本界面的自定义控件上关联刷新函数名和绘图函数名。根据鼠标操纵更新训练颜色样本的有效区域GLOBALSUBupdate_learnroi()ifmouse_scan(11)=1then扫描鼠标按下操纵is_set_roi_m_down=1鼠标按下标志置1sr_mpos_x=table(11)将当前鼠标按下位置的坐标赋值给变量sr_mpos_y=table(12)只有按下时可以改变击中位置,获取鼠标点击位置对应的击中区域编号hit_pos=ZV_HMIADJRECT(sr_m
29、pos_x,sr_mpos_y,225,-1)is_redraw=1绘图标志置1endififmouse_scan(11)=-1then扫描鼠标松开操纵is_set_roi_m_down=0鼠标按下标志置0sr_mpos_x=table(11)将当前鼠标松开位置的坐标赋值给变量sr_mpos_y=table(12)根据区域编号调整定位器区域位置ZV_HMIADJRECT(sr_mpos_x,sr_mpos_y,225,hit_pos)is_redraw=1绘图标志置1endif假如鼠标按下时if(is_set_roi_m_downandMOUSE_state(11)thensr_mpos_x=
30、table(11)将当前鼠标按下位置的坐标赋值给变量sr_mpos_y=table(12)根据区域编号调整定位器区域位置ZV_HMIADJRECT(sr_mpos_x,sr_mpos_y,225,hit_pos)is_redraw=1绘图标志置1endifif(1=is_redraw)then假如绘制标志=1is_redraw=0将绘制标志置0控件roi坐标转图像roi坐标,控件坐标存放在起始地址为25的数组,图像坐标存放在起始地址为15的数组ZV_POSTOIMG(0,2,225,15)将图像坐标的数据赋值给ROI变量中d_learn_roi(0)=TABLE(15)d_learn_roi(
31、1)=TABLE(16)d_learn_roi(2)=TABLE(17)d_learn_roi(3)=TABLE(18)SET_REDRAW重新绘制全部区域endifENDSUB根据更新的鼠标位置坐标绘制训练颜色样本区域GLOBALSUBdraw_learnroi()根据控件坐标数据绘制矩形DRAWRECT(TABLE(225),TABLE(226),TABLE(227),TABLE(228)localcx,cy定义部分变量cx=(TABLE(225)+TABLE(227)/2计算矩形的中心坐标x、ycy=(TABLE(226)+TABLE(228)/2DRAWLINE(cx-5,cy,cx+
32、5,cy)绘制中心十字线DRAWLINE(cx,cy-5,cx,cy+5)ENDSUB14.点击元件新建窗口,新建学习模板窗口,设计窗口布局,关联变量。15.在“draw.bas文件中添加主界面按下【学习模板】按钮响应的函数并关联动作函数。主界面按下学习模板按钮时响应的函数GLOBALSUBbtn_sel_loc()ZV_LATCHSETSIZE(0,HMI_CONTROLSIZEX(11,60),HMI_CONTROLSIZEY(11,60)设置创立模板窗口锁存通道0的锁存大小SET_COLOR(RGB(0,255,0)指定draw指令使用的颜色ZV_LATCHCLEAR(0)将锁存通道0清
33、空ZV_LATCH(grabImg,0)将收集图像显示到锁存通道0中ZV_LATCH(colorSubImg,1)将模板图像显示到锁存通道1中is_redraw=0将绘图标志置0d_is_rtn_loc=0将返回界面标志置0将模板区域的图像坐标存放到起始地址为25的table数组中TABLE(25,d_locator_roi(0),d_locator_roi(1),d_locator_roi(2),d_locator_roi(3)ZV_POSFROMIMG(0,2,25,25)将图像坐标转换到HMI控件坐标HMI_SHOWWINDOW(11)弹出窗口号为11的创立模板窗口ENDSUB16.在“
34、draw.bas文件中添加模板区域更新绘制函数,并在学习模板界面的自定义控件上关联刷新函数名和绘图函数名。根据鼠标操纵更新定位器的区域即学习模板的有效区域GLOBALSUBupdate_locator()ifmouse_scan(11)=1then扫描鼠标按下操纵is_set_roi_m_down=1鼠标按下标志置1sr_mpos_x=table(11)将当前鼠标按下位置的坐标赋值给变量sr_mpos_y=table(12)只有按下时可以改变击中位置,获取鼠标点击位置对应的击中区域编号hit_pos=ZV_HMIADJRECT(sr_mpos_x,sr_mpos_y,25,-1)is_redr
35、aw=1绘图标志置1endififmouse_scan(11)=-1then扫描鼠标松开操纵is_set_roi_m_down=0鼠标按下标志置0sr_mpos_x=table(11)将当前鼠标松开位置的坐标赋值给变量sr_mpos_y=table(12)根据区域编号调整定位器区域位置ZV_HMIADJRECT(sr_mpos_x,sr_mpos_y,25,hit_pos)is_redraw=1绘图标志置1endif假如鼠标按下时if(is_set_roi_m_downandMOUSE_state(11)thensr_mpos_x=table(11)将当前鼠标按下位置的坐标赋值给变量sr_mp
36、os_y=table(12)根据区域编号调整定位器区域位置ZV_HMIADJRECT(sr_mpos_x,sr_mpos_y,25,hit_pos)is_redraw=1绘图标志置1endifif(1=is_redraw)then假如绘制标志=1is_redraw=0将绘制标志置0控件roi坐标转图像roi坐标,控件坐标存放在起始地址为25的数组,图像坐标存放在起始地址为15的数组ZV_POSTOIMG(0,2,25,15)将图像坐标的数据赋值给ROI变量中d_locator_roi(0)=TABLE(15)d_locator_roi(1)=TABLE(16)d_locator_roi(2)=
37、TABLE(17)d_locator_roi(3)=TABLE(18)SET_REDRAW重新绘制全部区域endifENDSUB根据更新的鼠标位置坐标绘制定位器roiGLOBALSUBdraw_locator()根据控件坐标数据绘制矩形DRAWRECT(TABLE(25),TABLE(26),TABLE(27),TABLE(28)localcx,cy定义部分变量cx=(TABLE(25)+TABLE(27)/2计算矩形的中心坐标x、ycy=(TABLE(26)+TABLE(28)/2DRAWLINE(cx-5,cy,cx+5,cy)绘制中心十字线DRAWLINE(cx,cy-5,cx,cy+5
38、)ENDSUB17.在“main.bas文件中添加【截取模板】按钮响应的函数并关联动作函数。创立模板界面按下截取模板按钮后响应的函数GLOBALSUBbtn_getSubImg()LOCALmod_w,mod_h根据ROI数据生成模板子图像ZV_IMGGETSUB(grabImg,subImg,d_locator_roi(0),d_locator_roi(1),d_locator_roi(2)-d_locator_roi(0)+1,d_locator_roi(3)-d_locator_roi(1)+1)获取图像信息,存放到起始地址为0的table数组中ZV_IMGINFO(subImg,0)m
39、od_w=TABLE(0)mod_h=TABLE(1)根据图像信息生成模板区域ZV_REGENRECT(modRe,0,0,mod_w,mod_h)清空锁存通道1ZV_LATCHCLEAR(1)将模板子图像显示到锁存通道1中ZV_LATCH(subImg,1)ENDSUB18.点击元件新建窗口,新建编辑模板窗口,设计窗口布局,并关联变量。19.在“draw.bas文件中添加创立模板界面【橡皮擦】按钮响应的函数并关联动作函数。创立模板界面按下橡皮擦按钮时响应的函数GLOBALSUBbtn_sel_erase()ZV_LATCHSETSIZE(1,HMI_CONTROLSIZEX(12,1),HM
40、I_CONTROLSIZEY(12,1)设置锁存通道1的大小SET_COLOR(RGB(0,255,0)设置绘制时画笔使用的颜色ZV_LATCHCLEAR(1)清空锁存通道1ZV_IMGCOPY(subImg,copy_subImg)复制模板子图像到copy_subImg图像变量中ZV_REGION(copy_subImg,modRe,1,0)在模板图像上绘制modRe图像的非有效区域,绘制颜色为黑色,用于掩模ZV_LATCH(copy_subImg,1)显示复制的模板图HMI_SHOWWINDOW(12)翻开编辑模板窗口ENDSUB20.在“draw.bas文件中添加橡皮擦更新绘制函数,并在
41、编辑模板界面的自定义控件上关联刷新函数名和绘图函数名。根据鼠标操纵更新橡皮擦擦除/恢复区域的位置GLOBALSUBupdate_eraser()DIMc_size_eraser橡皮擦在控件上对应的尺寸DIMeraser_pos_x,eraser_pos_yd_mouse_s=MOUSE_STATE(11)鼠标处于按下状态时eraser_pos_x=TABLE(11)将当前鼠标按下位置的坐标赋值给橡皮擦控件坐标变量eraser_pos_y=TABLE(12)c_size_eraser=ZV_LENFROMIMG(0,d_eraser_size)将橡皮擦的图像尺寸转换成控件尺寸生成以(eraser
42、_pos_x,eraser_pos_y)为中心,2*c_size_eraser为边长的正方形橡皮擦区域c_rect(0,eraser_pos_x-c_size_eraser,eraser_pos_y-c_size_eraser,eraser_pos_x+c_size_eraser,eraser_pos_y+c_size_eraser)DIMhmi_w,hmi_h限制橡皮擦坐标在图片元件区域内if(eraser_pos_x=c_size_eraser)and(eraser_pos_y=c_size_eraser)and(eraser_pos_x=HMI_CONTROLSIZEX(12,1)-c_
43、size_eraser)and(eraser_pos_y=HMI_CONTROLSIZEy(12,1)-c_size_eraser)THEN重新绘制编辑模板窗口上的锁存通道0区域SET_REDRAW(0,0,HMI_CONTROLSIZEX(12,1),HMI_CONTROLSIZEY(12,1)endififd_mouse_s=1andd_edit_m=1then假如鼠标处于按下状态且编辑模板标志=1时btn_pro_eraser()执行处理橡皮擦函数endifENDSUB处理橡皮擦函数GLOBALSUBbtn_pro_eraser()ZVOBJECTtmp_re将橡皮擦区域的左上角坐标x,
44、y存放到起始地址为30的数组中TABLE(30,c_rect(0),c_rect(1)将控件坐标转换到图像坐标中ZV_POSTOIMG(1,1,30,30)根据图像坐标系下的数据生成正方形橡皮擦区域,并存放到tmp_re变量中ZV_REGENRECT(tmp_re,TABLE(30),TABLE(31),2*d_eraser_size+1,2*d_eraser_size+1)if(d_isMask_m=1)then假如选择屏蔽功能ZV_REDIFF(modRe,tmp_re,modRe)计算modRe和tmp_re的差集并存放到modRe中,即取橡皮擦区域以外的模板子图像区域else假如选择恢
45、复功能ZV_REUNION(modRe,tmp_re,modRe)计算modRe和tmp_re的并集并存放到modRe中,即取当前模板子图像区域endifZV_IMGCOPY(subImg,copy_subImg)复制模板子图像到copy_subImg图像变量中ZV_REGION(copy_subImg,modRe,1,0)在模板图像上绘制modRe图像的非有效区域,绘制颜色为黑色,用于掩模ZV_LATCH(copy_subImg,1)显示复制的模板图ENDSUB更新绘制橡皮擦区域GLOBALSUBdraw_eraser()ifd_edit_m=0then假如编辑模板标志为0return返回子函数,不继续往下执行endif绘制正方形橡皮擦区域DRAWRECT(c_rect(0),c_rect(1),c_rect(2),c_rect(3)ENDSUB21.在“main.bas文件中添加编辑模板界面【创立模板】按钮响应的函数并关联动作函数。编辑模板界面按下创立模板按钮时响应的函数GLOBALSUBbtn_loc_creModel()d_is_creModel=1创立模板标志置1根据模板参数和模板子图像创立模板,并将模板结果存放到s_