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

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

示例程序源碼(加注釋)

  • 關閉實時顯示更新
    dev_update_off ()

  • 關閉窗口
    dev_close_window ()

  • 讀入圖片
    read_image (Image, ‘food/fish_sticks_raw_01’)

  • 根據給定長寬比開辟窗口并顯示圖像
    dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)

  • 設置字體顯示格式
    set_display_font (WindowHandle, 16, ‘mono’, ‘true’, ‘false’)

  • 區域以邊緣形式進行顯示
    dev_set_draw (‘margin’)

  • 獲取系統關于“空白區域儲存的設置”并進行設置,上一篇介紹過了
    get_system (‘store_empty_region’, StoreEmptyRegion)
    set_system (‘store_empty_region’, ‘true’)

  • 變量的聲明與賦值
    cm_per_pix := 0.0373
    TargetLength := 9.0
    ToleranceHigh := 0.8
    ToleranceLow := 0.2

  • 定義圖片數量
    NumImages := 10

  • 循環檢測
    for I := 1 to NumImages by 1

    • 讀入圖片
      read_image (Image, ‘food/fish_sticks_raw_’ + I$’.2’)

    • 分割生魚棒,將測量區域提取出來

    • 閾值分割選取灰度值在50-255的像素
      threshold (Image, Region, 50, 255)

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

    • 填充孔洞,使選取的生魚棒完整
      fill_up (ConnectedRegions, RegionFillUp)

    • 篩選面積在1000-99999的區域,消除雜點干擾
      select_shape (RegionFillUp, SelectedRegions, ‘area’, ‘and’, 1000, 99999)

    • 選擇不與圖像邊框相交的區域,不檢測與圖像邊緣相交的生魚棒,因為它不完整

    • 使用形態學運算來計算區域的邊界,這里就是將圖片邊界提取出來
      boundary (Image, RegionBorder, ‘inner’)

    • 求圖像邊界與提取出生魚棒區域的交集,如果有交集那么證明有生魚棒位于圖像邊界,不進行檢測。
      intersection (SelectedRegions, RegionBorder, RegionIntersection)

    • 求解上一步求出的交集的面積與坐標
      area_center (RegionIntersection, Area, Row1, Column1)

    • find(Area,0)這個算子意思是在Area數組里邊尋找0這個元素,并且返回索引號;這里又在后邊加

    • 了個 1,交集區域為空所以 Area:=[0,0,0,0],find(Area,0):=[0,1,2,3],

    • ValidRegionIndices := [1,2,3,4];如果find在Area數組內沒有找到0,則返回-1
      ValidRegionIndices := find(Area,0) + 1

    • 如果ValidRegionIndices第一個元素不等0;ValidRegionIndices := []為空
      if (ValidRegionIndices[0] == 0)
      ValidRegionIndices := []
      endif

    • halcon自定義函數,目的在數組(第一個參數)尋找大于數值(第二個參數)的值,并返回索引號。
      select_tuple_larger (Area, 0.0, RegionAtBorderIndices)

    select_tuple_larger函數內部代碼:
    ** sgn()返回數值的符號,(-1,0,1) **這里就是數組里邊的值與輸入值相減,根據符號判斷1為正,之后用find返回數組數值為1的索引號
    tuple_find (sgn(Tuple - Value), 1, Indices)
    if (Indices[0] == -1)
    Indices := []
    endif
    return ()

    RegionAtBorderIndices := RegionAtBorderIndices + 1

    • select_obj 在元組中選取指定對象

    • 選取要正常測量的區域
      select_obj (SelectedRegions, ValidSticks, ValidRegionIndices)

    • 選取位于邊界的區域
      select_obj (SelectedRegions, StickAtBorder, RegionAtBorderIndices)

    • 測量生魚棒的尺寸

    • 求取生魚棒的可旋轉最小外接矩形
      smallest_rectangle2 (ValidSticks, Row, Column, Phi, Length1, Length2)

    • 求取生魚棒的實際長度,用像素個數乘以像素尺寸
      FishLength1 := Length1 * 2 * cm_per_pix

    • 選取尺寸大于最小要求尺寸的生魚棒
      select_tuple_larger (FishLength1, TargetLength - ToleranceLow, IndicesGood)

    • 選取尺寸大于最大要求尺寸的生魚棒
      select_tuple_larger (FishLength1, TargetLength + ToleranceHigh, IndicesBad1)

    • tuple_remove從元組中刪除元素,將尺寸大于最大要求尺寸的生魚棒剔除
      tuple_remove (IndicesGood, IndicesBad1, IndicesGood)

    • 選取小于最小要求尺寸的生魚棒
      select_tuple_larger (-FishLength1, -(TargetLength - ToleranceLow), IndicesBad2)

    • 將大于最大要求尺寸與小于最小要求尺寸的壞的生魚棒的索引號合并到一個壞的生魚棒的數組
      IndicesBad := [IndicesBad1,IndicesBad2]

    • subset()選擇元組元組的一個或多個單個元素,相當于將好壞的坐標選取出來
      RowGood := subset(Row,IndicesGood)
      ColumnGood := subset(Column,IndicesGood)
      RowBad := subset(Row,IndicesBad)
      ColumnBad := subset(Column,IndicesBad)
      FishLength1Good := subset(FishLength1,IndicesGood)
      FishLength1Bad := subset(FishLength1,IndicesBad)

    • 繪制外接矩形框
      if (|IndicesGood| > 0)
      gen_rectangle2 (GoodSticks, RowGood, ColumnGood, subset(Phi,IndicesGood), subset(Length1,IndicesGood), subset(Length2,IndicesGood))
      else
      gen_empty_obj (GoodSticks)
      endif
      if (|IndicesBad| > 0)
      gen_rectangle2 (BadSticks, RowBad, ColumnBad, subset(Phi,IndicesBad), subset(Length1,IndicesBad), subset(Length2,IndicesBad))
      else
      gen_empty_obj (BadSticks)
      endif

    • 顯示結果
      dev_display (Image)
      dev_set_color (‘white’)
      dev_set_line_width (1)
      dev_display (ValidSticks)
      dev_set_line_width (3)
      dev_set_color (‘yellow’)
      dev_display (StickAtBorder)
      dev_set_color (‘green’)
      dev_display (GoodSticks)
      dev_set_color (‘red’)
      dev_display (BadSticks)

    • ′.1f′這個是代表浮點數顯示小數點后一位String:=′Targetlength:′+TargetLength'.1f'這個是代表浮點數顯示小數點后一位 String := 'Target length: ' + TargetLength.1fString:=Targetlength:+TargetLength‘.1f’ + ’ cm’
      String[1] := ‘Tolerance: -’ + ToleranceLow′.1f′+′/+′+ToleranceHigh'.1f' + '/+' + ToleranceHigh.1f+/++ToleranceHigh’.1f’
      disp_message (WindowHandle, String, ‘window’, 12, 12, ‘black’, ‘true’)

    for J := 0 to |IndicesGood| - 1 by 1
    disp_message (WindowHandle, ‘OK’, ‘image’, 80, ColumnGood[J] - 10, ‘green’, ‘false’)
    disp_message (WindowHandle, FishLength1Good[J]′.1f′+′cm′,′image′,RowGood[J],ColumnGood[J]?28,′white′,′false′)endforforJ:=0to∣IndicesBad∣?1by1dispmessage(WindowHandle,′NotOK′,′image′,80,ColumnBad[J]?30,′red′,′false′)dispmessage(WindowHandle,FishLength1Bad[J]'.1f' + 'cm', 'image', RowGood[J], ColumnGood[J] - 28, 'white', 'false') endfor for J := 0 to |IndicesBad| - 1 by 1 disp_message (WindowHandle, 'Not OK', 'image', 80, ColumnBad[J] - 30, 'red', 'false') disp_message (WindowHandle, FishLength1Bad[J].1f+cm,image,RowGood[J],ColumnGood[J]?28,white,false)endforforJ:=0toIndicesBad?1by1dispm?essage(WindowHandle,NotOK,image,80,ColumnBad[J]?30,red,false)dispm?essage(WindowHandle,FishLength1Bad[J]’.1f’ + ‘cm’, ‘image’, RowBad[J], ColumnBad[J] - 28, ‘white’, ‘false’)
    endfor
    if (I != NumImages)
    disp_continue_message (WindowHandle, ‘black’, ‘true’)
    stop ()
    endif
    endfor

  • 恢復系統設置
    set_system (‘store_empty_region’, StoreEmptyRegion)

處理思路

普通的形態學進行區域的分割與測量,這個例子給我最大的收獲就是如何找到與圖像邊界重疊的區域,還有關于halcon下數組相關的操作,比如sgn、find、select_obj、subset等。

后記

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

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

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

相關文章

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

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

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;寫…

HALCON示例程序check_hazelnut_wafers.hdev威化餅干質量檢測(完整與否,是否破碎)

HALCON示例程序check_hazelnut_wafers.hdev威化餅干質量檢測&#xff08;完整與否&#xff0c;是否破碎&#xff09; 示例程序源碼&#xff08;加注釋&#xff09; 讀入圖片 read_image (Image, ‘food/hazelnut_wafer_01’) 關閉窗口 dev_close_window () 根據給定的長寬比…

Windows Media Center .MCL文件代碼執行漏洞(MS16-059)

blast 2016/06/21 13:180x00 簡介漏洞作者EduardoBraun Prado在今年早期發現了WMP的.MCL文件又存在一個可以導致遠程代碼執行的漏洞。為什么要說又呢&#xff0c;因為這個東西實在是“不爭氣”&#xff0c;同一個地方出現了多次繞過導致遠程代碼執行的問題。0x01 歷史A――MS1…

SCARA機器人與 DELTA機器人

1、SCARA機器人SCARA&#xff08;Selective Compliance Assembly Robot Arm&#xff0c;中文譯名&#xff1a;選擇順應性裝配機器手臂&#xff09;是一種圓柱坐標型的特殊類型的工業機器人。1978年&#xff0c;日本山梨大學牧野洋發明SCARA&#xff0c;該機器人具有四個軸和四個…

一直以來都沒直視的輪播-_-

一直以來做項目碰到輪播圖我都是去網站上找現成插件拿來用&#xff0c;現成的插件1是省時間&#xff0c;拿來改改尺寸改改參數就能直接用&#xff0c;2是現在的插件確實很強大&#xff0c;對于我一個剛剛學習前端的人來說&#xff0c;牛人寫的輪播我看懂也要花些功夫&#xff0…

HALCON示例程序circles.hdev邊界輪廓的圓形擬合

HALCON示例程序circles.hdev邊界輪廓的圓形擬合 小哥哥小姐姐覺得有用點個贊唄&#xff01; 示例程序源碼&#xff08;加注釋&#xff09; 讀入圖片 read_image (Image, ‘double_circle’)窗口初始化 dev_close_window () get_image_size (Image, Width, Height) dev_open…

asp.net 微信企業號辦公系統-流程設計--保存與發布

如果流程未設計完時可以先保存&#xff0c;以后再打開接著設計。點擊工具欄上的保存按鈕即可保存當前流程設計: 如果下次要接著設計&#xff0c;則可以打開該流程繼續設計&#xff1a; 如果流程設計完成&#xff0c;可以點擊安裝按鈕來發布流程&#xff0c;流程安裝成功后即加入…

search-guard 在 Elasticsearch 2.3 上的運用

uni3orns 2016/06/23 11:09Author&#xff1a;uni3orns參考內容&#xff1a;kibana.logstash.es/content/ela…groups.google.com/forum/#!for…github.com/floragunnco…此文章基于以下軟件版本&#xff0c;不同版本可能略有差異&#xff1a;elasticsearch 2.3.3search-guard…

HALCON示例程序class_2dim_sup.hdev使用二維像素分類對圖像進行分割

HALCON示例程序class_2dim_sup.hdev使用二維像素分類對圖像進行分割 示例程序源碼&#xff08;加注釋&#xff09; 定義Interactive并賦值&#xff0c;0&#xff1a;固定框&#xff1b;1&#xff1a;手工繪制框。 Interactive : 0 讀入圖片 read_image (Image, ‘ic’) 關閉…

sys

sys.argv 命令行參數List&#xff0c;第一個元素是程序本身路徑 sys.exit(n) 退出程序&#xff0c;正常退出時exit(0) sys.version 獲取Python解釋程序的版本信息 sys.maxint 最大的Int值 sys.path 返回模塊的搜索路徑&#xff0c;初…

修改環境變量

在path變量后添加&#xff0c;對變量長度無限制&#xff0c;需要重啟后生效reg add "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path /t REG_SZ /d "%path%;c:\newpath;whatever" /freg save "HKLM\SYSTEM\CurrentCont…

Canny邊緣檢測算法原理及其VC實現詳解(二)

3、 Canny算法的實現流程 由于本文主要目的在于學習和實現算法&#xff0c;而對于圖像讀取、視頻獲取等內容不進行闡述。因此選用OpenCV算法庫作為其他功能的實現途徑&#xff08;關于OpenCV的使用&#xff0c;作者將另文表述&#xff09;。首先展現本文將要處理的彩色圖片。 …

IDEA注冊jar包使用和常用插件

IDEA注冊jar包使用 點擊獲取下載地址或生成注冊碼 一、安裝完成后&#xff0c;先不啟動&#xff0c;首先如下圖修改相關的地方。 二、啟動IDEA&#xff0c;并且激活IDEA IDEA插件倉庫 IntelliJ IDEA Plugins 一、Maven Helper 我一般用這款插件來查看maven的依賴樹。在不使用此…

HALCON示例程序class_2dim_unsup.hdev基于二維直方圖的聚類分類

HALCON示例程序class_2dim_unsup.hdev基于二維直方圖聚類分類的顏色分類 示例程序源碼&#xff08;加注釋&#xff09; 讀入圖片 read_image (Image, ‘patras’)關閉窗口 dev_close_window ()得到圖片尺寸大小 get_image_size (Image, Width, Height)打開窗口 dev_open_wind…

Android Monkey壓力測試

一. JAVA環境的搭建 安裝jdk-8u151-windows-x64,可以到官網或者應用中心下載.JAVA環境變量的搭建: 在"我的電腦"-"屬性"-"高級"-"環境變量"中,點擊新建,填寫變量名為JAVA_HOME,變量值為JAVA安裝的路徑.在系統變量中找到Path,點擊編輯,…

bzoj 4517: [Sdoi2016]排列計數

4517: [Sdoi2016]排列計數 Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 637 Solved: 396[Submit][Status][Discuss]Description 求有多少種長度為 n 的序列 A&#xff0c;滿足以下條件&#xff1a;1 ~ n 這 n 個數在序列中各出現了一次若第 i 個數 A[i] 的值為 i&#x…