日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HALCON示例程序check_blister.hdev药品胶囊检测

發(fā)布時(shí)間:2023/12/10 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HALCON示例程序check_blister.hdev药品胶囊检测 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

HALCON check_blister.hdev藥品膠囊檢測(cè)

示例程序源碼(加注釋)

  • 顯示、讀入圖片、設(shè)置顯示字體等,之前的帖子已經(jīng)介紹過了
    dev_close_window ()
    dev_update_off ()
    read_image (ImageOrig, ‘blister/blister_reference’)
    dev_open_window_fit_image (ImageOrig, 0, 0, -1, -1, WindowHandle)
    set_display_font (WindowHandle, 14, ‘mono’, ‘true’, ‘false’)
    dev_set_draw (‘margin’)
    dev_set_line_width (3)

  • 第一步,我們創(chuàng)建一個(gè)圖案,以便在后續(xù)的水泡圖像中輕松切出腔室。

  • access_channel - 訪問多通道圖像中的指定的一個(gè)通道。這里選取Image1的第一個(gè)通道
    access_channel (ImageOrig, Image1, 1)

  • 進(jìn)行閾值分割,選取灰度值在90-255的區(qū)域
    threshold (Image1, Region, 90, 255)

  • 使用shape_trans對(duì)區(qū)域Region處理,提取Region的外框,convex功能是外框
    shape_trans (Region, Blister, ‘convex’)

  • orientation_region計(jì)算區(qū)域的方向,這個(gè)算子是基于elliptic_axis 算子來的,elliptic_axis 是求取等效的橢圓,所以用算子orientation_region相當(dāng)于把區(qū)域Blister轉(zhuǎn)化為一個(gè)等效橢圓,計(jì)算這個(gè)橢圓的長(zhǎng)軸在圖像中的角度。
    orientation_region (Blister, Phi)

  • 求取區(qū)域Blister的面積與中心坐標(biāo)。
    area_center (Blister, Area1, Row, Column)

  • vector_angle_to_rigid - 根據(jù)初始坐標(biāo)(前3個(gè)參數(shù))與仿射變換后的坐標(biāo)與角度(4-6,三個(gè)參數(shù))角度生成一個(gè)旋轉(zhuǎn)與平移的仿射變換矩陣HomMat2D。這里初始坐標(biāo)與結(jié)束坐標(biāo)都沒有變化只是角度旋轉(zhuǎn)到了0度。
    vector_angle_to_rigid (Row, Column, Phi, Row, Column, 0, HomMat2D)

  • affine_trans_image - 對(duì)圖像進(jìn)行任意的2D仿射變換。ImageOrig:要進(jìn)行仿射變換的圖像;Image2:仿射變換之后的圖像;HomMat2D:2D仿射變換矩陣;constant:進(jìn)行仿射變換的方式,這個(gè)代表使用均值濾波器來防止混疊效應(yīng)的發(fā)生。false:仿射變換后的圖片超出現(xiàn)有圖片大小的區(qū)域不被剪切掉;若為true則相反。
    affine_trans_image (ImageOrig, Image2, HomMat2D, ‘constant’, ‘false’)

  • 生成一個(gè)空的對(duì)象Chambers
    gen_empty_obj (Chambers)

    for I := 0 to 4 by 1Row := 88 + I * 70for J := 0 to 2 by 1Column := 163 + J * 150* * 生成一個(gè)可旋轉(zhuǎn)的矩形;* 前兩個(gè)參數(shù)是區(qū)域中心坐標(biāo),第三個(gè)參數(shù)是矩形角度,后兩個(gè)參數(shù)是矩形的寬高。gen_rectangle2 (Rectangle, Row, Column, 0, 64, 30)* * concat_obj - 把兩個(gè)對(duì)象融合在一起。* 注意,這個(gè)和union不一樣,union是把兩個(gè)對(duì)象整合成一個(gè)對(duì)象,整合后對(duì)象的元素個(gè)數(shù)為1;* 而使用concat_obj 是把幾個(gè)對(duì)象聯(lián)合成一個(gè)對(duì)象,這個(gè)對(duì)象中的元素個(gè)數(shù)之和不變。concat_obj (Chambers, Rectangle, Chambers)endforendfor
  • 使用變換矩陣HomMat2D對(duì)Blister區(qū)域使用nearest_neighbor方法進(jìn)行仿射變換。
    affine_trans_region (Blister, Blister, HomMat2D, ‘nearest_neighbor’)

  • 求取區(qū)域Blister與區(qū)域Chambers的差集
    difference (Blister, Chambers, Pattern)

  • 將區(qū)域Chambers(有多個(gè)元素)聯(lián)合成一個(gè)區(qū)域(一個(gè)元素)
    union1 (Chambers, ChambersUnion)

  • 求取區(qū)域Blister的角度
    orientation_region (Blister, PhiRef)

  • 將角度PhiRef加180度
    PhiRef := rad(180) + PhiRef

  • 求取區(qū)域Blister的面積與中心坐標(biāo)
    area_center (Blister, Area2, RowRef, ColumnRef)

  • 循環(huán)檢測(cè)每一張圖片

  • 定義變量Count 賦值6
    Count := 6

  • for循環(huán)
    for Index := 1 to Count by 1

    • 讀入圖片
      read_image (Image, ‘blister/blister_’ + Index$‘02’)

    • 對(duì)圖片Image進(jìn)行閾值分割,提取像素灰度值在90-255的區(qū)域
      threshold (Image, Region, 90, 255)

    • 分割連通域
      connection (Region, ConnectedRegions)

    • 使用select_shape 對(duì)區(qū)域ConnectedRegions進(jìn)行篩選,篩選出面積值介于5000-999999的區(qū)域
      select_shape (ConnectedRegions, SelectedRegions, ‘a(chǎn)rea’, ‘a(chǎn)nd’, 5000, 9999999)

    • 求取區(qū)域SelectedRegions的外形
      shape_trans (SelectedRegions, RegionTrans, ‘convex’)

    • 求取區(qū)域RegionTrans的角度
      orientation_region (RegionTrans, Phi)

    • 求取區(qū)域RegionTrans的面積與中心坐標(biāo)
      area_center (RegionTrans, Area3, Row, Column)

    • 生成仿射變換矩陣HomMat2D
      vector_angle_to_rigid (Row, Column, Phi, RowRef, ColumnRef, PhiRef, HomMat2D)

    • 使用HomMat2D矩陣對(duì)Image進(jìn)行仿射變換
      affine_trans_image (Image, ImageAffinTrans, HomMat2D, ‘constant’, ‘false’)

    • 使用區(qū)域剪切圖片,縮小圖像處理定義域
      reduce_domain (ImageAffinTrans, ChambersUnion, ImageReduced)

    • 將圖片ImageReduced分成R/G/B三通道圖像
      decompose3 (ImageReduced, ImageR, ImageG, ImageB)

    • var_threshold - 通過局部均值和標(biāo)準(zhǔn)差分析對(duì)圖像進(jìn)行閾值處理。
      var_threshold (ImageB, Region, 7, 7, 0.2, 2, ‘dark’)

    • 分割連通域
      connection (Region, ConnectedRegions0)

    • 使用矩形對(duì)區(qū)域進(jìn)行閉運(yùn)算
      closing_rectangle1 (ConnectedRegions0, ConnectedRegions, 3, 3)

    • 填充孔洞
      fill_up (ConnectedRegions, RegionFillUp)

    • 進(jìn)行面積篩選
      select_shape (RegionFillUp, SelectedRegions, ‘a(chǎn)rea’, ‘a(chǎn)nd’, 1000, 99999)

    • 使用圓形元素對(duì)區(qū)域進(jìn)行開運(yùn)算
      opening_circle (SelectedRegions, RegionOpening, 4.5)

    • 分割連通域
      connection (RegionOpening, ConnectedRegions)

    • 進(jìn)行面積篩選
      select_shape (ConnectedRegions, SelectedRegions, ‘a(chǎn)rea’, ‘a(chǎn)nd’, 1000, 99999)

    • 求取區(qū)域輪廓
      shape_trans (SelectedRegions, Pills, ‘convex’)

    • 對(duì)區(qū)域Chambers進(jìn)行計(jì)數(shù)
      count_obj (Chambers, Number)

    • 生成一個(gè)空的對(duì)象
      gen_empty_obj (WrongPill)

    • 生成一個(gè)空的對(duì)象
      gen_empty_obj (MissingPill)

    • for循環(huán)
      for I := 1 to Number by 1

      • 在對(duì)象數(shù)組中選取指定對(duì)象,之前例子已經(jīng)講過了
        select_obj (Chambers, Chamber, I)
      • 求交集
        intersection (Chamber, Pills, Pill)
      • 求取區(qū)域面積與中心坐標(biāo)值
        area_center (Pill, Area, Row1, Column1)

      if (Area > 0)
      * 求取最大最小的灰度值,之前例子已經(jīng)講過了
      min_max_gray (Pill, ImageB, 0, Min, Max, Range)
      if (Area < 3800 or Min < 60)
      * 聯(lián)合對(duì)象,上邊有介紹
      concat_obj (WrongPill, Pill, WrongPill)
      endif
      else
      * 聯(lián)合對(duì)象,上邊有介紹
      concat_obj (MissingPill, Chamber, MissingPill)
      endif
      endfor

    • 下面的就是顯示了
      dev_clear_window ()
      dev_display (ImageAffinTrans)
      dev_set_color (‘forest green’)
      count_obj (Pills, NumberP)
      count_obj (WrongPill, NumberWP)
      count_obj (MissingPill, NumberMP)
      dev_display (Pills)
      if (NumberMP > 0 or NumberWP > 0)
      disp_message (WindowHandle, ‘Not OK’, ‘window’, 10, 10 + 600, ‘red’, ‘true’)
      else
      disp_message (WindowHandle, ‘OK’, ‘window’, 10, 10 + 600, ‘forest green’, ‘true’)
      endif
      disp_message (WindowHandle, '# correct pills: ’ + (NumberP - NumberWP), ‘window’, 10, 10, ‘black’, ‘true’)
      disp_message (WindowHandle, '# wrong pills : ’ + NumberWP, ‘window’, 10 + 25, 10, ‘black’, ‘true’)
      if (NumberWP > 0)
      disp_message (WindowHandle, NumberWP, ‘window’, 10 + 25, 10 + 180, ‘red’, ‘true’)
      endif
      disp_message (WindowHandle, '# missing pills: ’ + NumberMP, ‘window’, 10 + 50, 10, ‘black’, ‘true’)
      if (NumberMP > 0)
      disp_message (WindowHandle, NumberMP, ‘window’, 10 + 50, 10 + 180, ‘red’, ‘true’)
      endif
      dev_set_color (‘red’)
      dev_display (WrongPill)
      dev_display (MissingPill)
      if (Index < Count)
      disp_continue_message (WindowHandle, ‘black’, ‘true’)
      endif
      stop ()
      endfor

處理思路

在這個(gè)例子是藥品行業(yè)膠囊的檢測(cè),是比較經(jīng)典的例子,我們下一篇文章介紹另一個(gè)膠囊檢測(cè)例子。這個(gè)膠囊檢測(cè)首先用到了仿射變換,把每個(gè)膠囊的單元提取出來,然后使用最簡(jiǎn)單的blob分析對(duì)缺陷進(jìn)行提取。

后記

大家有什么問題可以向我提問哈,我看到了第一時(shí)間回復(fù),希望在學(xué)習(xí)的路上多多結(jié)交良師益友。

總結(jié)

以上是生活随笔為你收集整理的HALCON示例程序check_blister.hdev药品胶囊检测的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。