<rt id="m4md3"></rt>
  • <bdo id="m4md3"><meter id="m4md3"></meter></bdo>
  • <label id="m4md3"></label>
      <center id="m4md3"><optgroup id="m4md3"></optgroup></center>
      產品分類

      當前位置: 首頁 > 工業控制產品 > 自動化控制 > PLC可編程控制器

      類型分類:
      科普知識
      數據分類:
      PLC可編程控制器

      VPLC系列機器視覺運動控制一體機快速入門(九)

      發布日期:2022-04-25 點擊率:28

      • 關鍵詞:正運動技術,機器視覺,運動控制器


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


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

      本期課程我們和大家一起分享機器視覺中使用到的簡單的外觀檢測功能---檢測劃痕。


      image.png


      一、原理


      外觀檢測是機器視覺技術中一個重要的檢測功能,它可以檢測產品表面的臟污、瑕疵、缺陷、毛邊、劃痕等不良因素。在包裝行業和生產制造業被廣泛應用。


      image.png


      1.劃痕檢測的原理是什么?


      由于劃痕是隨機出現且不具有固定形態的特征,因此無法使用匹配等定位功能檢測判斷劃痕。這時就需要用到形態學處理提取劃痕特征,再配合BOLB檢測判斷劃痕有無。


      劃痕檢測是使用形態學方法(如頂帽算法)將灰度圖像轉換成二值化圖像后,提取劃痕的圖像特征,再使用BLOB檢測對劃痕的特征進行有無檢測。


      image.png


      2.什么是頂帽算法?


      頂帽算法是將原始的圖像(逐像素)減去開運算的圖像,得到開運算中消除的小面積的局部亮像素區域的一種形態學處理方法。


      開運算是先進行腐蝕,再進行膨脹的一種形態學處理方法。開運算可以去除一些孤立的、細小的亮區域,平滑有毛刺的邊緣線,同時原區域的面積不會發生明顯變化。對于灰度值高于產品灰度值的(亮)劃痕可用頂帽算法檢測出來。


      image.png


      3.什么是黑帽算法?


      黑帽算法是將閉運算圖像(逐像素)減去原始的圖像,得到閉運算中消除的小面積的局部暗像素區域的一種形態學處理方法。


      閉運算是先進行膨脹,再進行腐蝕的一種形態學處理方法。閉運算可以去除一些孤立的、細小的暗區域,同時原區域的面積不會發生明顯變化。閉運算還可以填充小面積的亮區域的空洞,使分離的亮邊緣相連接。對于灰度值低于產品灰度值的(暗)劃痕可用黑帽算法檢測出來。


      image.png


      二、劃痕檢測特點


      1.依賴形態學處理


      需要將檢測圖像轉換成二值化圖像,并使用形態學處理圖像突出檢測特征。


      2.無固定形狀特征


      劃痕都是隨機出現的無特定形狀的特征,因此無法通過匹配進行檢測。


      3.基于BLOB檢測


      提取出劃痕特征后需要使用BLOB檢測出連通的劃痕區域。


      4.需要一定對比度


      劃痕和待檢測產品需要滿足一定的對比度,才能使用形態學處理方法提取對應特征。


      image.png


      檢測劃痕流程圖


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


      image.png


      2.設計HMI界面。


      image.png

      3.在global_variable.bas文件中定義全局變量,定義完成后運行Hmi.hmi文件。


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

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

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


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

      ''table 31-35,旋轉矩ROI參數,cx、cy、width、height、angle,控件坐標系

      ''table 41-45,旋轉矩形控件坐標轉換后對應的圖像坐標,圖像坐標系


      ''table 51-56,圓環ROI參數,cx、cy、圓環中線半徑r、圓環半寬ann_R、起始角度stAngle、角度范圍entAngle,控件坐標系

      ''table 61-66,圓環控件坐標轉換后對應的圖像坐標,圖像坐標系


      '主任務狀態

      '0 - 未初始化

      '1 - 停止

      '2 - 運行中

      '3 - 正在停止

      GLOBAL DIM main_task_state

      main_task_state = 1


      '采集開關

      '0 - 停止采集

      '1 - 請求采集

      GLOBAL DIM grab_switch

      grab_switch = 0


      '相機個數

      GLOBAL cam_num

      cam_num = 0


      '相機種類,"zmotion;mvision;basler;mindvision;huaray"

      GLOBAL DIM CAMERA_TYPE(16)

      CAMERA_TYPE = "mvision"


      ' 定義主任務id - 10

      GLOBAL DIM main_task_id

      main_task_id = 10


      '定義連續采集任務id - 9

      GLOBAL DIM grab_task_id

      grab_task_id = 9



      '定義全局圖像變量

      GLOBAL ZVOBJECT grabImg '采集圖像

      GLOBAL ZVOBJECT binImg '二值化圖像

      GLOBAL ZVOBJECT disImg '顯示圖像


      '定義常用顏色變量

      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 DIM d_def_num       '定義劃痕數量結果

      GLOBAL DIM d_def_state     '定義狀態結果


      '定義劃痕數據結果存儲數組變量

      GLOBAL DIM  value(10000),id


      '旋轉矩形ROI參數:cx、cy、width、height、angle

      GLOBAL DIM d_roi_rect2(5) 



      '檢測參數:劃痕類型、檢測方向、檢測尺寸、對比度、最小面積、最大面積

      GLOBAL DIM d_detect_param(6) 



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

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

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

      GLOBAL DIM d_use_imgfile

      d_use_imgfile=1


      '定義本地圖片索引

      GLOBAL DIM d_index

      d_index=0


      '定義讀取圖片的路徑

      GLOBAL DIM File_Name(100)   


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


      '運行HMI文件

      RUN "Hmi.hmi",1

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


      end


      GLOBAL SUB init_detect_param()'初始化測量參數

         

        d_def_num = 0               '劃痕結果初始化為0

        d_def_state = 0             '狀態結果初始化為0

        TABLE(1)=1

        '初始化roi參數

        d_roi_rect2(0) = 160.0      'roi中心x

        d_roi_rect2(1) = 120.0      'roi中心y

        d_roi_rect2(2) = 80.0       'roi寬

        d_roi_rect2(3) = 60.0       'roi高

        d_roi_rect2(4) = 0.0        'roi角度

        TABLE(31) = d_roi_rect2(0) '將roi變量賦值給起始地址為31的table數組

        TABLE(32) = d_roi_rect2(1)

        TABLE(33) = d_roi_rect2(2)

        TABLE(34) = d_roi_rect2(3)

        TABLE(35) = d_roi_rect2(4)  

        

        '初始化檢測參數:劃痕類型、檢測方向、檢測尺寸、對比度、最小面積、最大面積

        d_detect_param(0) = 0      '初始化劃痕類型為暗

        d_detect_param(1) = 2      '初始化檢測方向為X軸和Y軸

        d_detect_param(2) = 4      '初始化檢測尺寸為4

        d_detect_param(3) = 20     '初始化對比度為20

        d_detect_param(4) = 2000    '初始化最小面積為2000個像素

        d_detect_param(5) = 7000   '初始化最大面積為7000個像素

        

        '將劃痕結果變量賦值為0

        for i=0 to 100

          value(i)=0

        next

        

      END SUB

      5.關聯HMI界面值顯示控件變量。


      image.png


      6.在main.bas文件中添加HMI界面初始化函數并在Hmi系統設置中關聯初始化函數。


      'HMI界面初始化函數

      GLOBAL SUB hmi_init()


        grab_switch = 0            '初始化采集開關為停止采集

        main_task_state = 1        '初始化主任務狀態為停止狀態

        

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

        ZV_RESETCLIPSIZE(1280, 960)

        '設置鎖存通道0的大小,以適應圖片元件控件大小

        ZV_LATCHSETSIZE(0, HMI_ConTROLSIZEX(10, 7), HMI_ConTROLSIZEY(10, 7))

        

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

       

        init_detect_param() '初始化測量參數

        

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

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

      END SUB

      image.png


      7.在camera.bas文件中添加HMI界面中采集相關按鈕響應的函數并關聯動作函數。


      image.png


      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_SEL(0)                       '選擇掃描到的第一個相機進行操作

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

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

        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="9"+TOSTR(d_index,1,0)+".bmp"   '.../flash/9/目錄下的圖片所在的路徑名稱

          ZV_IMGREAD(grabImg,File_Name,1)

          ZV_LATCH(grabImg, 0) 

          d_index=d_index+1

        return   

        endif

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

        

        '如果相機數量為0,提示先掃描相機,并退出子函數不往下執行

          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

            

          'grab_switch=1時重復執行以下操作

           btn_grab()'單次采集按鈕響應的函數

        wend

      END


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

      GLOBAL SUB btn_stopCgrab()

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

             ?"未開啟連續采集!"

           return 

        endif

        

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

      END SUB


      8.在draw.bas文件中添加檢測ROI更新繪制函數,并在自定義元件屬性窗口中關聯刷新函數和繪制函數。

      end


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


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

        is_redraw = 0

        

        DIM hit_pos    '定義調整操作標志


      '根據鼠標操作更新ROI位置區域函數

      GLOBAL SUB update_roi()

        

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

              '只有按下時可以改變擊中位置,獲取鼠標點擊位置對應的擊中區域編號

            hit_pos = ZV_HMIADJRECT2(table(21), table(22), 31, -1) 

            is_redraw = 1            '繪圖標志置1

          endif


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

              '根據區域編號調整roi區域位置

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

            is_redraw = 1              '繪圖標志置1

          endif

        

          if (MOUSE_state(21)) then    '鼠標按下時

              '根據區域編號調整roi區域位置

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

            is_redraw = 1              '繪圖標志置1

          endif

        

          if (1 = is_redraw) then       '如果繪制標志=1

          

            is_redraw = 0              '繪圖標志置0

            '控件roi坐標轉圖像roi坐標,控件坐標存放在起始地址為111的數組,圖像坐標存放在起始地址為50的數組

            ZV_POSTOIMG(0, 1, 31, 41)

            d_roi_rect2(0) = TABLE(41)'將圖像坐標的數據賦值給ROI變量

            d_roi_rect2(1) = TABLE(42)

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

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

            d_roi_rect2(4) = TABLE(35)

            SET_REDRAW  '重新繪制全部區域

          endif

        

      END SUB


      'ROI區域更新后實時繪制ROI區域

      GLOBAL SUB draw_roi()

        

          SET_COLOR(C_BLUE)    '設置畫筆顏色為藍色

          ZV_HMIRECT2(31, 300) '將旋轉矩形roi分解為HMI支持的繪圖圖元并添加控制參數,便于HMI繪圖顯示

          DRAWLINE(TABLE(300), TABLE(301), TABLE(302), TABLE(303)) '繪制外矩形

          DRAWLINE(TABLE(302), TABLE(303), TABLE(304), TABLE(305))

          DRAWLINE(TABLE(304), TABLE(305), TABLE(306), TABLE(307))

          DRAWLINE(TABLE(306), TABLE(307), TABLE(300), TABLE(301))

          

      END SUB

      image.png


      9.在main.bas文件中添加HMI界面按下【上一頁】按鈕時響應的函數并關聯動作函數名。


      image.png


      'HMI界面按下上一頁按鈕時響應的函數

      GLOBAL SUB last_()


        id=id-1        'id變量自減1

        if id<0 then '如果id變量<0

          id =0      'id=0

        endif

        

      END SUB

      image.png


      10.在main.bas文件中添加HMI界面按下【下一頁】按鈕時響應的函數并關聯動作函數名。


      image.png


      'HMI界面按下下一頁按鈕時響應的函數

      GLOBAL SUB   next_()

        

        id=id+1 'id變量自加1

        

      END SUB

      image.png


      11.在main.bas文件中添加HMI界面按下【測試】按鈕時響應的函數并關聯動作函數名。


      image.png



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

      GLOBAL SUB btn_test()

          

        for i=0 to 100 '檢測前先將結果數據清零

          value(i)=0

        next

        '定義二值化白色區域、二值化區域、二值化黑色區域、連通區域、檢測結果、劃痕輸出圖像、輸出結果矩陣、結果列表

        GLOBAL ZVOBJECT regionWhite, regionMask, regionBlack,re_connecte,rst,outImg,mat,relist

        

        '根據ROI數據生成檢測區域ROI

        ZV_REGENRECT2(regionMask, d_roi_rect2(0), d_roi_rect2(1), d_roi_rect2(2), d_roi_rect2(3), d_roi_rect2(4))

        '表面外觀缺陷檢測算子,傳參分別是:輸入圖像、檢測區域、輸出檢測結果、檢測劃痕類型、檢測軸、檢測尺寸、對比度閾值、最小面積、最大面積

        ZV_DEFDETECTSUR_(grabImg,regionMask,rst,d_detect_param(0),d_detect_param(1),d_detect_param(2),d_detect_param(3),d_detect_param(4),d_detect_param(5))

        '獲取缺陷結果算子,傳參分別是:檢測結果、輸出缺陷圖像、數據結果矩陣、結果列表、輸出圖像類型、輸出結果排序類型

        ZV_DEFGETSURRST_(rst,outImg,mat,relist,2,0)'獲取缺陷結果

        ZV_LATCH(outImg,1)'將缺陷結果圖像顯示到鎖存通道1中

        ZV_MATINFO(mat,50)'獲取結果矩陣的信息并存放到起始地址為50的變量中

        d_def_num=table(50)'將矩陣行數即劃痕數量賦值給結果變量

        

        if (TABLE(50)=0) then '如果檢測到的劃痕數量=0,則結果狀態=1

            d_def_state=1

        else d_def_state=0

        endif

        

        ?TABLE(50),TABLE(51)'打印提示矩陣的行數和列數信息

        for i = 0 to TABLE(50)-1 '循環給數據結果變量賦值

            

          '獲取第i行矩陣數據結果,包括面積 周長,坐標x,坐標y

          ZV_MATGETROW(mat, i, 4, 100+i*4)

          value(i*4+0)=TABLE(100+i*4+0)'將table數據賦值給對應變量

          value(i*4+1)=TABLE(100+i*4+1)

          value(i*4+2)=TABLE(100+i*4+2)

          value(i*4+3)=TABLE(100+i*4+3)

          

        next  

        

      END SUB

      image.png


      12.在main.bas文件中添加【運行】按鈕響應的函數并關聯動作函數。


      image.png


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

      GLOBAL SUB btn_run()


          if(2 = main_task_state) then  '如果主任務處于運行中狀態

           ?"已經開啟連續運行任務,請勿重復操作!" '打印提示

           return 

        endif

        

        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

      image.png


      13.在main.bas文件中添加【停止】按鈕響應的函數并關聯動作函數。


      image.png


      HMI界面按下停止按鈕時響應的函數

      GLOBAL SUB btn_stop()


        if (2 = main_task_state) then '如果主任務狀態處于2即任務運行中時

           main_task_state = 3         '將主任務狀態置為3,退出循環

        endif

        

      END SUB

      image.png



      image.png

      仿真效果_檢測OK


      image.png

      image.png

      image.png


      本次,正運動技術VPLC系列機器視覺運動控制一體機快速入門(九)——外觀檢測功能---檢測劃痕,就分享到這里。


      更多精彩內容請關注“正運動小助手”公眾號,需要ZDevelop開發環境與例程代碼,請咨詢正運動技術銷售工程師:400 089 8936。


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


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

      上一篇: 運動控制器之追剪應用

      推薦產品

      更多
      主站蜘蛛池模板: 人人狠狠综合久久88成人| 久久老色鬼天天综合网观看| 亚洲sss综合天堂久久久| 天天av天天翘天天综合网| 狠狠色丁香婷婷久久综合五月| 色欲色香天天天综合网WWW| 中文字幕国产综合| 久久综合噜噜激激的五月天| 国产成人精品综合| 99久久国产综合精品女图图等你| 亚洲综合无码无在线观看| 久久亚洲综合色一区二区三区| 小说区 图片区色 综合区| 久久综合精品视频| 亚洲偷自拍拍综合网| 狠狠色成人综合网图片区| 色综合久久久久久久久五月| 天天做天天爱天天综合网| 亚洲综合一区国产精品| 亚洲综合色丁香麻豆| 久久久久国产综合AV天堂| 亚洲综合最新无码专区| 一本色道久久88亚洲综合 | 色综合久久一区二区三区| 99热婷婷国产精品综合| 国产精品亚洲综合天堂夜夜| 狠狠色丁香久久婷婷综合图片 | 亚洲国产综合精品中文第一| 伊人久久亚洲综合| 亚洲精品第一国产综合境外资源| 精品久久综合一区二区| 婷婷激情狠狠综合五月| 色综合婷婷在线观看66| 91精品国产色综合久久| 亚洲欧洲日产国产综合网| 久久综合综合久久97色| 亚洲明星合成图综合区在线| 亚洲色偷偷综合亚洲AV伊人蜜桃 | 久久久久青草线蕉综合超碰| 婷婷四房综合激情五月在线| 97se亚洲国产综合自在线|