<style id="7i3y3"></style>

      <sub id="7i3y3"><i id="7i3y3"></i></sub>

        午夜精品一区二区三区成人,中文字幕av一区二区,亚洲AVAV天堂AV在线网阿V,肥臀浪妇太爽了快点再快点,国产网友愉拍精品视频手机,国产精品无码a∨麻豆,久久中文字幕一区二区,a级国产乱理伦片在线观看al
        首頁 新聞 工控搜 論壇 廠商論壇 產品 方案 廠商 人才 文摘 下載 展覽
        中華工控網首頁
          P L C | 變頻器與傳動 | 傳感器 | 現場檢測儀表 | 工控軟件 | 人機界面 | 運動控制
          D C S | 工業以太網 | 現場總線 | 顯示調節儀表 | 數據采集 | 數傳測控 | 工業安全
          電 源 | 嵌入式系統 | PC based | 機柜箱體殼體 | 低壓電器 | 機器視覺
        VPLC系列機器視覺運動控制一體機快速入門(八)測量點/線/圓
        深圳市正運動技術有限公司
        收藏本文     查看收藏

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

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

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

          2.png

          一、檢測原理

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

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

          3.png

         二、測量點/線/圓特點

          1.實現簡單

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

          2.需要位置跟隨

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

          4.png

          三、量點應用場景

          1.精準定位

          檢測特征邊緣點的位置并輸出對應坐標可實現精準定位,常配合匹配(粗定位)使用。

          2.擬合直線

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

          四、測量線應用場景

          1.精準定位

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

          2.檢測直線度

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

          3.測量尺寸

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

          五、測量圓應用場景

          1.測量圓

          測量圓形特征,得出圓形的圓心、半徑等數據。

          2.定位

          通過測量圓的特征輸出圓心位置坐標數據做精準定位,常配合匹配(粗定位)使用。

          3.九點標定

          可通過檢測實心圓矩陣標定板上的九個圓心的圖像坐標數據,和標定板對應的世界坐標數據計算出標定系數。

          5.png

          測量點/線/圓流程圖

          六、實例演示

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

          6.png

          2.設計運行界面,運行界面只進行采集圖像操作和檢測執行操作,并顯示數據結果。

          7.png

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

          '''''全局變量大部分使用數組結構'''''

          ''注:basic編程中很多函數會以TABLE(系統的數據結構)做為參數

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

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

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

          ''table 21-22,表示鼠標按鍵控件坐標系

          ''table 31-35,表示控件坐標轉換后對應的圖像坐標

          ''table 111-114,表示定位器區域roi參數,屬于控件坐標系

          ''table 121-124,表示橡皮擦區域roi參數,屬于控件坐標系

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

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

          '***********定義程序任務相關變量**********************
         

          '主任務狀態

          '0 - 未初始化

          '1 - 停止

          '2 - 運行中

          '3 - 正在停止

          GLOBAL DIM main_task_state

          main_task_state = 1
         

          '是否標定

          global is_ca_success
         

          '運行任務開關

          GLOBAL DIM run_switch

          run_switch = 0
         

          '采集任務開關

          '0 - 停止采集

          '1 - 請求采集

          GLOBAL DIM grab_switch

          grab_switch = 0
         

          '定位檢測主任務id - 10

          GLOBAL DIM main_task_id

          main_task_id = 10
         

          '相機連續采集線程id - 7

          GLOBAL DIM grab_task_id

          grab_task_id = 7
         

          '***********結束定義程序任務相關變量******************
         

          '***********定義相機采集相關變量**********************
         

          '相機種類,"",此處使用海康相機-"mvision"

          GLOBAL DIM CAMERA_TYPE(100)

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

          CAMERA_TYPE = "mvision"
         

          '相機個數

          GLOBAL cam_num

          cam_num = 0
         

          '相機模式,-1 連續采集,0-觸發采集

          GLOBAL cam_mode

          cam_mode = 0
         

          '***********結束定義相機采集相關變量******************
         

          '定義返回主界面標志,1-已返回,0-未返回

          GLOBAL DIM d_is_rtn_loc

          d_is_rtn_loc = 1
         

          '***********定義模板相關變量*************************
         

          '定義創建模板標志位,1-已創建模板,0-未創建模板

          GLOBAL DIM d_is_creModel

          d_is_creModel = 0
         

          '學習模板參數,starAngle、endAngle、minScale、maxScale、thresh、numlevel、reduce、angleStep、scaleStep

          GLOBAL DIM d_mod_param(9)
         

          '***********結束定義模板相關變量**********************
         

          '***********定義編輯模板相關變量*********************
         

          '定義編輯模板標志,0-表示不編輯模板,1-表示編輯模板

          GLOBAL DIM d_edit_m

          d_edit_m = 0
         

          '定義使用橡皮擦功能標志,0-表示恢復擦除的區域,1-表示擦除區域

          GLOBAL DIM d_isMask_m

          d_isMask_m = 1
         

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

          GLOBAL DIM d_locator_roi(4),d_eraser_roi(4)
         

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

          GLOBAL DIM d_eraser_size

          d_eraser_size = 5
         

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

          GLOBAL DIM c_rect(4)
         

          '定義鼠標狀態標志,0-表示鼠標處于松開狀態,1-表示鼠標處于按下狀態

          GLOBAL DIM d_mouse_s

          d_mouse_s = 0
         

          '***********結束定義編輯模板相關變量******************
         

          '***********定義匹配檢測相關變量*********************
         

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

          GLOBAL DIM d_match_param(7)
         

          '定義學習模板的roi參數和橡皮擦的roi參數,依次是矩形左上角和右下角圖像坐標x、y、x、y

          GLOBAL DIM d_locator_roi(4),d_eraser_roi(4)
         

          '匹配結果,score、x、y、angle、scale, 目前對于多目標匹配也只存第一個目標

          GLOBAL DIM d_match_rst(5)
         

          '***********結束定義匹配檢測相關變量******************
         

          '定義程序執行過程中緩存中間圖片和結果圖片的變量

          GLOBAL ZVOBJECT grabImg

          GLOBAL ZVOBJECT subImg,copy_subImg,colorSubImg, s_mod

          GLOBAL ZVOBJECT modRe
         

          '***********定義坐標標定相關變量*********************

          '定義是否使用標定功能標志,0-不使用標定功能,1-使用標定功能

          GLOBAL DIM d_use_calib

          d_use_calib = 0
         

          '定義標定成功標志,0-標定未成功,1-標定成功

          GLOBAL DIM d_calib_success

          d_calib_success = 0
         

          '標定參數

          GLOBAL ZVOBJECT ca_param
         

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

          GLOBAL DIM d_ca_param(6) 'd開頭表示數據結構
         

          '標定誤差,最小誤差、最大誤差、平均誤差

          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)
         

          '標定矩陣

          GLOBAL ZVOBJECT ca_mat

          '***********結束定義坐標標定相關變量******************
         

          '***********定義測量點/線/圓相關變量******************

          '定義檢測消耗時間

          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
         

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

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

          '繪制結果參數

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

          '***********結束定義測量點/線/圓相關變量**************

          '定義點測量器區域/線測量器區域/圓測量器區域

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

          '設置創建模板的基準坐標

          GLOBAL DIM d_match_base_rst(5)
         

          GLOBAL ZVOBJECT mat_rigid,latch '
         

          '**********************點線圓測量數據結果*****************

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

          '***********定義讀取本地文件功能相關變量**************

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

          '定義是否使用本地圖片標志

          GLOBAL DIM d_use_imgfile
         

          '定義本地圖片索引

          GLOBAL DIM d_index
         

          '定義讀取圖片的路徑

          GLOBAL DIM File_Name(100)
         

          '***********結束定義讀取本地文件功能相關變量**********

          RUN "Hmi1.hmi",1

          

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

          end
         

          GLOBAL SUB init_meas_param() '初始化參數
         

             '初始化定位器roi參數

             d_locator_roi(0) = 240 '左上角x

             d_locator_roi(1) = 180 '左上角y

             d_locator_roi(2) = 400 '右下角x

             d_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_param(7) = 0 '默認角度步長

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

             '初始化匹配測量參數

             d_match_param(0) = 50 '最小分數

             d_match_param(1) = 1 '匹配個數

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

             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 '位置X

             d_match_rst(2) = 0 '位置Y

             d_match_rst(3) = 0 '角度

             d_match_rst(4) = 0 '比例
         

             '點的測量參數初始化

             d_point_param(0)=0

             d_point_param(1)=0

             d_point_param(2)=30

             d_point_param(3)=5
         

             '線的測量參數初始化

             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
         

             '圓的測量參數初始化

             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
         

             '初始化坐標標定相關的變量

             d_ca_param(0) = 0 '標定類型

             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 '世界坐標點間距

             ca_min_err = 0 '最小誤差

             ca_max_err = 0 '最大誤差

             ca_avg_err = 0 '平均誤差
         

             d_detect_time = 0

             d_use_locator = 0 '默認不使用補正源

             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.在運行界面中關聯相關變量。

          8.png

          6.在main.bas文件中添加運行界面初始化函數,并關聯HMI界面初始化函數名。

          '運行界面初始化函數,上電執行一次

          GLOBAL SUB hmi_init()
         

             grab_switch = 0 '初始化采集任務開關,不開啟采集任務

             main_task_state = 1 '初始化定位檢測主任務狀態為停止狀態1

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

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

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

             init_meas_param() '初始化測量參數
         

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

             '定義匹配中間結果變量

             ZVOBJECT contlist1, tsContlist1, mat_rigid1

             ZVOBJECT contlist2, tsContlist2, mat_rigid2
         

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

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

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

          END SUB

          

          9.png

          

          7.在camera.bas文件中添加采集相關按鈕的功能函數,并關聯動作函數名。

          end
         

          '主界面按下掃描相機按鈕時響應的函數

             GLOBAL SUB cam_scan_all()
         

                 if(d_use_imgfile=1)then

                     ?"請先按下使用本地圖片按鈕關閉該功能"

                 return

             endif
         

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

             ZV_SETSYSSTR("DataDir","")
         

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

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

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

                 ? "未找到相機"
         

                 return '退出子函數,不往下執行

             endif

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

                 cam_mode = 0 '設置軟觸發采集
         

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

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

             CAM_SETMODE(cam_mode) '設置軟件觸發模式

             CAM_START(0) '開啟相機
         

          END SUB
         

          '主界面按下單次采集按鈕執行的函數

          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

             ''讀取本地圖片功能結束
         

                 if cam_num = 0 then

                     ?"請先掃描相機!"

                 return

             endif
         

             CAM_SETPARAM("TriggerSoftware", 0) '發送觸發指令

             CAM_GET(grabImg, 0) '獲取一幀圖像存放到grabImg變量中

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

          END SUB
         

          '主界面按下連續采集按鈕響應的函數

          GLOBAL SUB btn_cgrab()

             if grab_switch =1 then '如果已經處于連續執行狀態,打印提示信息并退出函數

                 ?"正在連續運行中,請勿重復操作!"

             return

          endif
         

          if( d_use_imgfile =0) then
         

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

                     ?"請先掃描相機!"

                 return

                     endif

          endif
         

             grab_switch = 1 '采集任務開關置1

             if (1 = grab_switch) then

                 if (0 = PROC_STATUS(grab_task_id)) then

                     RUNTASK grab_task_id, grab_task '開啟連續采集任務

                 endif

             endif
         

          END SUB
         

          '采集任務實現函數

          grab_task:

             while(1)

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

                     exit while '退出循環

                 endif
         

                 '重復執行以下操作

                 btn_grab()

             wend

          END
         

          '主界面按下停止采集按鈕響應的函數

          GLOBAL SUB btn_stopCgrab()

             if grab_switch =0 then '如果已經處于停止采集狀態,打印提示信息并退出函數

                 ?"未開啟連續采集!"

             return

          endif
         

              grab_switch = 0 '將采集任務開關置0

          END SUB

          10.png

          

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

          11.png

          

          9.添加在運行界面按下【參數設置】按鈕時響應的函數,并關聯動作函數名。

          '運行界面按下參數設置按鈕時響應的函數

          GLOBAL SUB btn_set_param()
         

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

             ZV_LATCHCLEAR(0)

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

             HMI_SHOWWINDOW(11)
         

          END SUB

          

          12.png

          

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

          13.png

          

          end
         

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

          DIM is_redraw '繪圖標志,0表示未進行繪制,1表示正在進行繪制

          is_redraw = 0
         

          DIM sr_mpos_x, sr_mpos_y, hit_pos
         

          '主界面按下學習模板按鈕時響應的函數

          GLOBAL SUB btn_sel_loc()

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

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

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

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

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

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

             '圖像roi坐標轉控件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) '圖像坐標轉換到HMI控件坐標

             HMI_SHOWWINDOW(12)
         

          END SUB
         

          '根據鼠標操作更新定位器的區域即學習模板的有效區域

          GLOBAL SUB update_locator()
         

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

                 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 '掃描鼠標松開操作

                 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坐標轉圖像roi坐標

                 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
         

          '根據更新的鼠標位置坐標繪制定位器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
         

          '創建模板界面按下截取模板按鈕后響應的函數

          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
         

          '創建模板界面按下橡皮擦按鈕時響應的函數

          GLOBAL SUB btn_sel_erase()

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

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

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

             ZV_LATCHCLEAR(1) '清空鎖存

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

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

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

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

          end sub
         

          '根據鼠標操作更新橡皮擦擦除/恢復區域的位置

          GLOBAL SUB update_eraser()

             DIM c_size_eraser '橡皮擦在控件上對應的尺寸

             DIM eraser_pos_x,eraser_pos_y

             d_mouse_s = MOUSE_STATE(21) '鼠標處于按下狀態時

             eraser_pos_x = TABLE(21)

             eraser_pos_y = TABLE(22)
         

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

             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為邊長的正方形橡皮擦區域
         

             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區域

             endif
         

             if d_mouse_s = 1 and d_edit_m = 1 then '如果鼠標處于按下狀態且編輯模板標志=1時

                 btn_pro_eraser() '執行處理橡皮擦函數

             endif
         

          END SUB
         

          '處理橡皮擦函數

          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 '恢復

                    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
         

          '編輯模板界面按下創建模板按鈕時響應的函數

          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)
         

             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
         

          '編輯模板界面按下確定按鈕時執行的函數

          GLOBAL SUB btn_erase_cfm()

             ZV_LATCHCLEAR(0)

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

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

          END SUB
         

          '創建模板界面按下測試按鈕時響應的函數

          GLOBAL SUB btn_loc_test()

             if (d_is_creModel = 0) then

                     ?"未創建模板!"

                 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行的數據到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) '像素坐標轉世界坐標

                         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

                     '創建模板界面按下確定按鈕時響應的函數

                     GLOBAL SUB btn_loc_cfm()

                     grab_switch = 0 '關閉補正源的連續采集

                     d_is_rtn_loc = 1

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

                     ZV_LATCHCLEAR(0)

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

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

                     HMI_CLOSEWINDOW(12)

          END SUB

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

          14.png

          

          '參數設置界面按下坐標標定按鈕時響應的函數

          GLOBAL SUB btn_calib()
         

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

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

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

             HMI_SHOWWINDOW(14)
         

          END SUB
         

          '坐標標定界面按下提取mark點按鈕時響應的函數

          GLOBAL SUB btn_ca_extract()

          ZVOBJECT inppts, ppts, wpts
         

          '提取像素坐標

          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
         

          '根據mrak點間距和像素坐標計算世界坐標

          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
         

          '像素坐標和世界坐標放入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
         

          '設置用于繪制mark點的圖像

          ZVOBJECT color

          ZV_GRAYTORGB(grabImg, color)
         

          '和繪制mark點的十字架

          DIM j, pixNum '像素個數

          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
         

          '坐標標定界面按下標定按鈕時響應的函數

          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

             '計算標定誤差

             ZV_CALERROR(ca_param, ppts, wpts, 0)

             ca_min_err = TABLE(1)

             ca_max_err = TABLE(2)

             ca_avg_err = TABLE(0)
         

          END SUB

          '坐標標定界面按下返回按鈕時響應的函數

          GLOBAL SUB btn_ca_param_rtn()

              HMI_CLOSEWINDOW(14)

          END SUB
         

          12.在參數設置界面的【采集圖像】按鈕關聯動作函數名btn_grab。
         

          13.在draw.bas文件中添加點/線/圓測量器區域的更新繪制函數,并在自定義元件屬性窗口中關聯刷新函數和繪制函數。
         

          '點,線,圓測量器的刷新函數

          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
         

                         '控件坐標轉圖像坐標

                         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
         

          '點,線,圓的繪制函數

          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)) '測量器掃描數量和寬度

             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) '子區域的個數

             TABLE(558) = d_circle_parm(5) '子區域寬度

             ZV_HMIARC(551, 400) '繪制圓環
         

             '繪制圓弧

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

             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文件中添加參數設置界面按下【點測試】按鈕時響應的函數,并關聯動作函數名。

          '參數界面按下點測量按鈕時響應的函數

          GLOBAL SUB btn_meas_p()

             Point_measure()

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

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

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

          END SUB
         

          '測量點的實現子函數

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

             '獲取矩陣對應行的數據

              ZV_MATGETROW(tmp, 0, 3, 386)

                  '賦值結果變量,用于繪制圖形

              draw_point(0)=TABLE(386)

              draw_point(1)=TABLE(387)
         

             if d_use_calib=1 and is_ca_success=1 then '如果使用標定功能且已經標定成功

                 ZV_CALTRANSW(ca_param, TABLE(386),TABLE(387),386) '像素坐標轉世界坐標

             endif

          '賦值結果變量,用于顯示數據結果

          point_result(0)=TABLE(386)

          point_result(1)=TABLE(387)

          END SUB

          

          15.png

          

          15.在main.bas文件中添加參數設置界面按下【線測試】按鈕時響應的函數,并關聯動作函數名。

          參數界面按下線測量按鈕時響應的函數

          GLOBAL SUB btn_meas_l()

                 btn_ml_test()

             ZV_GRAYTORGB(grabImg, latch)'在繪制圖形前需要先將灰度圖轉成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)'顯示圖像結果
         

          END SUB
         

          '測量直線的實現子函數

          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

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

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

             '初始化結果數組

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

             '檢測直線,并將結果賦值給起始地址為486的數組

             ZV_MRLINE(mr_l, grabImg, tmp, 486)

             '賦值結果變量,用于繪制圖形

             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 '如果使用標定功能且已經標定成功

                 ZV_CALTRANSW(ca_param, TABLE(486),TABLE(487),486) '像素坐標轉世界坐標

                 ZV_CALTRANSW(ca_param, TABLE(488),TABLE(489),488) '像素坐標轉世界坐標

             endif
         

             '賦值結果變量,用于顯示數據結果

             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文件中添加參數設置界面按下【圓測試】按鈕時響應的函數,并關聯動作函數名。

          '參數界面按下圓測量按鈕時響應的函數

          GLOBAL SUB btn_meas_c()

                     btn_mc_test()'測量圓實現子函數

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

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

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

          END SUB
         

          '測量圓的實現子函數

          GLOBAL SUB btn_mc_test()'測量圓
         

          ZVOBJECT mr_c, tmp

          if d_use_locator=0 then

             '生成環形測量器

             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
         

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

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

          '初始化結果數組

          TABLE(586, 0, 0, 0)

          '測量圓,并將結果賦值給起始地址為586的數組

          ZV_MRCIRCLE(mr_c, grabImg, tmp, 586)
         

          '賦值結果變量,用于繪制圖形

          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 '如果使用標定功能且已經標定成功
         

                 ZV_CALTRANSW(ca_param, TABLE(586),TABLE(587),590) '像素坐標轉世界坐標

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

                 '賦值標定結果變量,用于顯示數據結果

                 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
         

             '賦值像素結果變量,用于顯示數據結果

             circle_result(0)=TABLE(586)

             circle_result(1)=TABLE(587)

             circle_result(2)=TABLE(588)
         

          END SUB

          17.png

          

          17.在main.bas文件中添加參數設置界面按下【返回運行界面】按鈕時響應的函數,并關聯動作函數名。

          '參數設置界面按下返回運行界面按鈕時響應的函數

          GLOBAL SUB btn_goto_main()

              HMI_CLOSEWINDOW(11)

          END SUB

          18.png

          

          18.添加在運行界面按下【測試】按鈕時響應的函數,并關聯動作函數名。

          '運行界面按下測試按鈕時響應的函數

             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
         

          '運行界面按下測試按鈕時響應的函數

          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
         

          '點線圓同時測試子函數

          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.添加在運行界面按下【運行】按鈕時響應的函數,并關聯動作函數名。

          '運行界面按下運行按鈕時響應的函數

          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
         

          '主任務執行的函數

          main_task:

             while(1)

                 if (3 = main_task_state) then

                     main_task_state = 1

                     exit while

                 endif
         

                 '持續采集圖像,對圖像進行操作

                 btn_grab()

                 btn_test()
         

             wend

          END

          20.png

          

          20.添加在運行界面按下【停止】按鈕時響應的函數,并關聯動作函數名。

          '運行界面按下停止按鈕時響應的函數

          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

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

          本文由正運動技術原創,歡迎大家轉載,共同學習,一起提高中國智能制造水平。文章版權歸正運動技術所有,如有轉載請注明文章來源。

          正運動技術專注于運動控制技術研究和通用運動控制軟硬件產品的研發,是國家級高新技術企業。正運動技術匯集了來自華為、中興等公司的優秀人才,在堅持自主創新的同時,積極聯合各大高校協同運動控制基礎技術的研究,是國內工控領域發展最快的企業之一,也是國內少有、完整掌握運動控制核心技術和實時工控軟件平臺技術的企業。主要業務有:運動控制卡_運動控制器_EtherCAT運動控制卡_EtherCAT控制器_運動控制系統_視覺控制器__運動控制PLC_運動控制_機器人控制器_視覺定位_XPCIe/XPCI系列運動控制卡等等。


         

        狀 態: 離線

        公司簡介
        產品目錄

        公司名稱: 深圳市正運動技術有限公司
        聯 系 人: 戴德弟
        電  話: 0755-32976042
        傳  真: 0755-2606 6955
        地  址: 深圳市寶安區西鄉洲石路陽光工業園A1棟5樓
        郵  編: 518100
        主  頁:
         
        該廠商相關技術文摘:
        強實時運動控制內核MotionRT750(十):運動控制中的微調軌跡動態補償
        機器視覺運動控制一體機在大功率共模電感多面AI外觀缺陷檢測應用
        MotionRT750 SoftMotion:XPCIE1032H超高速運動控制卡在AOI檢測設備上的應用
        強實時運動控制內核MotionRT750(九):內置C語言的自定義機械手模型實現
        NEPCON ASIA 2025:解鎖行業新機遇,我們在深圳等您
        開放式激光振鏡運動控制器在旋轉飛行打標中的應用
        強實時運動控制內核MotionRT750(八):us級高速交互之LabVIEW,為智能裝備提速
        液態點膠密封解決方案,柔性升級,密封更可靠!
        柔性機械手視覺供料解決方案,提升無序分揀效率!
        【2025上海工博會】正運動展位智造未來(二)
        【2025上海工博會】正運動展位智造未來(一)
        【2025上海工博會】機器視覺運動控制一體機應用預覽(三)
        更多文摘...
        立即發送詢問信息在線聯系該技術文摘廠商:
        用戶名: 密碼: 免費注冊為中華工控網會員
        請留下您的有效聯系方式,以方便我們及時與您聯絡

        關于我們 | 聯系我們 | 廣告服務 | 本站動態 | 友情鏈接 | 法律聲明 | 不良信息舉報
        工控網客服熱線:0755-86369299
        版權所有 中華工控網 Copyright©2022 Gkong.com, All Rights Reserved

        主站蜘蛛池模板: 欧美丰满熟妇xxxx性ppx人交| 99精品视频在线观看婷婷| 天堂国产+人+综合+亚洲欧美| 成人亚洲欧美一区二区三区 | 99久久婷婷国产综合精品青草漫画 | 国产日本一区二区三区久久| 光棍天堂在线手机播放免费| 国产永久免费高清在线观看| 无码人妻一区二区三区免费N鬼沢| 亚洲一区二区三区成人网站| aaa少妇高潮大片免费看| 国产一卡2卡三卡4卡免费网站| 精品人妻一区二区| 伊人无码精品久久一区二区| 亚洲男人天堂2018| 午夜三级成人在线观看| 中文字幕午夜AV福利片| 激情综合色综合啪啪开心| 亚洲精品天天影视综合网| 中文字幕无码av不卡一区| 国产精品女熟高潮视频| 国产蜜臀精品一区二区三区| 日本高清视频网站www| 亚洲国产另类久久久精品| 在线观看国产一区亚洲bd| 日本一区二区三本视频在线观看| 国产高颜值极品嫩模视频| 国产在视频线精品视频| 97人妻中文字幕总站| 又黄又爽又高潮免费毛片| 色窝窝免费播放视频在线 | 日本一区二区精品色超碰| 久久av色欲av久久蜜桃网| 国产乱久久亚洲国产精品| 精品视频福利| 国产怡春院无码一区二区| 成人免费无遮挡无码黄漫视频| 亚洲人成网站在线观看播放不卡| 国产特级毛片aaaaaa毛片| 日韩伦理片| 亚洲精品777|