中國自動化學(xué)會專家咨詢工作委員會指定宣傳媒體
文摘詳情
gkongbbs

VPLC系列機器視覺運動控制一體機快速入門(八)測量點/線/圓

http://casecurityhq.com 2023-05-19 17:30 深圳市正運動技術(shù)有限公司

 此前,我們依次講解了軟硬件介紹及計數(shù)實例、相機的基本使用、基于形狀匹配的視覺定位、BLOB有無檢測、測量尺寸、機器視覺方案中使用到的標(biāo)定功能以及ZDevelop軟件實現(xiàn)識別條形碼和二維碼的功能。

 本期課程我們和大家一起分享機器視覺的基本測量功能——測量點/直線/圓。

    《視頻教程:VPLC系列機器視覺運動控制一體機快速入門(八)》

  2.png

  一、檢測原理

  機器視覺中使用到的測量點/線/圓的功能都是基于邊緣檢測的視覺算法。

  邊緣檢測即是在一定的搜索區(qū)域內(nèi),按照指定的方向逐像素搜索滿足極性變化和對比度要求的過渡邊緣點。

  3.png

 二、測量點/線/圓特點

  1.實現(xiàn)簡單

  測量點/線/圓的算法是基于邊緣檢測的算法,易于實現(xiàn)。

  2.需要位置跟隨

  測量器本身不具有定位功能,如果檢測產(chǎn)品位置不固定將無法確定測量器對應(yīng)的位置,此時需要依賴匹配等定位功能做位置跟隨。

  4.png

  三、量點應(yīng)用場景

  1.精準(zhǔn)定位

  檢測特征邊緣點的位置并輸出對應(yīng)坐標(biāo)可實現(xiàn)精準(zhǔn)定位,常配合匹配(粗定位)使用。

  2.擬合直線

  可通過檢測兩個特征邊緣點擬合出一條直線,并輸出直線數(shù)據(jù)做進一步檢測。

  四、測量線應(yīng)用場景

  1.精準(zhǔn)定位

  通常使用檢測兩條直線的交點位置坐標(biāo)作為定位位置,輸出的位置精度比匹配輸出的位置精度高,常配合匹配(粗定位)使用。

  2.檢測直線度

  可通過一個直線測量器檢測多個邊緣點擬合直線后根據(jù)不在直線上的異常邊緣點數(shù)來判斷直線度。

  3.測量尺寸

  可通過檢測兩條直線并計算兩條直線的距離求出產(chǎn)品的邊緣尺寸距離。

  五、測量圓應(yīng)用場景

  1.測量圓

  測量圓形特征,得出圓形的圓心、半徑等數(shù)據(jù)。

  2.定位

  通過測量圓的特征輸出圓心位置坐標(biāo)數(shù)據(jù)做精準(zhǔn)定位,常配合匹配(粗定位)使用。

  3.九點標(biāo)定

  可通過檢測實心圓矩陣標(biāo)定板上的九個圓心的圖像坐標(biāo)數(shù)據(jù),和標(biāo)定板對應(yīng)的世界坐標(biāo)數(shù)據(jù)計算出標(biāo)定系數(shù)。

  5.png

  測量點/線/圓流程圖

  六、實例演示

  1.打開ZDevelop軟件:新建項目→新建HMI文件→新建main.bas文件,用于編寫界面響應(yīng)函數(shù)→新建global_variable.bas文件用于存放全局變量→新建InitParam.bas文件用于初始化測量參數(shù)→新建camera.bas文件用于實現(xiàn)相機采集功能→新建draw.bas文件用于更新繪制圖形刷新界面→文件添加到項目。

  6.png

  2.設(shè)計運行界面,運行界面只進行采集圖像操作和檢測執(zhí)行操作,并顯示數(shù)據(jù)結(jié)果。

  7.png

  3.在global_variable.bas文件添加使用到的全局變量。

  '''''全局變量大部分使用數(shù)組結(jié)構(gòu)'''''

  ''注:basic編程中很多函數(shù)會以TABLE(系統(tǒng)的數(shù)據(jù)結(jié)構(gòu))做為參數(shù)

  ''在這里table均是做為中間變量

  ''table 0-20 作為匹配時使用到的中間變量

  ''table 50-70 作為roi繪制時的中間變量使用
 

  ''table 21-22,表示鼠標(biāo)按鍵控件坐標(biāo)系

  ''table 31-35,表示控件坐標(biāo)轉(zhuǎn)換后對應(yīng)的圖像坐標(biāo)

  ''table 111-114,表示定位器區(qū)域roi參數(shù),屬于控件坐標(biāo)系

  ''table 121-124,表示橡皮擦區(qū)域roi參數(shù),屬于控件坐標(biāo)系

  ''table 81-98,表示標(biāo)定使用到的九個點的圖像坐標(biāo)

  ''table 131-148,表示標(biāo)定使用到的九個點的世界坐標(biāo)

  '***********定義程序任務(wù)相關(guān)變量**********************
 

  '主任務(wù)狀態(tài)

  '0 - 未初始化

  '1 - 停止

  '2 - 運行中

  '3 - 正在停止

  GLOBAL DIM main_task_state

  main_task_state = 1
 

  '是否標(biāo)定

  global is_ca_success
 

  '運行任務(wù)開關(guān)

  GLOBAL DIM run_switch

  run_switch = 0
 

  '采集任務(wù)開關(guān)

  '0 - 停止采集

  '1 - 請求采集

  GLOBAL DIM grab_switch

  grab_switch = 0
 

  '定位檢測主任務(wù)id - 10

  GLOBAL DIM main_task_id

  main_task_id = 10
 

  '相機連續(xù)采集線程id - 7

  GLOBAL DIM grab_task_id

  grab_task_id = 7
 

  '***********結(jié)束定義程序任務(wù)相關(guān)變量******************
 

  '***********定義相機采集相關(guān)變量**********************
 

  '相機種類,"",此處使用??迪鄼C-"mvision"

  GLOBAL DIM CAMERA_TYPE(100)

  'CAMERA_TYPE = "mindvision;basler;mvision;huaray;basler;zmotion"

  CAMERA_TYPE = "mvision"
 

  '相機個數(shù)

  GLOBAL cam_num

  cam_num = 0
 

  '相機模式,-1 連續(xù)采集,0-觸發(fā)采集

  GLOBAL cam_mode

  cam_mode = 0
 

  '***********結(jié)束定義相機采集相關(guān)變量******************
 

  '定義返回主界面標(biāo)志,1-已返回,0-未返回

  GLOBAL DIM d_is_rtn_loc

  d_is_rtn_loc = 1
 

  '***********定義模板相關(guān)變量*************************
 

  '定義創(chuàng)建模板標(biāo)志位,1-已創(chuàng)建模板,0-未創(chuàng)建模板

  GLOBAL DIM d_is_creModel

  d_is_creModel = 0
 

  '學(xué)習(xí)模板參數(shù),starAngle、endAngle、minScale、maxScale、thresh、numlevel、reduce、angleStep、scaleStep

  GLOBAL DIM d_mod_param(9)
 

  '***********結(jié)束定義模板相關(guān)變量**********************
 

  '***********定義編輯模板相關(guān)變量*********************
 

  '定義編輯模板標(biāo)志,0-表示不編輯模板,1-表示編輯模板

  GLOBAL DIM d_edit_m

  d_edit_m = 0
 

  '定義使用橡皮擦功能標(biāo)志,0-表示恢復(fù)擦除的區(qū)域,1-表示擦除區(qū)域

  GLOBAL DIM d_isMask_m

  d_isMask_m = 1
 

  '定義橡皮擦的roi參數(shù),依次是矩形左上角和右下角圖像坐標(biāo)x、y、x、y

  GLOBAL DIM d_locator_roi(4),d_eraser_roi(4)
 

  '定義正方形橡皮擦尺寸寬度

  GLOBAL DIM d_eraser_size

  d_eraser_size = 5
 

  '定義界面控件上橡皮擦的矩形區(qū)域

  GLOBAL DIM c_rect(4)
 

  '定義鼠標(biāo)狀態(tài)標(biāo)志,0-表示鼠標(biāo)處于松開狀態(tài),1-表示鼠標(biāo)處于按下狀態(tài)

  GLOBAL DIM d_mouse_s

  d_mouse_s = 0
 

  '***********結(jié)束定義編輯模板相關(guān)變量******************
 

  '***********定義匹配檢測相關(guān)變量*********************
 

  '匹配檢測參數(shù),minScore、matchNum、minDist、thresh、accuracy、speed、polor

  GLOBAL DIM d_match_param(7)
 

  '定義學(xué)習(xí)模板的roi參數(shù)和橡皮擦的roi參數(shù),依次是矩形左上角和右下角圖像坐標(biāo)x、y、x、y

  GLOBAL DIM d_locator_roi(4),d_eraser_roi(4)
 

  '匹配結(jié)果,score、x、y、angle、scale, 目前對于多目標(biāo)匹配也只存第一個目標(biāo)

  GLOBAL DIM d_match_rst(5)
 

  '***********結(jié)束定義匹配檢測相關(guān)變量******************
 

  '定義程序執(zhí)行過程中緩存中間圖片和結(jié)果圖片的變量

  GLOBAL ZVOBJECT grabImg

  GLOBAL ZVOBJECT subImg,copy_subImg,colorSubImg, s_mod

  GLOBAL ZVOBJECT modRe
 

  '***********定義坐標(biāo)標(biāo)定相關(guān)變量*********************

  '定義是否使用標(biāo)定功能標(biāo)志,0-不使用標(biāo)定功能,1-使用標(biāo)定功能

  GLOBAL DIM d_use_calib

  d_use_calib = 0
 

  '定義標(biāo)定成功標(biāo)志,0-標(biāo)定未成功,1-標(biāo)定成功

  GLOBAL DIM d_calib_success

  d_calib_success = 0
 

  '標(biāo)定參數(shù)

  GLOBAL ZVOBJECT ca_param
 

  '標(biāo)定參數(shù)數(shù)組,依次為:標(biāo)定類型、對比度、極性、最小面積、最大面積、世界坐標(biāo)點間距

  GLOBAL DIM d_ca_param(6) 'd開頭表示數(shù)據(jù)結(jié)構(gòu)
 

  '標(biāo)定誤差,最小誤差、最大誤差、平均誤差

  GLOBAL DIM ca_min_err,ca_max_err,ca_avg_err

  ca_min_err = 0

  ca_max_err = 0

  ca_avg_err = 0
 

  '常用顏色變量

  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)
 

  '標(biāo)定矩陣

  GLOBAL ZVOBJECT ca_mat

  '***********結(jié)束定義坐標(biāo)標(biāo)定相關(guān)變量******************
 

  '***********定義測量點/線/圓相關(guān)變量******************

  '定義檢測消耗時間

  GLOBAL DIM d_detect_time
 

  '定義是否使用補正源,0-不使用補正源,1-使用補正源

  GLOBAL DIM d_use_locator

  '

  '是否繪制測量器

  GLOBAL DIM line_status,circle_status,point_status

  line_status=0

  circle_status=0

  point_status=0
 

  '測量點/線/圓參數(shù)設(shè)置,包括邊緣極性/邊緣位置/對比度/濾波尺寸/掃描數(shù)量/掃描寬度

  GLOBAL DIM d_point_param(4),d_line_param(6), d_circle_parm(6)
 

  '繪制結(jié)果參數(shù)

  GLOBAL DIM draw_point(2),draw_line(4),draw_circle(3)

  '***********結(jié)束定義測量點/線/圓相關(guān)變量**************

  '定義點測量器區(qū)域/線測量器區(qū)域/圓測量器區(qū)域

  GLOBAL DIM d_roi_rect1(5),d_roi_rect2(5),d_roi_arc(6)
 

  '設(shè)置創(chuàng)建模板的基準(zhǔn)坐標(biāo)

  GLOBAL DIM d_match_base_rst(5)
 

  GLOBAL ZVOBJECT mat_rigid,latch '
 

  '**********************點線圓測量數(shù)據(jù)結(jié)果*****************

  GLOBAL DIM point_result(5),line_result(5),circle_result(5)
 

  '***********定義讀取本地文件功能相關(guān)變量**************

  ''注意,該功能只在使用仿真器時有效

  '定義是否使用本地圖片標(biāo)志

  GLOBAL DIM d_use_imgfile
 

  '定義本地圖片索引

  GLOBAL DIM d_index
 

  '定義讀取圖片的路徑

  GLOBAL DIM File_Name(100)
 

  '***********結(jié)束定義讀取本地文件功能相關(guān)變量**********

  RUN "Hmi1.hmi",1

  

  4.在InitParam.bas文件中初始化測量變量。

  end
 

  GLOBAL SUB init_meas_param() '初始化參數(shù)
 

     '初始化定位器roi參數(shù)

     d_locator_roi(0) = 240 '左上角x

     d_locator_roi(1) = 180 '左上角y

     d_locator_roi(2) = 400 '右下角x

     d_locator_roi(3) = 300 '右下角y
 

     '初始化模板參數(shù)

     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 '默認(rèn)金字塔層數(shù)

     d_mod_param(6) = 0 '默認(rèn)約簡特征點

     d_mod_param(7) = 0 '默認(rèn)角度步長

     d_mod_param(8) = 0 '默認(rèn)縮放步長
 

     '初始化匹配測量參數(shù)

     d_match_param(0) = 50 '最小分?jǐn)?shù)

     d_match_param(1) = 1 '匹配個數(shù)

     d_match_param(2) = 0 '默認(rèn)最小間距

     d_match_param(3) = 40 '最小閾值

     d_match_param(4) = 0 '精度

     d_match_param(5) = 9 '速度

     d_match_param(6) = 0 '極性
 

     '初始化匹配定位結(jié)果

     d_match_rst(0) = 0 '分?jǐn)?shù)

     d_match_rst(1) = 0 '位置X

     d_match_rst(2) = 0 '位置Y

     d_match_rst(3) = 0 '角度

     d_match_rst(4) = 0 '比例
 

     '點的測量參數(shù)初始化

     d_point_param(0)=0

     d_point_param(1)=0

     d_point_param(2)=30

     d_point_param(3)=5
 

     '線的測量參數(shù)初始化

     d_line_param(0)=0

     d_line_param(1)=0

     d_line_param(2)=30

     d_line_param(3)=5

     d_line_param(4)=10

     d_line_param(5)=8
 

     '圓的測量參數(shù)初始化

     d_circle_parm(0)=0

     d_circle_parm(1)=0

     d_circle_parm(2)=20

     d_circle_parm(3)=5

     d_circle_parm(4)=10

     d_circle_parm(5)=8
 

     '初始化坐標(biāo)標(biāo)定相關(guān)的變量

     d_ca_param(0) = 0 '標(biāo)定類型

     d_ca_param(1) = 120 '對比度

     d_ca_param(2) = 0 '極性

     d_ca_param(3) = 80 '最小面積

     d_ca_param(4) = 20000 '最大面積

     d_ca_param(5) = 9 '世界坐標(biāo)點間距

     ca_min_err = 0 '最小誤差

     ca_max_err = 0 '最大誤差

     ca_avg_err = 0 '平均誤差
 

     d_detect_time = 0

     d_use_locator = 0 '默認(rèn)不使用補正源

     d_use_imgfile = 1

     d_index = 0
 

     TABLE(31,100,100,60,40,60,8,5) '點測量器初始化

     TABLE(231,100,100,60,40,60,8,5) '線測量器初始化

     TABLE(551,100,100,60,50,0,360,8,5) '圓測量器初始化

  END SUB

  5.在運行界面中關(guān)聯(lián)相關(guān)變量。

  8.png

  6.在main.bas文件中添加運行界面初始化函數(shù),并關(guān)聯(lián)HMI界面初始化函數(shù)名。

  '運行界面初始化函數(shù),上電執(zhí)行一次

  GLOBAL SUB hmi_init()
 

     grab_switch = 0 '初始化采集任務(wù)開關(guān),不開啟采集任務(wù)

     main_task_state = 1 '初始化定位檢測主任務(wù)狀態(tài)為停止?fàn)顟B(tài)1

     ZV_SETSYSINT("LineWidth",5) '設(shè)置繪制畫筆寬度為5個像素

     ZV_RESETCLIPSIZE(1280, 1024) '初始化時依據(jù)圖像分辨率設(shè)置區(qū)域的裁剪尺寸,此處圖像分辨率為1280x1024

     ZV_LATCHSETSIZE(0, HMI_CONTROLSIZEX(10, 1), HMI_CONTROLSIZEY(10, 1)) '設(shè)置鎖存的大小

     init_meas_param() '初始化測量參數(shù)
 

     ZV_IMGGENCONST(subImg,40,30,1,0,0) '初始化模板子圖像
 

     '定義匹配中間結(jié)果變量

     ZVOBJECT contlist1, tsContlist1, mat_rigid1

     ZVOBJECT contlist2, tsContlist2, mat_rigid2
 

     ZV_READIMAGE(grabImg,"\8\calib.bmp",1) '讀取...\flash\8目錄下的calib.bmp的灰度圖像,用于加載本地圖片仿真時進行坐標(biāo)標(biāo)定

     ZV_LATCHCLEAR(0) '清空鎖存通道0

     ZV_LATCH(grabImg,0) '顯示到鎖存通道0中
 

  END SUB

  

  9.png

  

  7.在camera.bas文件中添加采集相關(guān)按鈕的功能函數(shù),并關(guān)聯(lián)動作函數(shù)名。

  end
 

  '主界面按下掃描相機按鈕時響應(yīng)的函數(shù)

     GLOBAL SUB cam_scan_all()
 

         if(d_use_imgfile=1)then

             ?"請先按下使用本地圖片按鈕關(guān)閉該功能"

         return

     endif
 

     ZV_SETSYSINT("LogLevel", 7) '設(shè)置控制器信息

     ZV_SETSYSSTR("DataDir","")
 

     CAM_SCAN(CAMERA_TYPE) '掃描相機,CAMERA_TYPE="mvision"

     cam_num = CAM_COUNT() '獲取掃描到的相機數(shù)量

     if (0 = cam_num) then '如果相機數(shù)量=0,打印提示信息

         ? "未找到相機"
 

         return '退出子函數(shù),不往下執(zhí)行

     endif

     ?"cam_num = " cam_num '如果掃描到相機,打印相機數(shù)量

         cam_mode = 0 '設(shè)置軟觸發(fā)采集
 

     CAM_SEL(0) '選擇掃描到的第一個相機進行操作

     CAM_SETEXPOSURE(5000) '設(shè)置相機曝光時間為5000us

     CAM_SETMODE(cam_mode) '設(shè)置軟件觸發(fā)模式

     CAM_START(0) '開啟相機
 

  END SUB
 

  '主界面按下單次采集按鈕執(zhí)行的函數(shù)

  GLOBAL SUB btn_grab()
 

     ''如果d_use_imgfile=1時使用讀取本地圖片功能,該功能只在使用仿真器時有效,使用控制器時請將此部分代碼注釋掉

     if (d_use_imgfile=1) then

         if(d_index=3) then

             d_index=0

     endif

     File_Name="\8\"+TOSTR(d_index,1,0)+".bmp" '.../flash/3/目錄下的圖片所在的路徑名稱

     ZV_IMGREAD(grabImg,File_Name,0)

     ZV_LATCH(grabImg, 0)

     d_index=d_index+1

  return

  endif

     ''讀取本地圖片功能結(jié)束
 

         if cam_num = 0 then

             ?"請先掃描相機!"

         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ù)運行中,請勿重復(fù)操作!"

     return

  endif
 

  if( d_use_imgfile =0) then
 

     if cam_num = 0 then '如果相機數(shù)量=0,打印提示信息并退出函數(shù)

             ?"請先掃描相機!"

         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ù)實現(xiàn)函數(shù)

  grab_task:

     while(1)

         if (0 = grab_switch) then '如果采集任務(wù)開關(guān)=0即停止采集按鈕按下時

             exit while '退出循環(huán)

         endif
 

         '重復(fù)執(zhí)行以下操作

         btn_grab()

     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

  10.png

  

  8.新建運行界面按下【參數(shù)設(shè)置】按鈕時彈出的參數(shù)設(shè)置窗口,并設(shè)計界面布局。

  11.png

  

  9.添加在運行界面按下【參數(shù)設(shè)置】按鈕時響應(yīng)的函數(shù),并關(guān)聯(lián)動作函數(shù)名。

  '運行界面按下參數(shù)設(shè)置按鈕時響應(yīng)的函數(shù)

  GLOBAL SUB btn_set_param()
 

     ZV_LATCHSETSIZE(0, HMI_CONTROLSIZEX(11, 1), HMI_CONTROLSIZEY(11, 1)) '設(shè)置鎖存的大小

     ZV_LATCHCLEAR(0)

     ZV_LATCH(grabImg,0) '顯示到鎖存通道0中,作為顯示區(qū)域背景圖片

     HMI_SHOWWINDOW(11)
 

  END SUB

  

  12.png

  

  10.參考第三篇“基于形狀匹配的視覺定位”,添加形狀匹配功能,添加流程如下:

  13.png

  

  end
 

  '和繪制(即選擇ROI)有關(guān)的界面刷新繪制函數(shù)放在這個bas文件里
 

  DIM is_redraw '繪圖標(biāo)志,0表示未進行繪制,1表示正在進行繪制

  is_redraw = 0
 

  DIM sr_mpos_x, sr_mpos_y, hit_pos
 

  '主界面按下學(xué)習(xí)模板按鈕時響應(yīng)的函數(shù)

  GLOBAL SUB btn_sel_loc()

     ZV_LATCHSETSIZE(0, HMI_CONTROLSIZEX(12, 60), HMI_CONTROLSIZEY(12, 60)) '設(shè)置創(chuàng)建模板窗口鎖存通道0的鎖存大小

     ZV_LATCHSETSIZE(1, HMI_CONTROLSIZEX(12, 38), HMI_CONTROLSIZEY(12, 38)) '設(shè)置創(chuàng)建模板窗口鎖存通道1的鎖存大小

     SET_COLOR(RGB(0,255,0)) '指定draw指令使用的顏色
 

     ZV_LATCHCLEAR(0) '將鎖存通道0清空

     ZV_LATCH(grabImg, 0) '顯示采集圖像顯示到鎖存通道0中

     ZV_LATCH(colorSubImg, 1) '顯示模板圖像顯示到鎖存通道1中
 

     '圖像roi坐標(biāo)轉(zhuǎn)控件roi

     is_redraw = 0

     d_is_rtn_loc = 0

     TABLE(111, d_locator_roi(0), d_locator_roi(1),d_locator_roi(2),d_locator_roi(3))

     ZV_POSFROMIMG(0, 2, 111, 111) '圖像坐標(biāo)轉(zhuǎn)換到HMI控件坐標(biāo)

     HMI_SHOWWINDOW(12)
 

  END SUB
 

  '根據(jù)鼠標(biāo)操作更新定位器的區(qū)域即學(xué)習(xí)模板的有效區(qū)域

  GLOBAL SUB update_locator()
 

     if mouse_scan(21) = 1 then '掃描鼠標(biāo)按下操作

         is_set_roi_m_down = 1

         sr_mpos_x = table(21)

         sr_mpos_y = table(22)

         hit_pos = ZV_HMIADJRECT(sr_mpos_x, sr_mpos_y, 111, -1) '只有按下時可以改變擊中位置

         is_redraw = 1

         endif

         if mouse_scan(21) = -1 then '掃描鼠標(biāo)松開操作

         is_set_roi_m_down = 0

         sr_mpos_x = table(21)

         sr_mpos_y = table(22)

         ZV_HMIADJRECT(sr_mpos_x, sr_mpos_y, 111, hit_pos)

         is_redraw = 1

         endif

     if (is_set_roi_m_down and MOUSE_state(21)) then

         sr_mpos_x = table(21)

         sr_mpos_y = table(22)

         ZV_HMIADJRECT(sr_mpos_x, sr_mpos_y, 111, hit_pos)

         is_redraw = 1

     endif
 

     if (1 = is_redraw) then

         '控件roi坐標(biāo)轉(zhuǎn)圖像roi坐標(biāo)

         is_redraw = 0

         ZV_POSTOIMG(0, 2, 111, 50) 'TABLE(50)作為中間變量臨時使用

         d_locator_roi(0) = TABLE(50)

         d_locator_roi(1) = TABLE(51)

         d_locator_roi(2) = TABLE(52)

         d_locator_roi(3) = TABLE(53)

         SET_REDRAW

     endif
 

  END SUB
 

  '根據(jù)更新的鼠標(biāo)位置坐標(biāo)繪制定位器roi

  GLOBAL SUB draw_locator()

     DRAWRECT(TABLE(111), TABLE(112), TABLE(113), TABLE(114))
 

     local cx,cy

     cx = (TABLE(111) + TABLE(113)) / 2

     cy = (TABLE(112) + TABLE(114)) / 2
 

     DRAWLINE(cx-5, cy, cx+5, cy) '中心十字線

     DRAWLINE(cx, cy-5, cx, cy+5)
 

  END SUB
 

  '創(chuàng)建模板界面按下截取模板按鈕后響應(yīng)的函數(shù)

  GLOBAL SUB btn_getSubImg()

     LOCAL mod_w,mod_h

     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)
 

     ZV_IMGINFO(subImg,0)

     mod_w = TABLE(0)

     mod_h = TABLE(1)
 

     ZV_REGENRECT(modRe,0,0,mod_w, mod_h)

     ZV_LATCHCLEAR(1)

     ZV_LATCH(subImg, 1)
 

  END SUB
 

  '創(chuàng)建模板界面按下橡皮擦按鈕時響應(yīng)的函數(shù)

  GLOBAL SUB btn_sel_erase()

     ZV_LATCHSETSIZE(1, HMI_CONTROLSIZEX(13, 1), HMI_CONTROLSIZEY(13, 1)) '設(shè)置鎖存的大小

     ZV_LATCHSETSIZE(2, HMI_CONTROLSIZEX(13, 15), HMI_CONTROLSIZEY(13, 15)) '設(shè)置鎖存的大小

     SET_COLOR(RGB(0,255,0)) '設(shè)置繪制時畫筆使用的顏色

     ZV_LATCHCLEAR(1) '清空鎖存

     ZV_IMGCOPY(subImg, copy_subImg) '復(fù)制模板子圖像到copy_subImg圖像變量中

     ZV_REGION(copy_subImg, modRe, 1, 0) '在模板圖像上繪制modRe圖像的非有效區(qū)域,繪制顏色為黑色,用于掩模

     ZV_LATCH(copy_subImg, 1) '顯示復(fù)制的模板圖
 

     HMI_SHOWWINDOW(13) '打開編輯模板窗口
 

  end sub
 

  '根據(jù)鼠標(biāo)操作更新橡皮擦擦除/恢復(fù)區(qū)域的位置

  GLOBAL SUB update_eraser()

     DIM c_size_eraser '橡皮擦在控件上對應(yīng)的尺寸

     DIM eraser_pos_x,eraser_pos_y

     d_mouse_s = MOUSE_STATE(21) '鼠標(biāo)處于按下狀態(tài)時

     eraser_pos_x = TABLE(21)

     eraser_pos_y = TABLE(22)
 

     c_size_eraser = ZV_LENFROMIMG(0, d_eraser_size) '將橡皮擦的圖像尺寸轉(zhuǎn)換成控件尺寸

     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)

     '繪制以(eraser_pos_x,eraser_pos_y)為中心,2*c_size_eraser為邊長的正方形橡皮擦區(qū)域
 

     DIM hmi_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_size_eraser)and (eraser_pos_y <= HMI_CONTROLSIZEy(12, 1) - c_size_eraser) THEN

         SET_REDRAW(0,0, HMI_CONTROLSIZEX(12, 1), HMI_CONTROLSIZEY(12, 1))'重新繪制編輯模板窗口上的鎖存通道0區(qū)域

     endif
 

     if d_mouse_s = 1 and d_edit_m = 1 then '如果鼠標(biāo)處于按下狀態(tài)且編輯模板標(biāo)志=1時

         btn_pro_eraser() '執(zhí)行處理橡皮擦函數(shù)

     endif
 

  END SUB
 

  '處理橡皮擦函數(shù)

  global sub btn_pro_eraser()

     ZVOBJECT tmp_re

     TABLE(121, c_rect(0), c_rect(1))

     ZV_POSTOIMG(1, 1, 121, 121)

     ZV_REGENRECT(tmp_re, TABLE(121), TABLE(122), 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 '恢復(fù)

            ZV_REUNION(modRe, tmp_re, modRe) '計算modRe和tmp_re的并集并存放到modRe中

     endif
 

     ZV_IMGCOPY(subImg, copy_subImg) '復(fù)制模板子圖像到copy_subImg圖像變量中

     ZV_REGION(copy_subImg, modRe, 1, 0) '在模板圖像上繪制modRe圖像的非有效區(qū)域,繪制顏色為黑色,用于掩模

     ZV_LATCH(copy_subImg, 1) '顯示復(fù)制的模板圖

  end sub
 

  '更新繪制橡皮擦區(qū)域

  GLOBAL SUB draw_eraser()

     if d_edit_m = 0 then '如果編輯模板標(biāo)志

         return '返回子函數(shù),不繼續(xù)往下執(zhí)行

     endif
 

      DRAWRECT(c_rect(0), c_rect(1), c_rect(2), c_rect(3))'繪制橡皮擦區(qū)域

  END SUB
 

  '編輯模板界面按下創(chuàng)建模板按鈕時響應(yīng)的函數(shù)

  GLOBAL SUB btn_loc_creModel()

     d_is_creModel = 1

     '創(chuàng)建模板

     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) '灰度圖轉(zhuǎn)換成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)
 

     btn_loc_test()

     d_match_base_rst(0) = d_match_rst(0)

     d_match_base_rst(1) = d_match_rst(1)

     d_match_base_rst(2) = d_match_rst(2)

     d_match_base_rst(3) = d_match_rst(3)

     d_match_base_rst(4) = d_match_rst(4)

  END SUB
 

  '編輯模板界面按下確定按鈕時執(zhí)行的函數(shù)

  GLOBAL SUB btn_erase_cfm()

     ZV_LATCHCLEAR(0)

     ZV_LATCH(grabImg, 0) '顯示圖像在鎖存上

     HMI_CLOSEWINDOW(13) '關(guān)閉編輯模板窗口

  END SUB
 

  '創(chuàng)建模板界面按下測試按鈕時響應(yīng)的函數(shù)

  GLOBAL SUB btn_loc_test()

     if (d_is_creModel = 0) then

             ?"未創(chuàng)建模板!"

         return

     endif
 

  '開始匹配
 

  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行的數(shù)據(jù)到table中,table最大長度5

             if(rowr = 0) then

             if(is_ca_success = 1 AND d_use_calib=1) then

                 ZV_CALTRANSW(ca_param, TABLE(4),TABLE(5),8) '像素坐標(biāo)轉(zhuǎn)世界坐標(biāo)

                 d_match_rst(0) = TABLE(3)

                 d_match_rst(1) = TABLE(8)

                 d_match_rst(2) = TABLE(9)

                 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圖像上繪制綠色的輪廓序列

                 else

                 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

                 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

                 ZV_LATCH(colorImg, 0)

             END SUB

             '創(chuàng)建模板界面按下確定按鈕時響應(yīng)的函數(shù)

             GLOBAL SUB btn_loc_cfm()

             grab_switch = 0 '關(guān)閉補正源的連續(xù)采集

             d_is_rtn_loc = 1

             ZV_LATCHSETSIZE(0, HMI_CONTROLSIZEX(11, 1), HMI_CONTROLSIZEY(11, 1)) '設(shè)置鎖存的大小

             ZV_LATCHCLEAR(0)

             ZV_LATCH(grabImg, 0) '顯示圖像在鎖存上

             ZV_LATCH(grabImg, 1) '顯示圖像在鎖存上

             HMI_CLOSEWINDOW(12)

  END SUB

  11.參考第六篇“標(biāo)定”,添加坐標(biāo)標(biāo)定功能,添加流程如下:

  14.png

  

  '參數(shù)設(shè)置界面按下坐標(biāo)標(biāo)定按鈕時響應(yīng)的函數(shù)

  GLOBAL SUB btn_calib()
 

      ZV_LATCHSETSIZE(0, HMI_CONTROLSIZEX(14, 91), HMI_CONTROLSIZEY(14, 91)) '設(shè)置坐標(biāo)標(biāo)定窗口鎖存通道0的鎖存大小

     ZV_LATCHCLEAR(0) '將鎖存通道0清空

     ZV_LATCH(grabImg, 0) '顯示采集圖像顯示到鎖存通道0中

     HMI_SHOWWINDOW(14)
 

  END SUB
 

  '坐標(biāo)標(biāo)定界面按下提取mark點按鈕時響應(yīng)的函數(shù)

  GLOBAL SUB btn_ca_extract()

  ZVOBJECT inppts, ppts, wpts
 

  '提取像素坐標(biāo)

  ZV_CALGETSCAPTS(grabImg, inppts, d_ca_param(1), d_ca_param(2), d_ca_param(3), d_ca_param(4))

  ZV_MATINFO (inppts, 400)
 

  DIM row,col

  row = TABLE(400)

  col = TABLE(401)

  if(row * col = 18) then

      TABLE(150) = 1 '提取mark點成功

  else

     TABLE(150) = 0 '提取mark點失敗

     return

  endif
 

  '根據(jù)mrak點間距和像素坐標(biāo)計算世界坐標(biāo)

  ZV_CALGETPTSMAP(inppts,ppts,wpts,d_ca_param(5))

  ZV_MATINFO (ppts, 400)
 

  row = TABLE(400)

  col = TABLE(401)

  if(row * col = 18) then

      TABLE(150) = 1 '提取mark點成功

  else

     TABLE(150) = 0 '提取mark點失敗

     return

  endif
 

  '像素坐標(biāo)和世界坐標(biāo)放入table中

  DIM i

  FOR i=0 TO row-1

     ZV_MATGETROW (ppts, i, col, 81 + i*col)

     ZV_MATGETROW (wpts, i, col, 131 + i*col)

  NEXT
 

  '設(shè)置用于繪制mark點的圖像

  ZVOBJECT color

  ZV_GRAYTORGB(grabImg, color)
 

  '和繪制mark點的十字架

  DIM j, pixNum '像素個數(shù)

  pixNum = 0

     FOR i=0 TO 2

         FOR j=0 TO 2

             ZV_MARKER(color, TABLE(81 + 2 * pixNum), TABLE(81 + 2 * pixNum + 1), 0, 40, C_GREEN)

             pixNum = pixNum + 1

     NEXT

  NEXT
 

  '用文本繪制mark點的序號

     FOR i=0 TO 8

         ZV_TEXT (color, TOSTR(i,1,0), TABLE(81+2*i)-20, TABLE(81+2*i +1)-40, 20, C_BLUE)

     NEXT
 

     ZV_LATCH(color, 0)
 

  END SUB
 

  '坐標(biāo)標(biāo)定界面按下標(biāo)定按鈕時響應(yīng)的函數(shù)

  GLOBAL SUB btn_ca_calib()
 

     ZV_IMGINFO(grabImg,0)

     ZV_CALCAM(ppts,wpts,ca_param,TABLE(0),TABLE(1),d_ca_param(0))

     is_ca_success=1

     '計算標(biāo)定誤差

     ZV_CALERROR(ca_param, ppts, wpts, 0)

     ca_min_err = TABLE(1)

     ca_max_err = TABLE(2)

     ca_avg_err = TABLE(0)
 

  END SUB

  '坐標(biāo)標(biāo)定界面按下返回按鈕時響應(yīng)的函數(shù)

  GLOBAL SUB btn_ca_param_rtn()

      HMI_CLOSEWINDOW(14)

  END SUB
 

  12.在參數(shù)設(shè)置界面的【采集圖像】按鈕關(guān)聯(lián)動作函數(shù)名btn_grab。
 

  13.在draw.bas文件中添加點/線/圓測量器區(qū)域的更新繪制函數(shù),并在自定義元件屬性窗口中關(guān)聯(lián)刷新函數(shù)和繪制函數(shù)。
 

  '點,線,圓測量器的刷新函數(shù)

  GLOBAL SUB update_roi ()
 

      if point_status = 1 then

          SET_REDRAW '繪制第一次點擊的

          if (mouse_scan(21) = 1 ) then '掃描按下操作

              hit_pos = ZV_HMIADJRECT2(table(21), table(22), 31, -1) '只有按下時可以改變擊中位置

              is_redraw = 1

          endif
 

          if (mouse_scan(21) = -1 ) then '掃描松開操作

              ZV_HMIADJRECT2(table(21), table(22), 31, hit_pos)

              is_redraw = 1

          endif
 

          if (MOUSE_state(21)) then

              ZV_HMIADJRECT2(table(21), table(22), 31, hit_pos)

              is_redraw = 1

          endif
 

          if (1 = is_redraw) then
 

              is_redraw = 0
 

             ZV_POSTOIMG(0, 1, 31, 41)

             d_roi_rect1(0) = TABLE(41)

             d_roi_rect1(1) = TABLE(42)

             d_roi_rect1(2) = ZV_LENTOIMG(0, TABLE(33))

             d_roi_rect1(3) = ZV_LENTOIMG(0, TABLE(34))

             d_roi_rect1(4) = TABLE(35)
 

             SET_REDRAW
 

         endif
 

     elseif line_status=1 then

         SET_REDRAW '繪制第一次點擊的

         if (mouse_scan(21) = 1)then '掃描按下操作

             hit_pos = ZV_HMIADJRECT2(table(21), table(22),231, -1) '只有按下時可以改變擊中位置

             is_redraw = 1

                 endif
 

         if (mouse_scan(21) = -1) then '掃描松開操作

             ZV_HMIADJRECT2(table(21), table(22), 231, hit_pos)

             is_redraw = 1

         endif
 

         if (MOUSE_state(21)) then

             ZV_HMIADJRECT2(table(21), table(22), 231, hit_pos)

             is_redraw = 1

         endif
 

         if (1 = is_redraw) then
 

             is_redraw = 0
 

             ZV_POSTOIMG(0, 1, 231, 41)

             d_roi_rect2(0) = TABLE(41)

             d_roi_rect2(1) = TABLE(42)

             d_roi_rect2(2) = ZV_LENTOIMG(0, TABLE(233))

             d_roi_rect2(3) = ZV_LENTOIMG(0, TABLE(234))

             d_roi_rect2(4) = TABLE(235)

             SET_REDRAW
 

         endif

         elseif circle_status=1 then

                 SET_REDRAW

                 is_redraw = 0

                 if (mouse_scan(21) = 1 AND TABLE(21)>0 AND TABLE(21)0 AND TABLE(22)

                     hit_pos = ZV_HMIADJARC(table(21), table(22), 551, -1) '只有按下時可以改變擊中位置

                     is_redraw = 1

                 endif
 

                 if (mouse_scan(21) = -1 AND TABLE(21)>0 AND TABLE(21)0 AND TABLE(22)

                     ZV_HMIADJARC(table(21), table(22), 551, hit_pos)

                     is_redraw = 1

                 endif
 

                 if (MOUSE_state(21)) then

                     ZV_HMIADJARC(table(21), table(22), 551, hit_pos)

                     is_redraw = 1

                 endif

                 if (1 = is_redraw) then

                 is_redraw = 0
 

                 '控件坐標(biāo)轉(zhuǎn)圖像坐標(biāo)

                 ZV_POSTOIMG(0, 1, 551, 61)

                 TABLE(63) = ZV_LENTOIMG(0, TABLE(553))

                 TABLE(64) = ZV_LENTOIMG(0, TABLE(554))

                 TABLE(65, TABLE(555), TABLE(556))

                 d_roi_arc(0) = TABLE(61)

                 d_roi_arc(1) = TABLE(62)

                 d_roi_arc(2) = TABLE(63)

                 d_roi_arc(3) = TABLE(64)

                 d_roi_arc(4) = TABLE(65)

                 d_roi_arc(5) = TABLE(66)

                 SET_REDRAW
 

         endif

     else

         SET_REDRAW

     endif
 

  END SUB
 

  '點,線,圓的繪制函數(shù)

  GLOBAL SUB draw_roi()
 

     if point_status = 1 and line_status=0 and circle_status=0 then

         SET_COLOR(C_BLUE)

         ZV_HMIRECT2(31, 300)

         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))

     endif
 

     if line_status=1 and point_status=0 and circle_status=0 then

     SET_COLOR(C_BLUE)

     TABLE(236,d_line_param(4),d_line_param(5)) '測量器掃描數(shù)量和寬度

     ZV_HMIRECT2(231, 350)

     DRAWLINE(TABLE(350), TABLE(351), TABLE(352), TABLE(353)) '外矩形

     DRAWLINE(TABLE(352), TABLE(353), TABLE(354), TABLE(355))

     DRAWLINE(TABLE(354), TABLE(355), TABLE(356), TABLE(357))

     DRAWLINE(TABLE(356), TABLE(357), TABLE(350), TABLE(351))
 

     DRAWLINE(TABLE(358), TABLE(359), TABLE(360), TABLE(361)) '方向箭頭

     DRAWLINE(TABLE(362), TABLE(363), TABLE(360), TABLE(361))

     DRAWLINE(TABLE(364), TABLE(365), TABLE(360), TABLE(361))
 

     if (0 = TABLE(366)) then return
 

     SET_COLOR(C_GREEN)

     DIM idx

     for idx = 0 to TABLE(366)-1

         DRAWLINE(TABLE(367+idx*4), TABLE(368+idx*4), TABLE(369+idx*4), TABLE(370+idx*4))

     next
 

     endif

  if circle_status=1 and line_status=0 and point_status=0 then
 

     SET_COLOR(C_BLUE)

     TABLE(557) = d_circle_parm(4) '子區(qū)域的個數(shù)

     TABLE(558) = d_circle_parm(5) '子區(qū)域?qū)挾?/p>

     ZV_HMIARC(551, 400) '繪制圓環(huán)
 

     '繪制圓弧

     DRAWARC(TABLE(400), TABLE(401), TABLE(402), TABLE(404), TABLE(405)) '內(nèi)半徑

     DRAWARC(TABLE(400), TABLE(401), TABLE(403), TABLE(404), TABLE(405)) '外半徑

     DRAWLINE(TABLE(400), TABLE(401)-5, TABLE(400), TABLE(401)+5)

     DRAWLINE(TABLE(400)-5, TABLE(401), TABLE(400)+5, TABLE(401))

     '繪制邊界線
 

     DIM idx

     for idx = 0 to TABLE(406)-1
 

         DRAWLINE(TABLE(407+idx*4), TABLE(408+idx*4), TABLE(409+idx*4), TABLE(410+idx*4))

     next
 

     SET_COLOR(C_GREEN)

     DIM startid

     startid = 407+TABLE(406)*4

     for idx = 0 to TABLE(startid)-1

     DRAWLINE(TABLE(startid+1+idx*4), TABLE(startid+2+idx*4), TABLE(startid+3+idx*4), TABLE(startid+4+idx*4))

     next

  endif

  END SUB
 

  14.在main.bas文件中添加參數(shù)設(shè)置界面按下【點測試】按鈕時響應(yīng)的函數(shù),并關(guān)聯(lián)動作函數(shù)名。

  '參數(shù)界面按下點測量按鈕時響應(yīng)的函數(shù)

  GLOBAL SUB btn_meas_p()

     Point_measure()

     ZV_GRAYTORGB(grabImg, latch) '在繪制圖形前需要先將灰度圖轉(zhuǎn)成RGB圖

     ZV_MARKER(latch, draw_point(0), draw_point(1), 0, 20, C_GREEN) '繪制標(biāo)志點

     ZV_LATCH(latch,0)'顯示圖像結(jié)果

  END SUB
 

  '測量點的實現(xiàn)子函數(shù)

  GLOBAL SUB Point_measure()

      ZVOBJECT mr_p, tmp
 

  if d_use_locator=0 then '如果沒有使用補正源

          '生成矩形測量器

      ZV_MRGENRECT2(mr_p, d_roi_rect1(0), d_roi_rect1(1),d_roi_rect1(2), d_roi_rect1(3),d_roi_rect1(4), 1)

  endif

  '檢測點

      ZV_MRPOS(mr_p, grabImg,tmp,d_point_param(3),d_point_param(2),d_point_param(0),d_point_param(1))

     '獲取矩陣對應(yīng)行的數(shù)據(jù)

      ZV_MATGETROW(tmp, 0, 3, 386)

          '賦值結(jié)果變量,用于繪制圖形

      draw_point(0)=TABLE(386)

      draw_point(1)=TABLE(387)
 

     if d_use_calib=1 and is_ca_success=1 then '如果使用標(biāo)定功能且已經(jīng)標(biāo)定成功

         ZV_CALTRANSW(ca_param, TABLE(386),TABLE(387),386) '像素坐標(biāo)轉(zhuǎn)世界坐標(biāo)

     endif

  '賦值結(jié)果變量,用于顯示數(shù)據(jù)結(jié)果

  point_result(0)=TABLE(386)

  point_result(1)=TABLE(387)

  END SUB

  

  15.png

  

  15.在main.bas文件中添加參數(shù)設(shè)置界面按下【線測試】按鈕時響應(yīng)的函數(shù),并關(guān)聯(lián)動作函數(shù)名。

  參數(shù)界面按下線測量按鈕時響應(yīng)的函數(shù)

  GLOBAL SUB btn_meas_l()

         btn_ml_test()

     ZV_GRAYTORGB(grabImg, latch)'在繪制圖形前需要先將灰度圖轉(zhuǎn)成RGB圖

     ZV_LINE(latch,draw_line(0),draw_line(1),draw_line(2),draw_line(3),zv_color(0,255,0)) '繪制線

     ZV_LATCH(latch,0)'顯示圖像結(jié)果
 

  END SUB
 

  '測量直線的實現(xiàn)子函數(shù)

  GLOBAL SUB btn_ml_test()
 

      ZVOBJECT mr_l, tmp
 

     if d_use_locator=0 then '如果沒有使用補正源

             '生成直線測量器

         ZV_MRGENLINE(mr_l,d_roi_rect2(0), d_roi_rect2(1),d_roi_rect2(2), d_roi_rect2(3), d_roi_rect2(4), 1,d_line_param(4),d_line_param(5))

     endif

     '設(shè)置測量器區(qū)域的高級參數(shù),包括濾波尺寸、邊緣閾值、邊緣極性和邊緣位置

     ZV_MRSETADV(mr_l, d_line_param(3), d_line_param(2), d_line_param(0),d_line_param(1))

     '初始化結(jié)果數(shù)組

     TABLE(486, 0, 0, 0, 0)

     '檢測直線,并將結(jié)果賦值給起始地址為486的數(shù)組

     ZV_MRLINE(mr_l, grabImg, tmp, 486)

     '賦值結(jié)果變量,用于繪制圖形

     draw_line(0)=TABLE(486)

     draw_line(1)=TABLE(487)

     draw_line(2)=TABLE(488)

     draw_line(3)=TABLE(489)
 

     if d_use_calib=1 and is_ca_success=1 then '如果使用標(biāo)定功能且已經(jīng)標(biāo)定成功

         ZV_CALTRANSW(ca_param, TABLE(486),TABLE(487),486) '像素坐標(biāo)轉(zhuǎn)世界坐標(biāo)

         ZV_CALTRANSW(ca_param, TABLE(488),TABLE(489),488) '像素坐標(biāo)轉(zhuǎn)世界坐標(biāo)

     endif
 

     '賦值結(jié)果變量,用于顯示數(shù)據(jù)結(jié)果

     line_result(0)=TABLE(486)

     line_result(1)=TABLE(487)

     line_result(2)=TABLE(488)

     line_result(3)= TABLE(489)
 

  END SUB

  

  16.png

  

  16.添加在main.bas文件中添加參數(shù)設(shè)置界面按下【圓測試】按鈕時響應(yīng)的函數(shù),并關(guān)聯(lián)動作函數(shù)名。

  '參數(shù)界面按下圓測量按鈕時響應(yīng)的函數(shù)

  GLOBAL SUB btn_meas_c()

             btn_mc_test()'測量圓實現(xiàn)子函數(shù)

         ZV_GRAYTORGB(grabImg, latch)'在繪制圖形前需要先將灰度圖轉(zhuǎn)成RGB圖

         ZV_CIRCLE(latch, draw_circle(0),draw_circle(1),draw_circle(2), C_GREEN)'繪制圓

         ZV_LATCH(latch,0)'顯示圖像結(jié)果
 

  END SUB
 

  '測量圓的實現(xiàn)子函數(shù)

  GLOBAL SUB btn_mc_test()'測量圓
 

  ZVOBJECT mr_c, tmp

  if d_use_locator=0 then

     '生成環(huán)形測量器

     ZV_MRGENCIRCLE(mr_c,d_roi_arc(0), d_roi_arc(1), d_roi_arc(2), d_roi_arc(3),d_roi_arc(4),d_roi_arc(5), 1, d_circle_parm(4),d_circle_parm(5))

  endif
 

  '設(shè)置測量參數(shù),包括濾波尺寸、邊緣閾值、邊緣極性和邊緣位置

  ZV_MRSETADV(mr_c,d_circle_parm(3), d_circle_parm(2), d_circle_parm(0),d_circle_parm(1))
 

  '初始化結(jié)果數(shù)組

  TABLE(586, 0, 0, 0)

  '測量圓,并將結(jié)果賦值給起始地址為586的數(shù)組

  ZV_MRCIRCLE(mr_c, grabImg, tmp, 586)
 

  '賦值結(jié)果變量,用于繪制圖形

  draw_circle(0)=TABLE(586)

  draw_circle(1)=TABLE(587)

  draw_circle(2)=TABLE(588)

  if d_use_calib=1 and is_ca_success=1 then '如果使用標(biāo)定功能且已經(jīng)標(biāo)定成功
 

         ZV_CALTRANSW(ca_param, TABLE(586),TABLE(587),590) '像素坐標(biāo)轉(zhuǎn)世界坐標(biāo)

         ZV_CALTRANSW(ca_param, TABLE(586)+TABLE(588),TABLE(587),592) '圓心加半徑的坐標(biāo)
 

         '賦值標(biāo)定結(jié)果變量,用于顯示數(shù)據(jù)結(jié)果

         circle_result(0)=TABLE(590)

         circle_result(1)=TABLE(591)

         '半徑等于圓心點和圓上的點之間的距離

         circle_result(2)=ZV_DISTPP(TABLE(590),TABLE(591),TABLE(592),TABLE(593))
 

         ZV_LATCH(grabImg, 0)
 

         RETURN

     endif
 

     '賦值像素結(jié)果變量,用于顯示數(shù)據(jù)結(jié)果

     circle_result(0)=TABLE(586)

     circle_result(1)=TABLE(587)

     circle_result(2)=TABLE(588)
 

  END SUB

  17.png

  

  17.在main.bas文件中添加參數(shù)設(shè)置界面按下【返回運行界面】按鈕時響應(yīng)的函數(shù),并關(guān)聯(lián)動作函數(shù)名。

  '參數(shù)設(shè)置界面按下返回運行界面按鈕時響應(yīng)的函數(shù)

  GLOBAL SUB btn_goto_main()

      HMI_CLOSEWINDOW(11)

  END SUB

  18.png

  

  18.添加在運行界面按下【測試】按鈕時響應(yīng)的函數(shù),并關(guān)聯(lián)動作函數(shù)名。

  '運行界面按下測試按鈕時響應(yīng)的函數(shù)

     GLOBAL SUB btn_test()
 

         TICKS=0'開始計時

     if(d_use_locator=1) then '如果使用補正源
 

         btn_loc_test() '定位

     endif
 

     btn_measure_test() '測量點/線/圓

     d_detect_time=ABS(TICKS)'計算檢測消耗時間

  END SUB
 

  '運行界面按下測試按鈕時響應(yīng)的函數(shù)

  GLOBAL SUB btn_test()
 

         TICKS=0'開始計時

     if(d_use_locator=1) then '如果使用補正源

         btn_loc_test() '定位
 

     endif
 

     btn_measure_test() '測量點/線/圓

     d_detect_time=ABS(TICKS)'計算檢測消耗時間

  END SUB
 

  '點線圓同時測試子函數(shù)

  GLOBAL SUB btn_measure_test()
 

     if d_use_locator=1 then '如果使用補正源
 

         '初始化測量器

         ZV_MRGENRECT2(mr_p, d_roi_rect1(0), d_roi_rect1(1),d_roi_rect1(2), d_roi_rect1(3),d_roi_rect1(4), 1)

         ZV_MRGENLINE(mr_l,d_roi_rect2(0), d_roi_rect2(1),d_roi_rect2(2), d_roi_rect2(3), d_roi_rect2(4), 1,d_line_param(4),d_line_param(5))

         ZV_MRGENCIRCLE(mr_c,d_roi_arc(0), d_roi_arc(1), d_roi_arc(2), d_roi_arc(3),d_roi_arc(4),d_roi_arc(5), 1, d_circle_parm(4),d_circle_parm(5))
 

         '計算剛性變換矩陣

         ZV_GETRIGIDVECTOR(mat_rigid2, d_match_base_rst(1), d_match_base_rst(2), d_match_base_rst(3),TABLE(4),TABLE(5), d_match_rst(3))

         ZV_MRCORRECT (mr_p, mat_rigid2, mr_p) '點測量器補正

         ZV_MRCORRECT (mr_l, mat_rigid2, mr_l) '線測量器補正

         ZV_MRCORRECT (mr_c, mat_rigid2, mr_c) '圓測量器補正
 

     endif

     Point_measure() '測量點

     btn_ml_test() '測量線

     btn_mc_test() '測量圓

     ZV_GRAYTORGB(grabImg, latch)

     ZV_MARKER(latch, draw_point(0), draw_point(1), 0, 20, C_BLUE)

     ZV_LINE(latch,draw_line(0),draw_line(1),draw_line(2),draw_line(3),C_BLUE)

     ZV_CIRCLE(latch, draw_circle(0),draw_circle(1),draw_circle(2), C_BLUE)

     ZV_LATCH(latch,0)
 

  END SUB

  19.png

  

  19.添加在運行界面按下【運行】按鈕時響應(yīng)的函數(shù),并關(guān)聯(lián)動作函數(shù)名。

  '運行界面按下運行按鈕時響應(yīng)的函數(shù)

  GLOBAL SUB btn_run()
 

     if (1 = main_task_state) then

         if (0 = PROC_STATUS(main_task_id)) then

             main_task_state = 2

             RUNTASK main_task_id, main_task

         endif

     endif
 

  END SUB
 

  '主任務(wù)執(zhí)行的函數(shù)

  main_task:

     while(1)

         if (3 = main_task_state) then

             main_task_state = 1

             exit while

         endif
 

         '持續(xù)采集圖像,對圖像進行操作

         btn_grab()

         btn_test()
 

     wend

  END

  20.png

  

  20.添加在運行界面按下【停止】按鈕時響應(yīng)的函數(shù),并關(guān)聯(lián)動作函數(shù)名。

  '運行界面按下停止按鈕時響應(yīng)的函數(shù)

  GLOBAL SUB btn_stop()
 

     if (2 = main_task_state) then

                     main_task_state = 3

     endif
 

  END SUB

  21.png

  

  八、仿真效果

  22.png

  23.png

  24.png

  25.png

  26.png

  本次,正運動技術(shù)VPLC系列機器視覺運動控制一體機快速入門(八)——測量點/直線/圓,就分享到這里,更多精彩內(nèi)容請關(guān)注“正運動小助手”公眾號。

  本文由正運動技術(shù)原創(chuàng),歡迎大家轉(zhuǎn)載,共同學(xué)習(xí),一起提高中國智能制造水平。文章版權(quán)歸正運動技術(shù)所有,如有轉(zhuǎn)載請注明文章來源。

  正運動技術(shù)專注于運動控制技術(shù)研究和通用運動控制軟硬件產(chǎn)品的研發(fā),是國家級高新技術(shù)企業(yè)。正運動技術(shù)匯集了來自華為、中興等公司的優(yōu)秀人才,在堅持自主創(chuàng)新的同時,積極聯(lián)合各大高校協(xié)同運動控制基礎(chǔ)技術(shù)的研究,是國內(nèi)工控領(lǐng)域發(fā)展最快的企業(yè)之一,也是國內(nèi)少有、完整掌握運動控制核心技術(shù)和實時工控軟件平臺技術(shù)的企業(yè)。主要業(yè)務(wù)有:運動控制卡_運動控制器_EtherCAT運動控制卡_EtherCAT控制器_運動控制系統(tǒng)_視覺控制器__運動控制PLC_運動控制_機器人控制器_視覺定位_XPCIe/XPCI系列運動控制卡等等。

版權(quán)所有 中華工控網(wǎng) Copyright?2024 Gkong.com, All Rights Reserved