halcon例程学习笔记(4)---count_fish_sticks.hdev基本函数使用

来源:互联网 发布:网络管理安全防御措施 编辑:程序博客网 时间:2024/05/24 15:36

通过本例程巩固了对剖面灰度值的描述,并进行测量,算子使用同“halcon例程学习笔记(2)”。此例程进一步学习了halcon中的基本函数的使用方法:

subset   求取一个数组的子集

find   查找相应条件的值的位置索引

数组的错位减法的使用。

其它基本图像处理基本算子,可以查阅halcon使用手册,详细了解。


例程代码如下:

dev_update_off ()
dev_close_window ()
read_image (Image, 'food/fish_stick_package_01')
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width*.9, Height*.9, 'black', WindowHandle)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
dev_set_draw ('margin')
dev_open_window (0, Width*.9+12, 420, 150, 'black', GraphicsWindow)
set_display_font (GraphicsWindow, 16, 'mono', 'true', 'false')
dev_set_color ('yellow')

* Read and process the images
NumImages := 6
for Index := 1 to NumImages by 1
    read_image (Image, 'food/fish_stick_package_'+Index$'02')
    * 
    * Segment the content of the fish stick package
    threshold (Image, Region, 100, 255)
    closing_circle (Region, RegionClosing, 5)
    fill_up (RegionClosing, RegionFillUp)
    difference (RegionFillUp, RegionClosing, RegionDifference)
    fill_up (RegionDifference, RegionFillUp1)
    closing_circle (RegionFillUp1, RegionClosing1, 10)
    smallest_rectangle2 (RegionClosing1, Row, Column, Phi, Length1, Length2)
    MeasureLength1 := Length1 - 5
    * 
    * Measure the gray value profile of the fish stick package
    gen_rectangle2 (Rectangle, Row, Column, Phi, Length1, 80)
    gen_measure_rectangle2 (Row, Column, Phi, MeasureLength1, 60, Width, Height, 'nearest_neighbor', MeasureHandle)
    measure_projection (Image, MeasureHandle, GrayValues)
    close_measure (MeasureHandle)
    create_funct_1d_array (GrayValues, Function)
    *获得函数局域最大最小值点的位置
    local_min_max_funct_1d (Function, 'plateaus_center', 'true', Minima, Maxima)
    * 
    * Evaluate the gray profile
    get_y_value_funct_1d (Function, Minima, 'mirror', YValues)
    *查找在YValues值上下波动50的值并求取Minima中的子集
    SelectedMinima := subset(Minima,find(sgn(YValues-50),-1))
    Num := |SelectedMinima|+1
    *产生一维数组,
    StickEdges := [-5, SelectedMinima, 2*MeasureLength1+5]
    *错位减法
    StickWidth := StickEdges[1:Num]-StickEdges[0:Num-1]
    * 
    * Display the results
    BorderX := [ Column+cos(Phi)*(MeasureLength1*((StickEdges-MeasureLength1)/MeasureLength1))]
    BorderY := [ Row-sin(Phi)*(MeasureLength1*((StickEdges-MeasureLength1)/MeasureLength1))]
    CenterX := (BorderX[1:Num]+BorderX[0:Num-1])/2
    CenterY := (BorderY[1:Num]+BorderY[0:Num-1])/2
    gen_cross_contour_xld (BorderCross, BorderY, BorderX, 15, rad(45))
    gen_cross_contour_xld (CenterCross, CenterY, CenterX, 15, rad(45))
    *查找StickWidth数组中大于20的点坐标
    IndexFish := find(sgn(StickWidth-20),1)
    *查找StickWidth数组中小于20的点坐标
    IndexFishx := find(sgn(StickWidth-20),-1)
    if (IndexFish # -1)
        NumFish := |IndexFish|
        *产生多个矩形框
        gen_rectangle2 (FishRegions, subset(CenterY,IndexFish), subset(CenterX,IndexFish), gen_tuple_const(NumFish,Phi), subset(StickWidth,IndexFish)/2, gen_tuple_const(NumFish,Length2)/2)
    else
        NumFish := 0
    endif
    *创建一个空的图像区域
    gen_empty_region (Flipped)
    IndexFlipped := find(sgn(StickWidth-48),1)
    if (IndexFlipped # -1)
        NumFlipped := |IndexFlipped|
        gen_rectangle2 (Flipped, subset(CenterY,IndexFlipped), subset(CenterX,IndexFlipped), gen_tuple_const(NumFlipped,Phi), subset(StickWidth,IndexFlipped)/2, gen_tuple_const(NumFlipped,Length2)/2)
    else
        NumFlipped := 0
    endif
    * 
    dev_set_window (GraphicsWindow)
    dev_clear_window ()
    plot_funct_1d (GraphicsWindow, Function)
    dev_set_window (WindowHandle)
    dev_clear_window ()
    dev_display (Image)
    dev_set_color ('yellow')
    dev_set_line_width (1)
    dev_display (FishRegions)
    dev_display (BorderCross)
    dev_set_color ('red')
    dev_set_line_width (3)
    dev_display (Flipped)
    if (NumFish=15 and NumFlipped =0)
        String := 'OK'
        Color := 'green'
    else
        String := 'Not OK'
        Color := 'red'
    endif
    String[1] := 'Number of fish sticks:'+NumFish$'3'
    if (NumFish # 15)
        Color := [Color,'red']
    else
        Color := [Color,'white']
    endif
    if (NumFlipped # 0)
        String[2] := 'Flipped fishsticks:  '+NumFlipped$'3'
        Color := [Color,'red']
    endif
    disp_message (WindowHandle, String, 'window', 12, 12, Color, 'false')
    dev_set_color (Color[0])
    dev_display (Rectangle)
    if (Index<NumImages)
        disp_continue_message (WindowHandle, 'black', 'true')
        stop ()
    endif
endfor


原创粉丝点击