• 2016-06-17


    * In this program the size of raw fish sticks is measured
    * before they are coated with bread crumbs.
    * First, the fish sticks are segmented from the background.
    * Then, their dimensions are measured, compared to the
    * required minimum size, and the result is displayed.
    *

    *设置不刷新
    dev_update_off ()

    *关闭显示窗口
    dev_close_window ()

    *读取图像
    read_image (Image, 'food/fish_sticks_raw_01')

    *打开一个显示窗口,-1,-1表示用上一次的窗口的大小

    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)

    *设置系统参数 store_empty_region
    set_system ('store_empty_region', 'true')
    * 每像素的换算参数
    cm_per_pix := 0.0373

    *目标的长度
    TargetLength := 9.0

    *上公差是多少
    ToleranceHigh := 0.8

    *下公差是多少
    ToleranceLow := 0.2
    * 设置图像张数为10
    NumImages := 10

    *进行for循环
    for I := 1 to NumImages by 1
    read_image (Image, 'food/fish_sticks_raw_' + I$'.2')
    *
    * Segment the raw fish sticks 选择比较白的地方
    threshold (Image, Region, 50, 255)
    connection (Region, ConnectedRegions)
    fill_up (ConnectedRegions, RegionFillUp)
    select_shape (RegionFillUp, SelectedRegions, 'area', 'and', 1000, 99999)
    *
    * Select the regions that do not intersect the image border
    boundary (Image, RegionBorder, 'inner')
    intersection (SelectedRegions, RegionBorder, RegionIntersection)
    area_center (RegionIntersection, Area, Row1, Column1)
    ValidRegionIndices := find(Area,0) + 1
    if (ValidRegionIndices[0] == 0)
    ValidRegionIndices := []
    endif
    select_tuple_larger (Area, 0.0, RegionAtBorderIndices)
    RegionAtBorderIndices := RegionAtBorderIndices + 1
    select_obj (SelectedRegions, ValidSticks, ValidRegionIndices)
    select_obj (SelectedRegions, StickAtBorder, RegionAtBorderIndices)
    *
    * Check the size of the fish sticks
    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 (IndicesGood, IndicesBad1, IndicesGood)
    select_tuple_larger (-FishLength1, -(TargetLength - ToleranceLow), IndicesBad2)
    IndicesBad := [IndicesBad1,IndicesBad2]
    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
    *
    * Display the results
    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)
    String := 'Target length: ' + TargetLength$'.1f' + ' cm'
    String[1] := 'Tolerance: -' + ToleranceLow$'.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')
    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', 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)

  • 相关阅读:
    十大经典排序算法
    Redis 实现消息队列 MQ
    Memcache/Memcached的PHP操作手册(纯手稿版)
    PHP 共享内存使用与信号控制
    WebSocket和Socket的区别
    电商平台系统架构设计案例分析
    电商网站架构案例
    大型网站架构系列:电商网站架构案例
    电商峰值系统架构设计--转载
    IT系统
  • 原文地址:https://www.cnblogs.com/LongHuaiYu/p/5595177.html
Copyright © 2020-2023  润新知