<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è)電氣產(chǎn)品 > 端子與連接器 > 線路板連接器 > FFC連接器

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

      機(jī)器視覺運(yùn)動(dòng)控制一體機(jī)應(yīng)用例程(三) 基于BLOB分析的多圓定位

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

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


      • 摘要:我們?cè)凇禫PLC系列機(jī)器視覺運(yùn)動(dòng)控制一體機(jī)快速入門(三)》的推文中,講述了基于形狀匹配的視覺定位功能,而BLOB斑點(diǎn)分析也可以實(shí)現(xiàn)定位功能。


      image.png


      我們?cè)凇禫PLC系列機(jī)器視覺運(yùn)動(dòng)控制一體機(jī)快速入門(三)》的推文中,講述了基于形狀匹配的視覺定位功能,而BLOB斑點(diǎn)分析也可以實(shí)現(xiàn)定位功能。


      本期課程我們將在BLOB斑點(diǎn)分析定位的基礎(chǔ)上進(jìn)行檢測(cè)圓形,輸出圓心的坐標(biāo)數(shù)據(jù)。


      一檢測(cè)原理


      (一)BLOB斑點(diǎn)定位


      BLOB斑點(diǎn)分析功能可以輸出BLOB區(qū)域的重心位置XY,BLOB斑點(diǎn)區(qū)域還可以擬合成特定形狀如外接矩形,輸出矩形的角度,從而實(shí)現(xiàn)定位的功能。


      (二)BLOB分析的圓形檢測(cè)+示意圖


      圓形測(cè)量器不具有定位功能,因此當(dāng)檢測(cè)目標(biāo)在視野的位置是隨機(jī)時(shí),我們需要配合定位功能將測(cè)量器跟隨目標(biāo)移動(dòng)。本節(jié)程序示例將檢測(cè)到的BLOB重心XY數(shù)據(jù)作為圓形測(cè)量器的中心XY值,即可實(shí)現(xiàn)位置跟隨功能。


      image.png


      二軟件演示


      (一)檢測(cè)要求


      使用ZDevelop軟件的ZBASIC編程語言編寫程序,用于檢測(cè)以下路徑中圖片的圓環(huán)零件的圓心位置XY以及半徑。 


      使用到的視覺功能:BLOB斑點(diǎn)分析+檢測(cè)圓形+九點(diǎn)標(biāo)定。


      image.png


      (二)實(shí)例演示


      1.打開ZDevelop軟件:新建項(xiàng)目→新建HMI文件→新建main.bas文件,用于編寫界面響應(yīng)函數(shù)→新建global_variable.bas文件用于定義全局變量并開啟HMI自動(dòng)運(yùn)行任務(wù)→新建detectParam.bas文件,用于初始化測(cè)量參數(shù)→新建camera.bas文件用于實(shí)現(xiàn)相機(jī)采集功能→文件添加到項(xiàng)目。


      image.png


      2.設(shè)計(jì)HMI界面。


      image.png


      3.在global_variable.bas文件中添加全局變量。


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

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

      ''table        說明                 table            說明

      ''0  '    自動(dòng)二值化閾值            11~12   鼠標(biāo)操作時(shí)獲取的坐標(biāo)

      ''2       亮區(qū)域的面積            20~24   圖像信息

      ''4       暗區(qū)域的面積            6       連通區(qū)域的數(shù)量   

      ''40~42  小圓斑點(diǎn)的面積和位置X,Y數(shù)據(jù)  81~98  標(biāo)定圖像坐標(biāo)xy       

      ''46~48  小圓圓心X,Y和半徑          131~148  標(biāo)定世界坐標(biāo)xy

      ''39     提取mark點(diǎn)成功標(biāo)志          56~57  圓點(diǎn)矩陣行列數(shù)

      ''49~50  圓上的點(diǎn)坐標(biāo)

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

      '0 - 未初始化

      '1 - 停止

      '2 - 運(yùn)行中

      '3 - 正在停止

      GLOBAL DIM main_task_state

      main_task_state = 1


      '采集開關(guān)

      '0 - 停止采集

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

      GLOBAL DIM grab_switch

      grab_switch = 0


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

      GLOBAL cam_num

      cam_num = 0


      '相機(jī)種類,"zmotion;mvision;basler;mindvision;huaray"

      GLOBAL DIM CAMERA_TYPE(16)

      CAMERA_TYPE = "mvision"


      ' 定義主任務(wù)id - 10

      GLOBAL DIM main_task_id

      main_task_id = 10


      '定義連續(xù)采集任務(wù)id - 9

      GLOBAL DIM grab_task_id

      grab_task_id = 9


      '定義全局圖像變量

      GLOBAL ZVOBJECT grabImg '采集圖像

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


      '檢測(cè)參數(shù):閾值模式(自動(dòng)閾值或手動(dòng)閾值)、低閾值、高閾值、最小面積、最大面積

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


      '開/閉運(yùn)算參數(shù)

      GLOBal DIM d_deal_value(2)


      '檢測(cè)消耗時(shí)間

      GLOBal DIM d_detect_time


      '小圓的位置x/y結(jié)果

      GLOBal DIM d_circle_rst(18)


      '顯示打印的字符

      GLOBAL ShowString(64)


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

      '是否標(biāo)定

      GLOBAL DIM is_ca_success


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

      GLOBAL DIM d_calib_success

      d_calib_success = 0


      '定義標(biāo)定系數(shù)即矩陣轉(zhuǎn)換系數(shù)

      GLOBAL ZVOBJECT ca_param


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

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


      '定義是否使用標(biāo)定功能

      GLOBAL DIM d_use_calib

      d_use_calib=0


      '定義標(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


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

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

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

      GLOBAL DIM d_use_imgfile


      '定義本地圖片索引

      GLOBAL DIM d_index


      '定義讀取圖片的路徑

      GLOBAL DIM File_Name(100)   


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


      '運(yùn)行HMI文件

      RUN "Hmi.hmi",1

      4.關(guān)聯(lián)HMI界面控件變量。


      image.png


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


      end


      GLOBAL SUB init_detect_param()    '初始化測(cè)量參數(shù)

        

          d_deal_value(0)=1          '初始化開/閉運(yùn)算參數(shù)

          d_deal_value(1)=1

          

          '初始化檢測(cè)參數(shù):閾值模式(自動(dòng)閾值 = 1 或 手動(dòng)閾值 = 0)、低閾值、高閾值、極性(黑或白)、最大、最小、反向(即結(jié)果取反,成功變成失敗、失敗變成成功)

          d_detect_param(0) = 0      '手動(dòng)閾值

          d_detect_param(1) = 140    '低閾值

          d_detect_param(2) = 255     '高閾值

          d_detect_param(3) = 11000    '最小面積即像素個(gè)數(shù)

          d_detect_param(4) = 12000    '最大面積

        

          d_use_imgfile = 1           '默認(rèn)使用本地圖片

          d_index      = 0

          

          TABLE(6)=0   '將小圓數(shù)量初始化為0

          for i=0 to 17

              d_circle_rst(i)=0

          next

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

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

          d_ca_param(1) = 120    '對(duì)比度

          d_ca_param(2) = 0    '極性

          d_ca_param(3) = 80    '最小面積

          d_ca_param(4) = 20000  '最大面積

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

          ca_min_err = 0      '最小誤差

          ca_max_err = 0      '最大誤差

          ca_avg_err = 0      '平均誤差

          

          for i=0 to 17           '初始化圓點(diǎn)矩陣像素坐標(biāo)    

              TABLE(81+i)=0

          next

          

          for i=0 to 17           '初始化圓點(diǎn)矩陣世界坐標(biāo)    

              TABLE(131+i)=0

          next

          TABLE(39)=0             '提取mark點(diǎn)狀態(tài)默認(rèn)為失敗 

          

      END SUB

      6.在main.bas文件中添加界面初始化函數(shù),并在hmi系統(tǒng)設(shè)置中關(guān)聯(lián)初始化函數(shù)名。


      end


      '注:

      '凡是要使用Region有關(guān)的算子在系統(tǒng)初始化時(shí)都要調(diào)用ZV_RESETCLIPSIZE(width, height)這個(gè)算子設(shè)置下圖像尺寸,以滿足相機(jī)分辨率,因?yàn)槟J(rèn)的是640*480尺寸


      'HMI界面初始化函數(shù)

      GLOBAL SUB hmi_init()

          grab_switch = 0              '停止采集

          main_task_state = 1          '主任務(wù)停止運(yùn)行

          ZV_RESETCLIPSIZE(1280, 960) '依據(jù)圖像分辨率設(shè)置區(qū)域的裁剪尺寸,此處圖像分辨率為1280x960

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

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

          ZV_SETSYSDBL("CamGetTimeout", 1000) '設(shè)置采集超時(shí)

          ZV_SETSYSINT("LineWidth",6)

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

          

      END SUB

      image.png


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


      圖片


      相機(jī)操作相關(guān)按鈕


      end


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

      GLOBAL SUB cam_scan_all()


          if(d_use_imgfile=1)then 

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

          return 

          endif 

        

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

          ZV_SETSYSSTR("DataDir","")

            

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

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

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

               ? "未找到相機(jī)" 

              

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

          endif

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

        

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

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

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

          CAM_START(0)                     '開啟相機(jī)  

        

      END SUB


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

      GLOBAL SUB btn_grab()


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

          if (d_use_imgfile=1) then 

              if(d_index=3) then 

                   d_index=0

              endif

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

              ZV_IMGREAD(grabImg,File_Name,0)

              ZV_LATCH(grabImg, 0) 

              d_index=d_index+1

          return   

          endif

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

        

          if cam_num = 0   then 

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

          return 

          endif

        

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

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

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

          

      END SUB


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

      GLOBAL SUB btn_cgrab()

          if grab_switch =1 then                 '如果已經(jīng)處于連續(xù)執(zhí)行狀態(tài),打印提示信息并退出函數(shù)

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

           return 

          endif

        

          if( d_use_imgfile =0) then 

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

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

              return 

              endif

          endif

        

          grab_switch = 1                         '采集任務(wù)開關(guān)置1

             if (1 = grab_switch) then

                  if (0 = PROC_STATUS(grab_task_id)) then

                       RUNTASK  grab_task_id, grab_task    '開啟連續(xù)采集任務(wù)

                  endif

             endif

        

      END SUB


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

      grab_task:

          while(1)

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

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

              endif

                

              '重復(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

      8.點(diǎn)擊“元件”→“新建窗口”,新建標(biāo)定界面窗口,并將《VPLC系列機(jī)器視覺運(yùn)動(dòng)控制一體機(jī)快速入門(六)》中的標(biāo)定程序的界面拷貝到新建的窗口界面。


      image.png


      9.在main.bas文件中添加運(yùn)行界面按下【標(biāo)定】按鈕時(shí)的響應(yīng)函數(shù),以及標(biāo)定窗口界面按下【提取mark點(diǎn)】按鈕、【標(biāo)定】按鈕以及【返回】按鈕時(shí)響應(yīng)的函數(shù),可參考《VPLC系列機(jī)器視覺運(yùn)動(dòng)控制一體機(jī)快速入門(六)》中的標(biāo)定程序。


      '點(diǎn)擊運(yùn)行界面按下標(biāo)定按鈕時(shí)響應(yīng)的函數(shù)

      GLOBAL SUB btn_calib()

          '設(shè)置坐標(biāo)標(biāo)定窗口鎖存通道0的鎖存大小

          ZV_LATCHSETSIZE(0, HMI_ConTROLSIZEX(11, 91), HMI_ConTROLSIZEY(11, 91)) 

          if (d_use_imgfile=1) then   '如果使用本地圖片功能

          ZV_IMGREAD(grabImg,"圓定位calib.bmp",0)  '加載標(biāo)定圖片

          endif

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

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

          HMI_SHOWWINDOW(11)         '彈出窗口號(hào)為11的坐標(biāo)標(biāo)定窗口界面

         

      END SUB


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

      GLOBAL SUB btn_ca_extract()

          for i=0 to 17           '初始化圓點(diǎn)矩陣像素坐標(biāo)    

             TABLE(81+i)=0

          next

        

          for i=0 to 17           '初始化圓點(diǎn)矩陣世界坐標(biāo)    

             TABLE(131+i)=0

          next

          TABLE(39)=0             '提取mark點(diǎn)狀態(tài)默認(rèn)為失敗

          ZVOBJECT inppts, ppts, wpts

          

          '根據(jù)提取像素參數(shù)提取像素坐標(biāo),存放到inppts矩陣中

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

          '獲取矩陣inppts中的數(shù)據(jù)信息,存放到table(56)中

          ZV_MATINFO (inppts, 56)

          

          DIM row,col

          row = TABLE(56)   '矩陣行數(shù)賦值給row變量

          col = TABLE(57)   '矩陣列數(shù)賦值給col變量

          if(row * col = 18) then '如果獲取到9個(gè)圓點(diǎn)的圓心位置坐標(biāo)x,y   

              TABLE(39) = 1 '窗口界面提示提取mark點(diǎn)成功

          else

              TABLE(39) = 0 '窗口界面提示提取mark點(diǎn)失敗

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

          endif

          

          '根據(jù)mrak點(diǎn)間距和像素坐標(biāo)計(jì)算世界坐標(biāo),存放到wpts矩陣

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

          '獲取矩陣ppts中的數(shù)據(jù)信息,存放到table(56)中

          ZV_MATINFO (ppts, 56)

          

          row = TABLE(56)  '矩陣行數(shù)賦值給row變量

          col = TABLE(57)  '矩陣列數(shù)賦值給col變量

          if(row * col = 18) then'如果獲取到9個(gè)圓點(diǎn)的圓心位置坐標(biāo)x,y 

              TABLE(39) = 1 '窗口界面提示提取mark點(diǎn)成功

          else

            TABLE(39) = 0 '窗口界面提示提取mark點(diǎn)失敗

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

          endif

           

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

          DIM i

          FOR i=0 TO row-1

              ZV_MATGETROW (ppts, i, col, 81 + i*col)'將像素坐標(biāo)存放到table81~table98中

              ZV_MATGETROW (wpts, i, col, 131 + i*col)'將世界坐標(biāo)存放到table131~table148中

          NEXT

          

          '將灰度圖轉(zhuǎn)成RGB圖像,作為結(jié)果圖像

          ZVOBJECT color

          ZV_GRAYTORGB(grabImg, color)

          

          '繪制mark點(diǎn)的十字架

          DIM j, pixNum 

          pixNum = 0

          FOR i=0 TO 2

              FOR j=0 TO 2

                  '繪制mark標(biāo)記點(diǎn)

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

                pixNum = pixNum + 1

              NEXT

          NEXT

          

          '用文本繪制mark點(diǎn)的序號(hào),顯示在圖像界面中

          FOR i=0 TO 8

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

          NEXT

        

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

        

      END SUB


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

      GLOBAL SUB btn_ca_calib()

          ZV_IMGINFO(grabImg,0)  '獲取采集圖像信息

          '根據(jù)像素坐標(biāo)數(shù)據(jù)組和世界坐標(biāo)數(shù)據(jù)組執(zhí)行標(biāo)定,獲得標(biāo)定系數(shù)ca_param

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

          is_ca_success=1 '標(biāo)定成功標(biāo)志置1

          

          ZV_CALERROR(ca_param, ppts, wpts, 0)'計(jì)算標(biāo)定誤差,并將結(jié)果存放在起始地址為0的數(shù)組中

          ca_min_err = TABLE(1) '將誤差結(jié)果賦值給變量,用于在界面中實(shí)時(shí)顯示誤差結(jié)果

          ca_max_err = TABLE(2)

          ca_avg_err = TABLE(0)

        

      END SUB


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

      GLOBAL SUB btn_ca_param_rtn()

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

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

          btn_grab()

          HMI_CLOSEWINDOW(11)   '關(guān)閉窗口號(hào)為13的坐標(biāo)標(biāo)定窗口界面

        

      END SUB

      10.在main.bas文件中添加HMI運(yùn)行界面按下測(cè)試按鈕響應(yīng)的函數(shù),并關(guān)聯(lián)動(dòng)作函數(shù)名。


      'HMI界面按下測(cè)試按鈕時(shí)響應(yīng)的函數(shù)

      GLOBAL SUB btn_test()

          TABLE(6)=0   '檢測(cè)前先將結(jié)果數(shù)據(jù)清0

          d_detect_time=0

          for i=0 to 17

              d_circle_rst(i)=0

          next

        

          TICKS=0

          '定義變量,依次為白色像素連通區(qū)域,掩模區(qū)域,黑色像素連通區(qū)域,連通區(qū)域結(jié)果列表,小圓斑點(diǎn)區(qū)域,圓測(cè)量器,中間結(jié)果變量

          ZVOBJECT regionWhite, regionMask, regionBlack,re_connecte,circle_connect,mr,tmp

          

           '生成全圖像區(qū)域

          ZV_REGENFULLIMG(grabImg,regionMask)

        

          '二值化處理

          if d_detect_param(0) = 0 then    '如果選擇手動(dòng)閾值模式

                '根據(jù)低閾值和高閾值參數(shù)生成白色像素圖像regionWhite

              ZV_RETHRESH(grabImg, regionMask, regionWhite, d_detect_param(1), d_detect_param(2))

              '對(duì)白色像素區(qū)域進(jìn)行一次1*1的開運(yùn)算

              ZV_REOPENING(regionWhite,regionWhite,d_deal_value(0),d_deal_value(0))

              '對(duì)白色像素區(qū)域進(jìn)行一次1*1的閉運(yùn)算

              ZV_RECLOSING(regionWhite,regionWhite,d_deal_value(1),d_deal_value(1))

          

          else                             '如果選擇自動(dòng)閾值模式

          

              Dim autoThresh               '定義自動(dòng)閾值模式下的二值化閾值

              '在grabImg圖像中的指定區(qū)域內(nèi)對(duì)圖像進(jìn)行自動(dòng)二值化處理,輸出二值化區(qū)域regionWhite 

              ZV_REAUTOTHRESH(grabImg, regionMask, regionWhite, 0)

              '對(duì)白色像素區(qū)域進(jìn)行一次1*1的開運(yùn)算

              ZV_REOPENING(regionWhite,regionWhite,d_deal_value(0),d_deal_value(0))

              '對(duì)白色像素區(qū)域進(jìn)行一次1*1的閉運(yùn)算

              ZV_RECLOSING(regionWhite,regionWhite,d_deal_value(1),d_deal_value(1))

              autoThresh = TABLE(0)

              ? "autoThresh = " autoThresh  '打印提示信息,當(dāng)前二值化閾值

            

          endif

          

          '計(jì)算BLOB面積

          

          ZV_REAREA(regionWhite, 2)              '計(jì)算regionWhite亮區(qū)域的面積,存放到table(2)中

            

          if(TABLE(2)>0) then '如果獲取到的白色像素?cái)?shù)量大于0                 

               ZV_REConNECT(regionWhite,re_connecte)     '計(jì)算區(qū)域的連通區(qū)域,存放到re_connecte列表中

               zv_refilter(re_connecte,0,d_detect_param(3),d_detect_param(4),0)'對(duì)區(qū)域列表中的區(qū)域進(jìn)行過濾,保留面積在 d_detect_param(3) 到 d_detect_param(4) 的區(qū)域,面積不在此范圍的區(qū)域?qū)⒈贿^濾掉

               zv_refilter(re_connecte,20,0.8,1.3,0)'對(duì)區(qū)域列表中的區(qū)域進(jìn)行過濾,保留最小外接矩形高寬比在0.9 到 1.1 的區(qū)域,面積不在此范圍的區(qū)域?qū)⒈贿^濾掉

               ZV_RESORT(re_connecte,1,1)          '對(duì)區(qū)域列表中的區(qū)域按照重心X的數(shù)據(jù)進(jìn)行升序排序

               ZV_LISTCOUNT(re_connecte,6)     '獲取列表中的連通區(qū)域的數(shù)量,存放到table(6)中 

          endif  

          

          '繪制效果圖

          Dim width, height

          ZV_IMGINFO (grabImg, 20)'獲取grabImg的圖像信息

          width = TABLE(20)

          height = TABLE(21)

          

          ZV_GRAYTORGB(grabImg,disImg)'將灰度圖轉(zhuǎn)換到RGB圖像,用于繪制檢測(cè)結(jié)果圖像

          

          ZV_REGION(disImg, regionMask, 0, ZV_COLOR(0,0,0))      '在disImg中繪制黑色的regionMask區(qū)域

          ZV_REGION(disImg, regionWhite, 0, ZV_COLOR(255,255,255))'在disImg中繪制白色的regionWhite區(qū)域

          

          for i=0 to TABLE(6)-1     '循環(huán)獲取小圓斑點(diǎn)的位置XY信息生成圓測(cè)量器,檢測(cè)圓心位置

                ZV_LISTGET(re_connecte,circle_connect,i)   '獲取列表中序號(hào)為i的元素,即依次獲取列表中小圓斑點(diǎn)的連通區(qū)域

                ZV_REAREACENTER(circle_connect,40)  '計(jì)算斑點(diǎn)區(qū)域的面積與中心位置,將位置放入TABLE(40)中

                  ZV_MRGENCIRCLE(mr,TABLE(41),TABLE(42),70,50,0,360,1,10,8) '生成圓測(cè)量區(qū)域

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

                ZV_MRSETADV(mr,5, 50, 1,0)

                

                TABLE( 46, 0, 0, 0)'初始化結(jié)果數(shù)組

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

                ZV_MRCIRCLE(mr, grabImg, tmp, 46)

                 

                ZV_CIRCLE(disImg,TABLE(46),TABLE(47),TABLE(48),zv_color(0,255,0))'繪制小圓結(jié)果

                ShowString=TOSTR(i,1,0)   '將BLOB的數(shù)量轉(zhuǎn)換成字符串變量

                ZV_TEXT(disImg,ShowString,TABLE(46),TABLE(47),55,ZV_COLOR(0,0,255)) '顯示結(jié)果文本  

                ZV_MARKER(disImg,TABLE(46),TABLE(47),0,50,zv_color(0,255,0))   '在圖像img中繪制十字

                

                if is_ca_success=1 AND d_use_calib=1 then 

                    ZV_CALTRANSW(ca_param, TABLE(46)+TABLE(48),TABLE(47),49) '圓心加半徑的坐標(biāo)

                    ZV_CALTRANSW(ca_param, TABLE(46),TABLE(47),46) '使用標(biāo)定系數(shù)將圖像坐標(biāo)轉(zhuǎn)換成世界坐標(biāo)

                    d_circle_rst(i*3+0)=TABLE(46)'將測(cè)量圓的結(jié)果賦值給圓心變量,顯示到界面中

                    d_circle_rst(i*3+1)=TABLE(47)

                    d_circle_rst(i*3+2)=ZV_DISTPP(TABLE(46),TABLE(47),TABLE(49),TABLE(50))

                else 

                    d_circle_rst(i*3+0)=TABLE(46)'將測(cè)量圓的結(jié)果賦值給圓心變量,顯示到界面中

                    d_circle_rst(i*3+1)=TABLE(47)

                    d_circle_rst(i*3+2)=TABLE(48)

           endif      

           next

           ZV_LATCH(disImg, 0)     '在鎖存通道0中顯示結(jié)果圖像

           d_detect_time=ABS(TICKS)'計(jì)算檢測(cè)消耗時(shí)間

          

      END SUB

      image.png


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


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

      GLOBAL SUB btn_run()

          if(2 = main_task_state) then           '如果主任務(wù)處于運(yùn)行狀態(tài),打印提示信息并退出函數(shù)

           ?"已經(jīng)開啟連續(xù)運(yùn)行任務(wù),請(qǐng)勿重復(fù)操作!"

          return 

          endif

         

          if (1 = main_task_state) then          '如果主任務(wù)處于停止?fàn)顟B(tài)

              if (0 = PROC_STATUS(main_task_id)) then '如果任務(wù)未開啟

                  main_task_state = 2            '主任務(wù)狀態(tài)設(shè)置為2,表示正在執(zhí)行連續(xù)任務(wù)

                  RUNTASK  main_task_id, main_task  '開啟主任務(wù)

              endif

          endif


      END SUB


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

      main_task:

          while(1)

              if (3 = main_task_state) then      '如果主任務(wù)狀態(tài)處于3即按下停止按鈕時(shí)

                  main_task_state = 1             '將主任務(wù)狀態(tài)置為1

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

              endif

              

              '重復(fù)執(zhí)行采集和檢測(cè)函數(shù)

              btn_grab()

              btn_test()     

          wend

      END

      image.png


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


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

      GLOBAL SUB btn_stop()

          if (2 = main_task_state) then   '如果主任務(wù)狀態(tài)處于3即正在連續(xù)執(zhí)行任務(wù)時(shí)

              main_task_state = 3           '將主任務(wù)狀態(tài)置為3,退出循環(huán)

          endif  

      END SUB

      image.png


      image.png


      image.png


      image.png


      仿真演示效果4


      本次,正運(yùn)動(dòng)技術(shù)機(jī)器視覺運(yùn)動(dòng)控制一體機(jī)應(yīng)用例程(三) BLOB分析的多圓定位,就分享到這里。


      更多精彩內(nèi)容請(qǐng)關(guān)注“正運(yùn)動(dòng)小助手”公眾號(hào),需要相關(guān)開發(fā)環(huán)境與例程代碼,請(qǐng)咨詢正運(yùn)動(dòng)技術(shù)銷售工程師:400-089-8936。


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


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

      上一篇: 機(jī)器視覺運(yùn)動(dòng)控制一體

      推薦產(chǎn)品

      更多
      主站蜘蛛池模板: 色综合久久天天综合绕观看| 伊人久久亚洲综合影院首页| 综合五月激情五月开心婷婷| 无码专区久久综合久中文字幕| 国产色婷婷五月精品综合在线| 久久综合精品视频| 伊人色综合一区二区三区影院视频 | 开心婷婷五月激情综合社区| 日韩综合在线视频| 丁香婷婷色五月激情综合深爱| 久久久久久综合一区中文字幕| 亚洲国产成人综合| 激情综合色综合啪啪开心| 亚洲综合在线视频| 色噜噜狠狠狠综合曰曰曰| 国产成人亚洲综合一区| 国产亚洲综合网曝门系列| 伊人伊成久久人综合网777| 久久综合九色综合97伊人麻豆| 五月天激情综合网丁香婷婷 | 久久亚洲精品成人综合| 色天天综合色天天看| 亚洲综合激情六月婷婷在线观看| 区二区三区激情综合| 色天使久久综合给合久久97色| 日韩亚洲人成在线综合日本| 亚洲VA综合VA国产产VA中| 一本色道久久综合狠狠躁篇| 色欲天天婬色婬香视频综合网| 国产综合久久久久| 久久综合九色综合97免费下载| 久久久综合香蕉尹人综合网| 久久93精品国产91久久综合| 色天天综合色天天看| 综合91在线精品| 图片区精品综合自拍| 九九综合九九综合| 国产成人麻豆亚洲综合无码精品| 伊人久久大香线蕉综合爱婷婷| 日日狠狠久久偷偷色综合96蜜桃| 色偷偷尼玛图亚洲综合|