HALCON示例程序check_blister.hdev藥品膠囊檢測

HALCON check_blister.hdev藥品膠囊檢測

示例程序源碼(加注釋)

  • 顯示、讀入圖片、設置顯示字體等,之前的帖子已經介紹過了
    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)

  • 第一步,我們創建一個圖案,以便在后續的水泡圖像中輕松切出腔室。

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

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

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

  • orientation_region計算區域的方向,這個算子是基于elliptic_axis 算子來的,elliptic_axis 是求取等效的橢圓,所以用算子orientation_region相當于把區域Blister轉化為一個等效橢圓,計算這個橢圓的長軸在圖像中的角度。
    orientation_region (Blister, Phi)

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

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

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

  • 生成一個空的對象Chambers
    gen_empty_obj (Chambers)

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

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

  • 將區域Chambers(有多個元素)聯合成一個區域(一個元素)
    union1 (Chambers, ChambersUnion)

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

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

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

  • 循環檢測每一張圖片

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

  • for循環
    for Index := 1 to Count by 1

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

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

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

    • 使用select_shape 對區域ConnectedRegions進行篩選,篩選出面積值介于5000-999999的區域
      select_shape (ConnectedRegions, SelectedRegions, ‘area’, ‘and’, 5000, 9999999)

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

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

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

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

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

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

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

    • var_threshold - 通過局部均值和標準差分析對圖像進行閾值處理。
      var_threshold (ImageB, Region, 7, 7, 0.2, 2, ‘dark’)

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

    • 使用矩形對區域進行閉運算
      closing_rectangle1 (ConnectedRegions0, ConnectedRegions, 3, 3)

    • 填充孔洞
      fill_up (ConnectedRegions, RegionFillUp)

    • 進行面積篩選
      select_shape (RegionFillUp, SelectedRegions, ‘area’, ‘and’, 1000, 99999)

    • 使用圓形元素對區域進行開運算
      opening_circle (SelectedRegions, RegionOpening, 4.5)

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

    • 進行面積篩選
      select_shape (ConnectedRegions, SelectedRegions, ‘area’, ‘and’, 1000, 99999)

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

    • 對區域Chambers進行計數
      count_obj (Chambers, Number)

    • 生成一個空的對象
      gen_empty_obj (WrongPill)

    • 生成一個空的對象
      gen_empty_obj (MissingPill)

    • for循環
      for I := 1 to Number by 1

      • 在對象數組中選取指定對象,之前例子已經講過了
        select_obj (Chambers, Chamber, I)
      • 求交集
        intersection (Chamber, Pills, Pill)
      • 求取區域面積與中心坐標值
        area_center (Pill, Area, Row1, Column1)

      if (Area > 0)
      * 求取最大最小的灰度值,之前例子已經講過了
      min_max_gray (Pill, ImageB, 0, Min, Max, Range)
      if (Area < 3800 or Min < 60)
      * 聯合對象,上邊有介紹
      concat_obj (WrongPill, Pill, WrongPill)
      endif
      else
      * 聯合對象,上邊有介紹
      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

處理思路

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

后記

大家有什么問題可以向我提問哈,我看到了第一時間回復,希望在學習的路上多多結交良師益友。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/255291.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/255291.shtml
英文地址,請注明出處:http://en.pswp.cn/news/255291.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【機器學習實戰】——常見函數積累

目錄 第二章 k近鄰算法 1、array.sum(axies 1) : 2、array.argsort(axies0/1) 3、array.tile(mat,(m,n)) 4、dict.get(key,value) 5、sorted函數 6、string.strip()函數 7、string.split() 8、scatter&#xff08;&#xff09;函數 9、min()&max() 10、enumera…

安裝oracle 11g 客戶端,檢查過程中報物理內存不足的解決

今早接到同事電話&#xff0c;說安裝oracle 11g客戶端的時候&#xff0c;在檢查先決條件的時候&#xff0c;報錯&#xff0c;說內存不足&#xff0c;但是本機的內存是2G&#xff0c;肯定夠用&#xff1a;如圖&#xff1a; 找了一圈&#xff0c;原來Oracle執行先決條件檢查是依賴…

智能時代 軟件賦能——2017中國軟件技術大會

由中國科學院軟件研究所、中科軟科技股份有限公司聯合主辦&#xff0c;北京中科凱亞科技有限公司協辦的第15屆中國軟件技術大會將于2017年12月在北京 國家會議中心隆重舉行。 毋庸置疑&#xff0c;我們正在邁入智能時代&#xff0c;伴隨著物聯網、云計算、大數據、人工智能等智…

Arduino 代碼機制

新建一個Arduino程序。可是建完就郁悶了&#xff0c;因為只看到了setup和loop函數&#xff0c;卻沒有基本的c函數。 void setup() {// put your setup code here, to run once: }void loop() {// put your main code here, to run repeatedly: }于是好奇心就來了&#xff0c;當…

Codeforces Round #401 (Div. 2) D. Cloud of Hashtags

題目鏈接&#xff1a;D. Cloud of Hashtags 題意&#xff1a; 給你n個字符串&#xff0c;讓你刪后綴&#xff0c;使得這些字符串按字典序排列&#xff0c;要求是刪除的后綴最少 題解&#xff1a; 由于n比較大&#xff0c;我們可以將全部的字符串存在一個數組里面&#xff0c;然…

HALCON示例程序check_blister_mixed.hedv藥品膠囊缺陷檢測

HALCON示例程序check_blister_mixed.hedv藥品膠囊缺陷檢測 示例程序源碼&#xff08;加注釋&#xff09; 讀入圖片與顯示相關設置 dev_close_window () read_image (Image, ‘blister/blister_mixed_reference’) dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHan…

php類與對象

1.類與對象 對象&#xff1a;實際存在該類事物中每個實物的個體。$a new User(); 實例化后的$a 引用&#xff1a;php的別名&#xff0c;兩個不同的變量名字指向相同的內容 封裝: 把對象的屬性和方法組織在一個類&#xff08;邏輯單元&#xff09;里 繼承&#xff1a;以原有的類…

【深度學習系列】基礎知識、模型學習

基礎知識 原創 【深度學習】——訓練過程 原創 【深度學習】——BN層&#xff08;batch normalization&#xff09; 原創 【深度學習】——激活函數&#xff08;sigmoid、tanh、relu、softmax&#xff09; 原創 【深度學習】——損失函數 原創 【深度學習】——梯度下…

史陶比爾機器人的 LLI (Low Level Interface)

史陶比爾機器人的 LLI &#xff08;Low Level Interface&#xff09; 史陶比爾機器人擁有 Low Level Interface (LLI)接口選項. 在CS8C控制器的時代&#xff0c;LLI 接口仍然可用。這是一個選項接口。.這是除了VAL3編程語言之外的替代操作系統。通過C程序替代你的程序。 這里的…

陽獅集團與阿里巴巴全域營銷伙伴關系再升級:數據和業務合作將更緊密

3月6日&#xff0c;阿里巴巴集團與全球領先的廣告傳播集團陽獅集團在上海開啟了主題為“新局面新高度”新階段的合作溝通&#xff0c;未來雙方將進行更緊密的數據和業務層面的合作。阿里巴巴集團CMO、阿里媽媽總裁董本洪及陽獅媒體大中華區首席執行官張敬鸞就開放共贏達成共識&…

HALCON示例程序check_bottle_crate.hdev啤酒箱內酒瓶數檢測

HALCON示例程序check_bottle_crate.hdev啤酒箱內酒瓶數檢測 示例程序源碼&#xff08;加注釋&#xff09; 獲取系統關于“空白區域儲存的設置” get_system (‘store_empty_region’, StoreEmptyRegion)系統“空白區域儲存”設置為 ‘false’ set_system (‘store_empty_regi…

#undef 標識符

#undef 是在后面取消以前定義的宏定義 該指令的形式為 #undef 標識符 其中&#xff0c;標識符是一個宏名稱。如果標識符當前沒有被定義成一個宏名稱&#xff0c;那么就會忽略該指令。一旦定義預處理器標識符&#xff0c;它將保持已定義狀態且在作用域內&#xff0c;直到程序結束…

[轉]OpenGL庫介紹

原帖地址&#xff1a;http://blog.csdn.net/yyyuhan/archive/2008/01/15/2045009.aspx 開發基于OpenGL的應用程序&#xff0c;必須先了解OpenGL的庫函數。它采用C語言風格&#xff0c;提供大量的函數來進行圖形的處理和顯示。OpenGL庫函數的命名方式非常有規律。所有OpenGL函數…

SQL Server優化50法

查詢速度慢的原因很多&#xff0c;常見如下幾種&#xff1a; 1、沒有索引或者沒有用到索引(這是查詢慢最常見的問題&#xff0c;是程序設計的缺陷) 2、I/O吞吐量小&#xff0c;形成了瓶頸效應。 3、沒有創建計算列導致查詢不優化。 4、內存不足 5、網絡速度慢 …

HALCON示例程序check_fish_stick_dimension.hdev生魚棒尺寸測量;基于形態學的像素級精度尺寸測量

HALCON示例程序check_fish_stick_dimension.hdev基于形態學的像素級精度尺寸測量 示例程序源碼&#xff08;加注釋&#xff09; 關閉實時顯示更新 dev_update_off () 關閉窗口 dev_close_window () 讀入圖片 read_image (Image, ‘food/fish_sticks_raw_01’) 根據給定長寬…

單片機平臺的最小偏差圓弧插補算法

在CNC機床的G代碼中&#xff0c;最常見的有G0、G1、G2、G3代碼&#xff0c;分別表示直線和圓弧插補&#xff0c;直線插補對于單片機來說&#xff0c;比較容易實現&#xff0c;只需要將位移增量轉換為脈沖增量然后輸出給步進電機就可以了&#xff0c;但對于圓弧插補&#xff0c;…

javascript基礎--數組排序

字符串的排序 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>數組排序</title><script>var arr [fliar, asdf, dfe, loii, yhhl];arr.sort();alert(arr);</script> </head>&…

【轉】JS跨域(ajax跨域、iframe跨域)解決方法及原理詳解(jsonp)

這里說的js跨域是指通過js在不同的域之間進行數據傳輸或通信&#xff0c;比如用ajax向一個不同的域請求數據&#xff0c;或者通過js獲取頁面中不同域的框架中(iframe)的數據。只要協議、域名、端口有任何一個不同&#xff0c;都被當作是不同的域。 下表給出了相對http://store.…

Lua基本語法-lua與C#的交互(相當簡單詳細的例子)

lua腳本 與 C#的交互 本文提供全流程&#xff0c;中文翻譯。Chinar堅持將簡單的生活方式&#xff0c;帶給世人&#xff01;&#xff08;擁有更好的閱讀體驗 —— 高分辨率用戶請根據需求調整網頁縮放比例&#xff09; 1Lua And C# —— Lua 和 C#的交互準備工作 2C# Create Lu…

漫談程序員系列:千奇百怪的程序員

干開發時間長了&#xff0c;遇見好多好玩兒的程序員。 看看你躺槍了沒。 博客之星評選&#xff0c;點擊投我一票&#xff0c;謝謝。投過了也可以點哦&#xff0c;每天都可以投投一票。 留一手 有個哥們兒&#xff0c;在一合資公司做程序員&#xff0c;能力挺強&#xff0c;寫…