Halcon 学习笔记3 仿射变换

Posted mCat

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Halcon 学习笔记3 仿射变换相关的知识,希望对你有一定的参考价值。

像素的减少

开运算(较少)

腐蚀(去除更多)

对灰度图像的开运算或腐蚀 相当于将灰度图像变暗

 

像素增加

闭运算(较少)

膨胀(较多)

对灰度图像的闭运算或膨胀 相当于将灰度图像变亮

 

仿射变换

 

另外一种仿射变换

* This example demonstrates an application from the pharmaceutical
* industry. The task is to check the content of automatically filled
* blisters. The first image (reference) is used to locate the chambers
* within a blister shape as a reference model, which is then used to
* realign the subsequent images along to this reference shape. Using
* blob analysis the content of each chamber is segmented and finally
* classified by a few shape features.
* 
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)
* 
* In the first step, we create a pattern to cut out the chambers in the
* subsequent blister images easily.
access_channel (ImageOrig, Image1, 1)
threshold (Image1, Region, 90, 255)
shape_trans (Region, Blister, \'convex\')
orientation_region (Blister, Phi)//计算角度Phi
area_center (Blister, Area1, Row, Column)//获取面积和中心点坐标
*将原来的(Row, Column, Phi)表示为(Row, Column, 0),也就是将角度调正
*输出变换矩阵HomMat2D
vector_angle_to_rigid (Row, Column, Phi, Row, Column, 0, HomMat2D)
affine_trans_image (ImageOrig, Image2, HomMat2D, \'constant\', \'false\')
gen_empty_obj (Chambers)
for I := 0 to 4 by 1
    Row := 88 + I * 70
    for J := 0 to 2 by 1
        Column := 163 + J * 150
        gen_rectangle2 (Rectangle, Row, Column, 0, 64, 30)
        concat_obj (Chambers, Rectangle, Chambers)
    endfor
endfor
affine_trans_region (Blister, Blister, HomMat2D, \'nearest_neighbor\')
difference (Blister, Chambers, Pattern)
union1 (Chambers, ChambersUnion)
orientation_region (Blister, PhiRef)
PhiRef := rad(180) + PhiRef
area_center (Blister, Area2, RowRef, ColumnRef)
* 
* 
* Each image read will be aligned to this pattern and reduced to the area of interest,
* which is the chambers of the blister
Count := 6
for Index := 1 to Count by 1
    read_image (Image, \'blister/blister_\' + Index$\'02\')
    threshold (Image, Region, 90, 255)
    connection (Region, ConnectedRegions)
    select_shape (ConnectedRegions, SelectedRegions, \'area\', \'and\', 5000, 9999999)
    shape_trans (SelectedRegions, RegionTrans, \'convex\')
    * 
    * Align pattern along blister of image
    orientation_region (RegionTrans, Phi)
    area_center (RegionTrans, Area3, Row, Column)
    vector_angle_to_rigid (Row, Column, Phi, RowRef, ColumnRef, PhiRef, HomMat2D)
    affine_trans_image (Image, ImageAffineTrans, HomMat2D, \'constant\', \'false\')
    * 
    * Segment pills
    reduce_domain (ImageAffineTrans, ChambersUnion, ImageReduced)
    decompose3 (ImageReduced, ImageR, ImageG, ImageB)
    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\')
    * 
    * Classify segmentation results and display statistics
    count_obj (Chambers, Number)
    gen_empty_obj (WrongPill)
    gen_empty_obj (MissingPill)
    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 (ImageAffineTrans)
    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\', 12, 12 + 600, \'red\', \'true\')
    else
        disp_message (WindowHandle, \'OK\', \'window\', 12, 12 + 600, \'forest green\', \'true\')
    endif
    * 
    Message := \'# Correct pills: \' + (NumberP - NumberWP)
    Message[1] := \'# Wrong pills  :  \' + NumberWP
    Message[2] := \'# Missing pills:  \' + NumberMP
    * 
    Colors := gen_tuple_const(3,\'black\')
    if (NumberWP > 0)
        Colors[1] := \'red\'
    endif
    if (NumberMP > 0)
        Colors[2] := \'red\'
    endif
    disp_message (WindowHandle, Message, \'window\', 12, 12, Colors, \'true\')
    dev_set_color (\'red\')
    dev_display (WrongPill)
    dev_display (MissingPill)
    if (Index < Count)
        disp_continue_message (WindowHandle, \'black\', \'true\')
    endif
    stop ()
endfor

 

仿射变换 理论

https://www.cnblogs.com/liekkas0626/p/5238564.html 

以上是关于Halcon 学习笔记3 仿射变换的主要内容,如果未能解决你的问题,请参考以下文章

Halcon学习笔记-手眼标定-九点法

halcon仿射变换demo

halcon仿射变换demo

halcon 仿射变换

Halcon如何保存仿射变换矩阵

halcon几何变换(仿射变换)