<rt id="m4md3"></rt>
  • <bdo id="m4md3"><meter id="m4md3"></meter></bdo>
  • <label id="m4md3"></label>
      <center id="m4md3"><optgroup id="m4md3"></optgroup></center>
      產(chǎn)品分類

      當(dāng)前位置: 首頁(yè) > 工業(yè)電氣產(chǎn)品 > 端子與連接器 > 線路板連接器 > FFC連接器

      類型分類:
      科普知識(shí)
      數(shù)據(jù)分類:
      FFC連接器

      VPLC系列機(jī)器視覺(jué)運(yùn)動(dòng)控制一體機(jī)快速入門(三)

      發(fā)布日期:2022-04-25 點(diǎn)擊率:54

      • 關(guān)鍵詞:正運(yùn)動(dòng)技術(shù),機(jī)器視覺(jué),運(yùn)動(dòng)控制


      • 摘要:今天,正運(yùn)動(dòng)技術(shù)為大家分享一下VPLC系列機(jī)器視覺(jué)運(yùn)動(dòng)控制一體機(jī)快速入門(三)——基于形狀匹配的視覺(jué)定位。


      上期課程,我們講述了機(jī)器視覺(jué)方案實(shí)施的基礎(chǔ)即相機(jī)的基本使用內(nèi)容,我們通過(guò)上期課程已經(jīng)能實(shí)現(xiàn)使用ZDevelop軟件獲取圖像進(jìn)行處理。


      本期課程我們和大家一起分享機(jī)器視覺(jué)方案中常用的基于形狀匹配的視覺(jué)定位功能。


      image.png


      什么是視覺(jué)定位?


      視覺(jué)定位是指在視覺(jué)檢測(cè)中通過(guò)學(xué)習(xí)特定的模板或某些固定的特征,在檢測(cè)區(qū)域內(nèi)搜索滿足條件的特征,并返回特征在圖像坐標(biāo)中的位置信息,如坐標(biāo)位置X、坐標(biāo)位置Y、角度。


      什么是形狀匹配?


      形狀匹配是基于邊緣方向梯度的匹配,它是提取ROI中的邊緣特征結(jié)合灰度信息創(chuàng)建模板,然后在檢測(cè)區(qū)域ROI范圍內(nèi)搜索與模板的輪廓特征滿足一定相似程度的產(chǎn)品特征,并返回對(duì)應(yīng)位置信息。


      image.png


      形狀匹配原理圖


      形狀匹配特點(diǎn)


      1.適應(yīng)性強(qiáng):可適應(yīng)光照和圖像的灰度變化。


      2.兼容性強(qiáng):可以支持搜索缺失局部邊緣、有噪聲干擾、有輕微變形和失焦的目標(biāo)。


      3.多目標(biāo)搜索:支持同時(shí)搜索同一模板下的多個(gè)匹配目標(biāo)。


      4.支持旋轉(zhuǎn)和縮放:在目標(biāo)圖像存在旋轉(zhuǎn)或縮放的情況下仍然能匹配到目標(biāo),但是需要在設(shè)定的旋轉(zhuǎn)和縮放比例范圍內(nèi)。


      模板選擇


      使用形狀匹配功能的前提是檢測(cè)目標(biāo)要有唯一且固定的特征。


      1.在選擇模板時(shí),需要確保特征是檢測(cè)目標(biāo)唯一存在的特征,否則無(wú)法與其他檢測(cè)目標(biāo)區(qū)分。


      2.盡量選擇圖像清晰形狀完整的標(biāo)準(zhǔn)產(chǎn)品作為模板,避免摻入噪點(diǎn)等干擾因素。


      3.盡量避免選擇對(duì)稱的特征作為模板。


      image.png


      如圖,閃電是目標(biāo)1唯一的特征,可以將目標(biāo)1和目標(biāo)2進(jìn)行區(qū)分。


      image.png


      模板選擇的原則


      image.png


      目標(biāo)定位


      image.png


      在目標(biāo)輪廓特征清晰且定位精度要求不高時(shí),可直接使用形狀匹配輸出的位置結(jié)果做定位項(xiàng)目。


      產(chǎn)品計(jì)數(shù)


      image.png


      對(duì)具有相同形狀特征的產(chǎn)品進(jìn)行計(jì)數(shù)統(tǒng)計(jì)。


      位置跟隨


      image.png


      當(dāng)需要檢測(cè)的目標(biāo)位置不固定時(shí),一些檢測(cè)功能的ROI位置無(wú)法確定如檢測(cè)直線、檢測(cè)圓形等,我們可以利用檢測(cè)目標(biāo)周邊有固定距離的特征進(jìn)行位置跟隨。


      image.png


      image.png


      形狀匹配流程圖


      實(shí)例演示


      新建項(xiàng)目→新建HMI文件→新建main.bas文件,用于編寫界面響應(yīng)函數(shù)→新建global_variable.bas文件用于存放全局變量并開(kāi)啟HMI自動(dòng)運(yùn)行任務(wù)→新建InitLocator.bas文件用于初始化測(cè)量參數(shù)→新建camera.bas文件用于實(shí)現(xiàn)相機(jī)采集功能→新建draw.bas文件用于更新繪制圖形刷新界面→文件添加到項(xiàng)目。


      image.png


      設(shè)計(jì)主界面。


      image.png


      在global_variable.bas文件中定義全局變量。


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

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

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

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

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


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

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

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

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


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


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

      '0 - 未初始化

      '1 - 停止

      '2 - 運(yùn)行中

      '3 - 正在停止

      GLOBAL DIM main_task_state

      main_task_state = 1


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

      GLOBAL DIM run_switch

      run_switch = 0


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

      '0 - 停止采集

      '1 - 請(qǐng)求采集

      GLOBAL DIM grab_switch

      grab_switch = 0


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

      GLOBAL DIM main_task_id

      main_task_id = 10


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

      GLOBAL DIM grab_task_id

      grab_task_id = 7


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


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


      '相機(jī)種類,"",此處使用海康相機(jī)-"mvision"

      GLOBAL DIM CAMERA_TYPE(100)

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

      CAMERA_TYPE = "mvision"


      '相機(jī)個(gè)數(shù)

      GLOBAL cam_num

      cam_num = 0


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

      GLOBAL cam_mode

      cam_mode = 0


      '***********結(jié)束定義相機(jī)采集相關(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)處于松開(kāi)狀態(tài),1-表示鼠標(biāo)處于按下?tīng)顟B(tài)

      GLOBAL DIM d_mouse_s

      d_mouse_s = 0


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


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


      '匹配檢測(cè)參數(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, 目前對(duì)于多目標(biāo)匹配也只存第一個(gè)目標(biāo)

      GLOBAL DIM d_match_rst(5)


      GLOBAL DIM d_match_time '定義匹配定位消耗的時(shí)間變量

      d_match_time = 0


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


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

      GLOBAL ZVOBJECT grabImg

      GLOBAL ZVOBJECT subImg,copy_subImg,colorSubImg, s_mod

      GLOBAL ZVOBJECT modRe


      RUN"Hmi1.hmi",1


      在InitLocator.bas文件中初始化測(cè)量參數(shù)。


      end


      GLOBAL SUB init_meas_param()   '初始化測(cè)量參數(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)約簡(jiǎn)特征點(diǎn)

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

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


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

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

        d_match_param(1) = 1    '匹配個(gè)數(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_match_time = 0


      END SUB


      關(guān)聯(lián)主界面值顯示控件變量。


      image.png


      在main.bas文件中添加主界面初始化函數(shù)。


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

      GLOBAL SUB hmi_init()


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

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

        ZV_LATCHSETSIZE(0, HMI_ConTROLSIZEX(10, 2), HMI_ConTROLSIZEY(10, 2)) '設(shè)置鎖存的大小

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


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


        '初始化一些全局參數(shù)

        ZVOBJECT contlist1, tsContlist1, mat_rigid1

        ZVOBJECT contlist2, tsContlist2, mat_rigid2


        ZV_READIMAGE(grabImg,"1.bmp",1)      '讀取.../flash目錄下的show.bmp的灰度圖像,存放到grabImg變量中

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


      END SUB


      在camera.bas文件中添加主界面中采集相關(guān)按鈕響應(yīng)的函數(shù)并關(guān)聯(lián)動(dòng)作函數(shù)。


      image.png


      end


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

      GLOBAL SUB cam_scan_all()

        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_mode = 0                     '設(shè)置軟觸發(fā)采集


        CAM_SEL(0)                       '選擇掃描到的第一個(gè)相機(jī)進(jìn)行操作

        CAM_SETEXPOSURE(100000)         '設(shè)置相機(jī)曝光時(shí)間為100000us      

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

        CAM_START(0)                     '開(kāi)啟相機(jī)  


      END SUB


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

      GLOBAL SUB btn_grab()

          if cam_num = 0   then 

             ?"請(qǐng)先掃描相機(jī)!"

           return 

          endif


        CAM_SETPARAM("TriggerSoftware", 0)

        CAM_GET(grabImg, 0)

        ZV_LATCH(grabImg, 0)


        ZV_IMGINFO(grabImg,3000)       '獲取grabImg變量緩存的圖片的基本信息,并存放到起始地址為3000的table數(shù)組中


      end sub


      '主界面按下連續(xù)采集按鈕響應(yīng)的函數(shù)

      GLOBAL SUB btn_cgrab()

          if grab_switch =1 then 

             ?"正在連續(xù)運(yùn)行中,請(qǐng)勿重復(fù)操作!"

           return 

        endif


        if cam_num = 0   then 

             ?"請(qǐng)先掃描相機(jī)!"

           return 

          endif


        grab_switch = 1

        if (1 = grab_switch) then

          if (0 = PROC_STATUS(grab_task_id)) then

            RUNTASK  grab_task_id, grab_task

          endif

        endif


      end sub


      '采集任務(wù)實(shí)現(xiàn)函數(shù)

      grab_task:

        while(1)

          if (0 = grab_switch) then

            exit while

          endif


            CAM_START(0)                     '開(kāi)啟相機(jī)  

            CAM_SETPARAM("TriggerSoftware", 0)

            CAM_GET(grabImg, 0)

            ZV_LATCH(grabImg, 0)

        wend

      END


      '主界面按下停止采集按鈕響應(yīng)的函數(shù)

      GLOBAL SUB btn_stopCgrab()

          if grab_switch =0 then 

             ?"未開(kāi)啟連續(xù)采集!"

           return 

        endif


        grab_switch = 0

      end sub

      image.png


      點(diǎn)擊[元件]→[新建窗口],新建學(xué)習(xí)模板窗口,設(shè)計(jì)窗口布局。


      image.png


      注意:需要設(shè)置窗口壟斷屬性。


      在draw.bas文件中添加主界面【學(xué)習(xí)模板】按鈕響應(yīng)的函數(shù)并關(guān)聯(lián)動(dòng)作函數(shù)。



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

      GLOBAL SUB btn_sel_loc()    

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

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


      END SUB



      image.png


      在draw.bas文件中添加模板區(qū)域更新繪制函數(shù)。


      '根據(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) '只有按下時(shí)可以改變擊中位置

          is_redraw = 1

          endif


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

          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)作為中間變量臨時(shí)使用

          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



      在main.bas文件中添加【截取模板】按鈕響應(yīng)的函數(shù)并關(guān)聯(lián)動(dòng)作函數(shù)。


      '創(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


      image.png


      點(diǎn)擊[元件]→[新建窗口],新建編輯模板窗口,設(shè)計(jì)窗口布局。


      image.png


      注意:需要設(shè)置窗口壟斷屬性。


      在draw.bas文件中添加創(chuàng)建模板界面【橡皮擦】按鈕響應(yīng)的函數(shù)并關(guān)聯(lián)動(dòng)作函數(shù)。


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

      GLOBAL SUB btn_sel_erase()

        ZV_LATCHSETSIZE(1, HMI_ConTROLSIZEX(12, 1), HMI_ConTROLSIZEY(12, 1)) '設(shè)置鎖存的大小

        SET_COLOR(RGB(0,255,0))             '設(shè)置繪制時(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(12)                  '打開(kāi)編輯模板窗口


      end sub


      image.png


      在draw.bas文件中添加橡皮擦更新繪制函數(shù)。


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

      GLOBAL SUB update_eraser()

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

        DIM eraser_pos_x,eraser_pos_y 

        d_mouse_s = MOUSE_STATE(21)     '鼠標(biāo)處于按下?tīng)顟B(tài)時(shí)

        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為邊長(zhǎng)的正方形橡皮擦區(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īng)顟B(tài)且編輯模板標(biāo)志=1時(shí)

          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)   '計(jì)算modRe和tmp_re的差集并存放到modRe中

        else  '恢復(fù)

          ZV_REUNIOn(modRe, tmp_re, modRe)  '計(jì)算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


      在main.bas文件中添加編輯模板界面【創(chuàng)建模板】按鈕響應(yīng)的函數(shù)并關(guān)聯(lián)動(dòng)作函數(shù)。

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

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

          '創(chuàng)建模板


        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)'計(jì)算剛性變換矩陣

        ZV_ConTAFFINE(contlist1, mat_rigid1, tsContlist1)'對(duì)輪廓或輪廓序列進(jìn)行仿射變換

        ZV_ConTLIST(colorSubImg, tsContlist1, ZV_COLOR(0, 255, 0), 0)'在colorSubImg圖像上繪制綠色的輪廓序列


        ZV_LATCHCLEAR(2)

        ZV_LATCH(colorSubImg, 2)


      end sub


      image.png


      在draw.bas文件中添加編輯模板界面【確定】按鈕響應(yīng)的函數(shù)并關(guān)聯(lián)動(dòng)作函數(shù)。


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

      GLOBAL SUB btn_erase_cfm()

        ZV_LATCHCLEAR(0)

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

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


      END SUB


      image.png


      在main.bas文件中添加創(chuàng)建模板界面【測(cè)試】按鈕響應(yīng)的函數(shù)并關(guān)聯(lián)動(dòng)作函數(shù)。


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

      GLOBAL SUB btn_loc_test()

        if (d_is_creModel = 0) then

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

          return

        endif


        '開(kāi)始匹配

        TICKS = 0

        ZVOBJECT match_rst, sImg, colorImg

        ZV_GAUSSBLUR(grabImg, sImg, 3)

        ZV_SHAPEFIND(s_mod, sImg, match_rst, d_match_param(0), d_match_param(1), d_match_param(2), d_match_param(3), d_match_param(4), d_match_param(5), d_match_param(6))


        ZV_MATINFO(match_rst, 0)

        ZV_GRAYTORGB(sImg, colorImg)


        if TABLE(0) > 0 then

          local rowr

          for rowr = 0 to TABLE(0)-1

            ZV_MATGETROW(match_rst, rowr, 5, 3)  '獲取match_rst矩陣中第rowr行的數(shù)據(jù)到table中,table最大長(zhǎng)度5


            if(rowr = 0) then

              d_match_rst(0) = TABLE(3)

              d_match_rst(1) = TABLE(4)

              d_match_rst(2) = TABLE(5)

              d_match_rst(3) = TABLE(6)

              d_match_rst(4) = TABLE(7)


              ZV_GETRIGIDVECTOR(mat_rigid1, 0, 0, 0, TABLE(4), TABLE(5), TABLE(6))'計(jì)算剛性變換矩陣

              ZV_ConTAFFINE(contlist1, mat_rigid1, tsContlist1)'對(duì)輪廓或輪廓序列進(jìn)行仿射變換

              ZV_ConTLIST(colorImg, tsContlist1, ZV_COLOR(0, 255, 0), 0)'在colorSubImg圖像上繪制綠色的輪廓序列

            endif

          next

        else

          d_match_rst(0) = -1

          d_match_rst(1) = -1

          d_match_rst(2) = -1

          d_match_rst(3) = -1

          d_match_rst(4) = -1

        endif


        d_match_time = abs(TICKS) '匹配時(shí)間

        ZV_LATCH(colorImg, 0)


      end sub



      image.png


      在draw.bas文件中添加創(chuàng)建模板界面【確定】按鈕響應(yīng)的函數(shù)并關(guān)聯(lián)動(dòng)作函數(shù)。


      圖片


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

      GLOBAL SUB btn_loc_cfm()

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

        d_is_rtn_loc = 1

        ZV_LATCHCLEAR(0)

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

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


        HMI_CLOSEWINDOW(11)


      END SUB

      image.png


      在main.bas文件中添加主界面【單次執(zhí)行】按鈕響應(yīng)的函數(shù)并關(guān)聯(lián)動(dòng)作函數(shù)。


      '主界面按下單次執(zhí)行按鈕時(shí)響應(yīng)的函數(shù)

      GLOBAL SUB btn_test()

        btn_grab()           '單次采集圖像

        btn_loc_test()       '匹配測(cè)試函數(shù)


      END SUB

      image.png


      在main.bas文件中添加主界面【連續(xù)運(yùn)行】按鈕響應(yīng)的函數(shù)并關(guān)聯(lián)動(dòng)作函數(shù)。


      '主界面點(diǎn)擊連續(xù)運(yùn)行按鈕時(shí)響應(yīng)的函數(shù)

      GLOBAL SUB btn_run()

          if(run_switch = 1) then 

           ?"已開(kāi)啟連續(xù)運(yùn)行,請(qǐng)勿重復(fù)操作!"

           return 

        endif


        run_switch = 1

        if (1 = run_switch) then

          if (0 = PROC_STATUS(main_task_id)) then

            RUNTASK  main_task_id, main_task

          endif

        endif

      END SUB


      '連續(xù)運(yùn)行主任務(wù)內(nèi)容

      main_task:

        while(1)

          if (0 = run_switch) then

            exit while

          endif


          '以下執(zhí)行相關(guān)定位操作

          btn_grab()

          btn_loc_test()

        wend


      END


      image.png


      在main.bas文件中添加主界面【停止運(yùn)行】按鈕響應(yīng)的函數(shù)并關(guān)聯(lián)動(dòng)作函數(shù)。


      '主界面點(diǎn)擊停止執(zhí)行按鈕時(shí)響應(yīng)的函數(shù)

      GLOBAL SUB btn_stop()

          if(run_switch = 0) then 

           ?"未開(kāi)啟連續(xù)運(yùn)行!"

           return 

        endif


        run_switch = 0

      END SUB

      image.png

      仿真演示效果


      image.png


      本次,VPLC系列機(jī)器視覺(jué)運(yùn)動(dòng)控制一體機(jī)快速入門(三)——基于形狀匹配的視覺(jué)定位就分享到這里,更多精彩內(nèi)容請(qǐng)關(guān)注“正運(yùn)動(dòng)小助手”公眾號(hào)。


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


      掌握運(yùn)動(dòng)控制核心技術(shù)和實(shí)時(shí)工控軟件平臺(tái)技術(shù)的企業(yè)。



      下一篇: PLC、DCS、FCS三大控

      上一篇: EtherCAT總線運(yùn)動(dòng)控制

      推薦產(chǎn)品

      更多
      主站蜘蛛池模板: 天天综合亚洲色在线精品| 日日狠狠久久偷偷色综合免费 | 色狠狠色狠狠综合天天| 亚洲国产综合人成综合网站00| 亚洲国产精品综合久久久| 色欲人妻综合AAAAAAAA网| 伊人色综合久久天天人手人婷| 亚洲另类激情综合偷自拍| 国产亚洲综合视频| 伊人久久大香线焦综合四虎| 国产精品综合视频| 亚洲欧洲日韩综合| 久久综合伊人77777麻豆| 亚洲AV综合色区无码一二三区 | 婷婷久久香蕉五月综合| 久久精品国产9久久综合| 国产成人综合日韩精品婷婷九月| 五月综合激情婷婷六月色窝| 国产91色综合久久免费分享| 亚洲偷自拍拍综合网| 婷婷综合激情五月中文字幕| 久久综合香蕉国产蜜臀AV| 狠狠色丁香婷婷久久综合不卡| 国产综合成人亚洲区| 亚洲国产成人久久综合| 亚洲狠狠婷婷综合久久| 狠狠色狠狠色综合日日五| 久久婷婷国产综合精品| 久久一日本道色综合久久| 伊人久久综合热线大杳蕉下载| 日韩综合无码一区二区| 狠狠色色综合网站| 久久综合久久综合九色| 伊人久久大香线蕉综合Av| 久久婷婷五月国产色综合| 久久精品国产亚洲综合色| 综合久久一区二区三区 | 一本久道久久综合多人| 青青草原综合久久| 亚州欧州一本综合天堂网| 精品综合久久久久久98|