此前,我們依次講解了軟硬件介紹及計(jì)數(shù)實(shí)例、相機(jī)的基本使用、基于形狀匹配的視覺定位、BLOB有無檢測、測量尺寸、機(jī)器視覺方案中使用到的標(biāo)定功能、ZDevelop軟件實(shí)現(xiàn)識(shí)別條形碼和二維碼,測量點(diǎn)/直線/圓以及劃痕檢測功能。
本期課程我們和大家一起使用ZDevelop軟件實(shí)現(xiàn)機(jī)器視覺中使用到的OCR功能。
一、 OCR 檢測原理
什么是OCR?
OCR全稱是Optical Character Recognition,即光學(xué)字符識(shí)別。在機(jī)器視覺中OCR是指使用圖像處理方法將獲取到的圖像上的黑白字符進(jìn)行分割訓(xùn)練后,識(shí)別并輸出對(duì)應(yīng)的字符。
OCR的檢測原理?
在機(jī)器視覺中進(jìn)行OCR檢測時(shí),首先根據(jù)字符(前景)和背景的對(duì)比度以及字符的寬度和高度等參數(shù)將字符進(jìn)行分割后提取字符圖像,然后對(duì)提取的字符逐一進(jìn)行訓(xùn)練學(xué)習(xí),將所有可能出現(xiàn)的字符進(jìn)行訓(xùn)練學(xué)習(xí)后存儲(chǔ)到訓(xùn)練庫中,在執(zhí)行識(shí)別檢測時(shí),將當(dāng)前提取到的字符和訓(xùn)練庫中的字符進(jìn)行對(duì)比,輸出相似度滿足條件的字符結(jié)果。
二 、OCR 應(yīng)用場景
1.驗(yàn)證字符準(zhǔn)確性
可以驗(yàn)證待測產(chǎn)品上印刷字符的準(zhǔn)確性。
2.獲取產(chǎn)品字符信息
可以獲取待測產(chǎn)品上的字符信息上傳數(shù)據(jù)庫或錄入系統(tǒng)。
3.信息對(duì)比
可以將待測產(chǎn)品識(shí)別出的字符和條碼輸出的信息進(jìn)行對(duì)比,判斷字符印刷和條碼信息是否一致。
三、 軟件實(shí)現(xiàn)
(一)流程圖
(二)實(shí)例演示
1.打開ZDevelop軟件:新建項(xiàng)目→新建HMI文件→新建main.bas文件,用于編寫界面響應(yīng)函數(shù)→新建global_variable.bas文件用于存放全局變量并開啟HMI自動(dòng)運(yùn)行任務(wù)→新建InitParam.bas文件用于初始化測量參數(shù)→新建camera.bas文件用于實(shí)現(xiàn)相機(jī)采集功能→新建draw.bas文件用于更新繪制圖形刷新界面→文件添加到項(xiàng)目。
2.設(shè)計(jì)HMI界面。
3.在global_variable.bas文件中定義全局變量,定義完成后運(yùn)行Hmi.hmi文件。
'''''全局變量大部分使用數(shù)組結(jié)構(gòu)'''''
''注:basic編程中很多函數(shù)會(huì)以TABLE(系統(tǒng)的數(shù)據(jù)結(jié)構(gòu))做為參數(shù)
''在這里table均是做為中間變量
''table 21-22,鼠標(biāo)按鍵,控件坐標(biāo)系
''table 31-35,旋轉(zhuǎn)矩ROI參數(shù),cx、cy、width、height、angle,控件坐標(biāo)系
''table 41-45,旋轉(zhuǎn)矩形控件坐標(biāo)轉(zhuǎn)換后對(duì)應(yīng)的圖像坐標(biāo),圖像坐標(biāo)系
'主任務(wù)狀態(tài)
'0 - 未初始化
'1 - 停止
'2 - 運(yùn)行中
'3 - 正在停止
GLOBAL DIM main_task_state
main_task_state = 1
'采集開關(guān)
'0 - 停止采集
'1 - 請(qǐng)求采集
GLOBAL DIM grab_switch
grab_switch = 0
'相機(jī)個(gè)數(shù)
GLOBAL cam_num
cam_num = 0
'相機(jī)種類,"zmotion;mvision;basler;mindvision;huaray"
GLOBAL DIM CAMERA_TYPE(16)
CAMERA_TYPE = "mvision"
' 定義主任務(wù)id - 10
GLOBAL DIM main_task_id
main_task_id = 10
'定義連續(xù)采集任務(wù)id - 9
GLOBAL DIM grab_task_id
grab_task_id = 9
'定義全局圖像變量
GLOBAL ZVOBJECT grabImg '采集圖像
'定義常用顏色變量
GLOBAL C_RED, C_GREEN, C_BLUE, C_YELLOW
C_RED = RGB(255, 0, 0)
C_GREEN = RGB( 0,255, 0)
C_BLUE = RGB( 0, 0,255)
C_YELLOW= RGB(255,255, 0)
'訓(xùn)練的字符庫、輸出的字符結(jié)果
GLOBAL DIM nameSample(32),result(32)
'旋轉(zhuǎn)矩形ROI參數(shù):cx、cy、width、height、angle
GLOBAL DIM d_roi_rect2(5)
'檢測參數(shù):閾值模式、閾值參數(shù)、最小字符面積、最大字符面積、最小字符寬度、最大字符寬度、最小字符高度、最大字符高度、字符極性、形態(tài)學(xué)類型、結(jié)構(gòu)元寬、結(jié)構(gòu)元高、字符最小間距
GLOBAL DIM d_detect_param(13)
'***********定義讀取本地文件功能相關(guān)變量**************
''注意,該功能只在使用仿真器時(shí)有效
'定義是否使用本地圖片標(biāo)志
GLOBAL DIM d_use_imgfile
d_use_imgfile=1
'定義本地圖片索引
GLOBAL DIM d_index
d_index=0
'定義讀取圖片的路徑
GLOBAL DIM File_Name(100)
'***********結(jié)束定義讀取本地文件功能相關(guān)變量**********
'運(yùn)行HMI文件
RUN "Hmi1.hmi",1
4.在InitParam.bas文件中初始化測量參數(shù)。
end
GLOBAL SUB init_detect_param()'初始化測量參數(shù)
'初始化roi參數(shù)
d_roi_rect2(0) = 160.0 'roi中心x
d_roi_rect2(1) = 120.0 'roi中心y
d_roi_rect2(2) = 80.0 'roi寬
d_roi_rect2(3) = 60.0 'roi高
d_roi_rect2(4) = 0.0 'roi角度
TABLE(31) = d_roi_rect2(0) '將roi變量賦值給起始地址為31的table數(shù)組
TABLE(32) = d_roi_rect2(1)
TABLE(33) = d_roi_rect2(2)
TABLE(34) = d_roi_rect2(3)
TABLE(35) = d_roi_rect2(4)
'初始化檢測參數(shù):閾值模式、閾值參數(shù)、最小字符面積、最大字符面積、最小字符寬度、最大字符寬度、最小字符高度、最大字符高度、字符極性、形態(tài)學(xué)類型、結(jié)構(gòu)元寬、結(jié)構(gòu)元高、字符最小間距
d_detect_param(0) = 0 '手動(dòng)閾值
d_detect_param(1) = 187 '低閾值
d_detect_param(2) = 500 '最小字符面積
d_detect_param(3) = 80000 '最大字符面積
d_detect_param(4) = 10 '最小字符寬度
d_detect_param(5) = 500 '最大字符寬度
d_detect_param(6) = 10 '最小字符高度
d_detect_param(7) = 500 '最大字符高度
d_detect_param(8) = 1 '白底黑字
d_detect_param(9) = 1 '開運(yùn)算
d_detect_param(10) = 1 '結(jié)構(gòu)元寬,正奇數(shù)
d_detect_param(11) = 10 '結(jié)構(gòu)元高,正奇數(shù)
d_detect_param(12) = 1 '字符最小間距
nameSample="" '初始化訓(xùn)練字符樣本為空字符串
result=" " '初始化字符結(jié)果變量為空字符串
END SUB
5.關(guān)聯(lián)HMI界面值顯示控件變量。
具體變量關(guān)聯(lián)操作可參考視頻中相關(guān)內(nèi)容或獲取程序代碼進(jìn)行參考。
6.在main.bas文件中添加HMI界面初始化函數(shù)并在Hmi系統(tǒng)設(shè)置中關(guān)聯(lián)初始化函數(shù)。
'HMI界面初始化函數(shù)
GLOBAL SUB hmi_init()
grab_switch = 0 '初始化采集開關(guān)為停止采集
main_task_state = 1 '初始化主任務(wù)狀態(tài)為停止?fàn)顟B(tài)
'初始化時(shí)依據(jù)圖像分辨率設(shè)置區(qū)域的裁剪尺寸,此處圖像分辨率為1280x960
ZV_RESETCLIPSIZE(1280, 960)
'設(shè)置鎖存通道0的大小,以適應(yīng)圖片元件控件大小
ZV_LATCHSETSIZE(0, HMI_CONTROLSIZEX(10, 1), HMI_CONTROLSIZEY(10, 1))
ZV_SETSYSINT("LineWidth",5) '設(shè)置繪制畫筆寬度為5個(gè)像素
init_detect_param() '初始化測量參數(shù)
ZV_LATCHCLEAR(0) '清空鎖存通道0
END SUB
7.在camera.bas文件中添加HMI界面中采集相關(guān)按鈕響應(yīng)的函數(shù)并關(guān)聯(lián)動(dòng)作函數(shù)。
end
'主界面按下掃描相機(jī)按鈕時(shí)響應(yīng)的函數(shù)
GLOBAL SUB cam_scan_all()
if(d_use_imgfile=1)then
?"請(qǐng)先按下使用本地圖片按鈕關(guān)閉該功能"
return
endif
ZV_SETSYSINT("LogLevel", 7) '設(shè)置控制器信息
ZV_SETSYSSTR("DataDir","")
CAM_SCAN(CAMERA_TYPE) '掃描相機(jī),CAMERA_TYPE="mvision"
cam_num = CAM_COUNT() '獲取掃描到的相機(jī)數(shù)量
if (0 = cam_num) then '如果相機(jī)數(shù)量=0,打印提示信息
? "未找到相機(jī)"
return '退出子函數(shù),不往下執(zhí)行
endif
?"cam_num = " cam_num '如果掃描到相機(jī),打印相機(jī)數(shù)量
CAM_SEL(0) '選擇掃描到的第一個(gè)相機(jī)進(jìn)行操作
CAM_SETEXPOSURE(5000) '設(shè)置相機(jī)曝光時(shí)間為5000us
CAM_SETMODE(0) '設(shè)置軟件觸發(fā)模式
CAM_START(0) '開啟相機(jī)
END SUB
'主界面按下單次采集按鈕執(zhí)行的函數(shù)
GLOBAL SUB btn_grab()
'如果d_use_imgfile=1時(shí)使用讀取本地圖片功能,使用控制器時(shí)請(qǐng)將此部分代碼注釋掉
if (d_use_imgfile=1) then
if(d_index=3) then
d_index=0
endif
File_Name="\10"+TOSTR(d_index,1,0)+".bmp" '.../flash/10/目錄下的圖片所在的路徑名稱
ZV_IMGREAD(grabImg,File_Name,1)
ZV_LATCH(grabImg, 0)
d_index=d_index+1
return
endif
''讀取本地圖片功能結(jié)束
'如果相機(jī)數(shù)量為0,提示先掃描相機(jī),并退出子函數(shù)不往下執(zhí)行
if cam_num = 0 then
?"請(qǐng)先掃描相機(jī)!"
return
endif
CAM_SETPARAM("TriggerSoftware", 0) '發(fā)送觸發(fā)指令
CAM_GET(grabImg, 0) '獲取一幀圖像存放到grabImg變量中
ZV_LATCH(grabImg, 0) '將圖像顯示到鎖存通道0中
END SUB
'主界面按下連續(xù)采集按鈕響應(yīng)的函數(shù)
GLOBAL SUB btn_cgrab()
if grab_switch =1 then '如果已經(jīng)處于連續(xù)執(zhí)行狀態(tài),打印提示信息并退出函數(shù)
?"正在連續(xù)運(yùn)行中,請(qǐng)勿重復(fù)操作!"
return
endif
if( d_use_imgfile =0) then '如果使用相機(jī)采集功能
if cam_num = 0 then '判斷如果相機(jī)數(shù)量=0,打印提示信息并退出函數(shù)
?"請(qǐng)先掃描相機(jī)!"
return
endif
endif
grab_switch = 1 '采集任務(wù)開關(guān)置1
if (1 = grab_switch) then
if (0 = PROC_STATUS(grab_task_id)) then
RUNTASK grab_task_id, grab_task '開啟連續(xù)采集任務(wù)
endif
endif
END SUB
'采集任務(wù)實(shí)現(xiàn)函數(shù)
grab_task:
while(1)
if (0 = grab_switch) then '如果采集任務(wù)開關(guān)=0即停止采集按鈕按下時(shí)
exit while '退出循環(huán)
endif
'grab_switch=1時(shí)重復(fù)執(zhí)行以下操作
btn_grab()'單次采集按鈕響應(yīng)的函數(shù)
wend
END
'主界面按下停止采集按鈕響應(yīng)的函數(shù)
GLOBAL SUB btn_stopCgrab()
if grab_switch =0 then '如果已經(jīng)處于停止采集狀態(tài),打印提示信息并退出函數(shù)
?"未開啟連續(xù)采集!"
return
endif
grab_switch = 0 '將采集任務(wù)開關(guān)置0
END SUB
8.在draw.bas文件中添加檢測ROI更新繪制函數(shù),并在自定義元件屬性窗口中關(guān)聯(lián)刷新函數(shù)和繪制函數(shù)。
end
'和繪制(即選擇ROI)有關(guān)的界面的刷新繪制函數(shù)放在這個(gè)bas文件里
DIM is_redraw '繪圖標(biāo)志,0表示未進(jìn)行繪制,1表示正在進(jìn)行繪制
is_redraw = 0
DIM hit_pos '定義調(diào)整操作標(biāo)志
'根據(jù)鼠標(biāo)操作更新ROI位置區(qū)域函數(shù)
GLOBAL SUB update_roi()
if mouse_scan(21) = 1 then '掃描鼠標(biāo)按下操作
'只有按下時(shí)可以改變擊中位置,獲取鼠標(biāo)點(diǎn)擊位置對(duì)應(yīng)的擊中區(qū)域編號(hào)
hit_pos = ZV_HMIADJRECT2(table(21), table(22), 31, -1)
is_redraw = 1 '繪圖標(biāo)志置1
endif
if mouse_scan(21) = -1 then '掃描鼠標(biāo)松開操作
'根據(jù)區(qū)域編號(hào)調(diào)整roi區(qū)域位置
ZV_HMIADJRECT2(table(21), table(22), 31, hit_pos)
is_redraw = 1 '繪圖標(biāo)志置1
endif
if (MOUSE_state(21)) then '鼠標(biāo)按下時(shí)
'根據(jù)區(qū)域編號(hào)調(diào)整roi區(qū)域位置
ZV_HMIADJRECT2(table(21), table(22), 31, hit_pos)
is_redraw = 1 '繪圖標(biāo)志置1
endif
if (1 = is_redraw) then '如果繪制標(biāo)志=1
is_redraw = 0 '繪圖標(biāo)志置0
'控件roi坐標(biāo)轉(zhuǎn)圖像roi坐標(biāo),控件坐標(biāo)存放在起始地址為111的數(shù)組,圖像坐標(biāo)存放在起始地址為50的數(shù)組
ZV_POSTOIMG(0, 1, 31, 41)
d_roi_rect2(0) = TABLE(41)'將圖像坐標(biāo)的數(shù)據(jù)賦值給ROI變量
d_roi_rect2(1) = TABLE(42)
d_roi_rect2(2) = ZV_LENTOIMG(0, TABLE(33))
d_roi_rect2(3) = ZV_LENTOIMG(0, TABLE(34))
d_roi_rect2(4) = TABLE(35)
SET_REDRAW '重新繪制全部區(qū)域
endif
END SUB
'ROI區(qū)域更新后實(shí)時(shí)繪制ROI區(qū)域
GLOBAL SUB draw_roi()
SET_COLOR(C_BLUE) '設(shè)置畫筆顏色為藍(lán)色
ZV_HMIRECT2(31, 300) '將旋轉(zhuǎn)矩形roi分解為HMI支持的繪圖圖元并添加控制參數(shù),便于HMI繪圖顯示
DRAWLINE(TABLE(300), TABLE(301), TABLE(302), TABLE(303)) '繪制外矩形
DRAWLINE(TABLE(302), TABLE(303), TABLE(304), TABLE(305))
DRAWLINE(TABLE(304), TABLE(305), TABLE(306), TABLE(307))
DRAWLINE(TABLE(306), TABLE(307), TABLE(300), TABLE(301))
DRAWLINE(TABLE(308), TABLE(309), TABLE(310), TABLE(311)) '繪制方向箭頭
DRAWLINE(TABLE(312), TABLE(313), TABLE(310), TABLE(311))
DRAWLINE(TABLE(314), TABLE(315), TABLE(310), TABLE(311))
END SUB
9.在main.bas文件中添加HMI界面按下【提取訓(xùn)練】按鈕時(shí)響應(yīng)的函數(shù)并關(guān)聯(lián)動(dòng)作函數(shù)名。
'HMI界面按下提取字符按鈕時(shí)響應(yīng)的函數(shù)
GLOBAL SUB btn_segment()
'定義檢測需要用到的變量:分割參數(shù)、樣本圖片庫、訓(xùn)練樣本庫、OCR分類器、結(jié)果圖片
GLOBAL ZVOBJECT param,sample,trainSample,ocr,colorImg
'根據(jù)界面輸入?yún)?shù)生成分割參數(shù)
ZV_OCRSEGSETPARAM_(param,d_detect_param(0),d_detect_param(1),d_detect_param(2),d_detect_param(3),d_detect_param(4),d_detect_param(5),d_detect_param(6),d_detect_param(7),d_detect_param(8),d_detect_param(9),d_detect_param(10),d_detect_param(11),d_detect_param(12))
'根據(jù)分割參數(shù)和檢測區(qū)域進(jìn)行字符分割,分割的字符樣本圖片存放到sample變量中
ZV_OCRSEGCHAR_(grabImg,param,sample,d_roi_rect2(0),d_roi_rect2(1),d_roi_rect2(2),d_roi_rect2(3),d_roi_rect2(4))
'獲取樣本數(shù)量,存放到table(100)中
ZV_OCRSAMPLECNT_(sample,100)
'灰度圖轉(zhuǎn)換到RGB圖,作為結(jié)果圖像
ZV_GRAYTORGB(grabImg, colorImg)
if(TABLE(100)>0) then '如果識(shí)別到的字符數(shù)量大于0
for i=0 to TABLE(100)-1'根據(jù)識(shí)別到的字符次數(shù)進(jìn)行循環(huán)
ZV_OCRSAMPLERECT2_(sample,i,150)'獲取每個(gè)樣本字符的最小外接矩陣,用于顯示分割結(jié)果
'將樣本的最小外接矩陣?yán)L制到界面中
ZV_RECT2(colorImg,table(150),table(151),table(152),table(153),table(154),C_GREEN)
next
elseif (TABLE(100)=0) then '如果未分割提取到字符
?"未成功分割提取出字符!" '打印提示并退出執(zhí)行
return
endif
ZV_LATCH(colorImg,0)'在鎖存通道0中顯示結(jié)果圖像
if (STRCOMP(nameSample, "")=0)then '如果輸入的訓(xùn)練字符樣本是空的
?"請(qǐng)先輸入訓(xùn)練字符樣本再重新分割訓(xùn)練!" '打印提示
return '返回子函數(shù),不往下執(zhí)行
endif
'清空OCR分類器
ZV_CLEAR(ocr)
if(ZV_ISEMPTY(trainSample)=0) then '如果訓(xùn)練樣本庫不為空
ZV_OCRSAMPLECLR_(trainSample)'在訓(xùn)練字符之前先清空樣本庫
endif
'根據(jù)輸入的訓(xùn)練庫字符生成訓(xùn)練樣本庫
ZV_OCRSAMPLEAPP_(sample,trainSample,nameSample)
'使用訓(xùn)練樣本庫訓(xùn)練分類器,0.8為優(yōu)化參數(shù)(懲罰系數(shù)),表示分類器的預(yù)測能力, 越小預(yù)測能力越強(qiáng)但越容易出錯(cuò),范圍[0,1],建議 0.8;
'0.15為徑向基核參數(shù),表示非線性映射能力,值越大非線 性映射能力就越強(qiáng),范圍[0,1],建議 0.15
ZV_OCRTRAINSVM_(trainSample,ocr,0.8,0.15)
if(ZV_ISEMPTY(ocr)=0) then '如果分類器訓(xùn)練成功
?"字符分割訓(xùn)練已完成!" '打印成功提示
else
?"訓(xùn)練字符和分割提取的字符不匹配!"
endif
END SUB
10.在main.bas文件中添加HMI界面按下【識(shí)別】按鈕時(shí)響應(yīng)的函數(shù)并關(guān)聯(lián)動(dòng)作函數(shù)名。
'HMI界面按下識(shí)別按鈕時(shí)響應(yīng)的函數(shù)
GLOBAL SUB btn_test()
result=" " '清空字符結(jié)果變量
'根據(jù)界面輸入?yún)?shù)生成分割參數(shù)
ZV_OCRSEGSETPARAM_(param,d_detect_param(0),d_detect_param(1),d_detect_param(2),d_detect_param(3),d_detect_param(4),d_detect_param(5),d_detect_param(6),d_detect_param(7),d_detect_param(8),d_detect_param(9),d_detect_param(10),d_detect_param(11),d_detect_param(12))
'根據(jù)分割參數(shù)和檢測區(qū)域進(jìn)行字符分割,分割的字符樣本存放到sample變量中
ZV_OCRSEGCHAR_(grabImg,param,sample,d_roi_rect2(0),d_roi_rect2(1),d_roi_rect2(2),d_roi_rect2(3),d_roi_rect2(4))
'獲取分割到的字符數(shù)量,存放到table(100)中
ZV_OCRSAMPLECNT_(sample,100)
if(TABLE(100)=0) then '如果未分割提取到字符
?"未成功分割提取出字符!" '打印提示并退出執(zhí)行
return
endif
'使用訓(xùn)練樣本和分類器識(shí)別字符并輸出字符結(jié)果到起始地址為50的變量中
ZV_OCRCLASSIFYSVM_(ocr,sample,32,50)
'獲取識(shí)別到的字符數(shù)量,存放到table(100)中
ZV_OCRSAMPLECNT_(sample,100)
'灰度圖轉(zhuǎn)換到RGB圖,作為結(jié)果圖像
ZV_GRAYTORGB(grabImg, colorImg)
if(TABLE(100)>0) then '如果識(shí)別到的字符數(shù)量大于0
for i=0 to TABLE(100)-1'將字符結(jié)果循環(huán)賦值給結(jié)果變量顯示到界面中
result(i)=TABLE(50+i)
ZV_OCRSAMPLERECT2_(sample,i,150)'獲取每個(gè)樣本字符的最小外接矩陣,用于顯示分割結(jié)果
'將樣本的最小外接矩陣?yán)L制到界面中
ZV_RECT2(colorImg,table(150),table(151),table(152),table(153),table(154),C_GREEN)
next
endif
ZV_LATCH(colorImg,0)'在鎖存通道0中顯示結(jié)果圖像
END SUB
11.在main.bas文件中添加【運(yùn)行】按鈕響應(yīng)的函數(shù)并關(guān)聯(lián)動(dòng)作函數(shù)。
'HMI界面按下運(yùn)行按鈕時(shí)響應(yīng)的函數(shù)
GLOBAL SUB btn_run()
if(2 = main_task_state) then '如果主任務(wù)處于運(yùn)行中狀態(tài)
?"已經(jīng)開啟連續(xù)運(yùn)行任務(wù),請(qǐng)勿重復(fù)操作!" '打印提示
return
endif
if (1 = main_task_state) then '如果主任務(wù)處于停止?fàn)顟B(tài)
if (0 = PROC_STATUS(main_task_id)) then'如果程序中任務(wù)未開啟
main_task_state = 2 '將主任務(wù)狀態(tài)設(shè)置為運(yùn)行中狀態(tài)
RUNTASK main_task_id, main_task'開啟主任務(wù)
endif
endif
END SUB
'主任務(wù)執(zhí)行的函數(shù)
main_task:
while(1)
'如果主任務(wù)狀態(tài)處于正在停止?fàn)顟B(tài)即停止按鈕按下時(shí)
if (3 = main_task_state) then
main_task_state = 1'將主任務(wù)狀態(tài)設(shè)置為停止?fàn)顟B(tài)
exit while '退出循環(huán)
endif
'否則循環(huán)執(zhí)行采集和識(shí)別函數(shù)
btn_grab()
btn_test()
wend
END
12.在main.bas文件中添加【停止】按鈕響應(yīng)的函數(shù)并關(guān)聯(lián)動(dòng)作函數(shù)。
'HMI界面按下停止按鈕時(shí)響應(yīng)的函數(shù)
GLOBAL SUB btn_stop()
if (2 = main_task_state) then '如果主任務(wù)狀態(tài)處于2即任務(wù)運(yùn)行中時(shí)
main_task_state = 3 '將主任務(wù)狀態(tài)置為3,退出循環(huán)
endif
END SUB
(三)仿真演示效果
本次,正運(yùn)動(dòng)技術(shù)VPLC系列機(jī)器視覺運(yùn)動(dòng)控制一體機(jī)快速入門(十)——OCR功能,就分享到這里。
更多精彩內(nèi)容請(qǐng)關(guān)注“正運(yùn)動(dòng)小助手”公眾號(hào),需要相關(guān)開發(fā)環(huán)境與例程代碼,請(qǐng)咨詢正運(yùn)動(dòng)技術(shù)銷售工程師:400-089-8936。
本文由正運(yùn)動(dòng)技術(shù)原創(chuàng),歡迎大家轉(zhuǎn)載,共同學(xué)習(xí),一起提高中國智能制造水平。文章版權(quán)歸正運(yùn)動(dòng)技術(shù)所有,如有轉(zhuǎn)載請(qǐng)注明文章來源。
-
機(jī)器視覺
+關(guān)注
關(guān)注
161文章
4320瀏覽量
119995 -
字符識(shí)別
+關(guān)注
關(guān)注
0文章
17瀏覽量
8636 -
OCR
+關(guān)注
關(guān)注
0文章
142瀏覽量
16309 -
正運(yùn)動(dòng)技術(shù)
+關(guān)注
關(guān)注
0文章
96瀏覽量
288
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論