Halcon模板匹配学习:find_aniso_shape_model

(粉色是显示设置相关,不需要太多关注,黄色为自己标注,绿色输入参数,紫色输出参数)
*去寻找SMD电容元器件, 这些SMD电容元器件在具有10位深度的图像(类型为uint2的图像)中在行和列方向上呈现独立的尺寸变化。
dev_update_off ()
dev_close_window ()

*为了可视化,我们指定uint2图像中的有效位数。 我们这样做是因为无法将这些信息存储在图像文件本身中。
set_system ('int2_bits', 10)//int2图像的有效位数。缩放灰度值时使用此数字。如果该值设置为-1,则灰度值将自动缩放(默认)。值:-1或9..16;默认值:-1

read_image (Image, 'smd/smd_capacitors_01')//读取图片
get_image_size (Image, Width, Height)//获取图片的宽度和高度
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)//打开一个窗口适应读取的图片
dev_display (Image)//显示图片
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')//设置字体
Message := 'This program shows how to use shape-based matching'//需要显示的信息
Message[1] := 'to find SMD capacitors that exhibit independent'
Message[2] := 'size changes in the row and column direction in'
Message[3] := 'images with a depth of 10 bits.'
Message[4] := 'First a synthetic model for the SMD capacitors'
Message[5] := 'is created. In the next step the created model'
Message[6] := 'is used to find the SMD capacitors.'
//需要显示的信息
disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')//显示信息
disp_continue_message (WindowHandle, 'black', 'true')//显示“按F5继续运行”信息
stop ()//程序会在这里停止
dev_close_window ()//关闭窗口
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)//打开窗口
dev_set_color ('green')//设置颜色
dev_set_line_width (3)//设置线宽

*为SMD电容器创建综合模型。 这只是一个带有圆角的矩形。
gen_contour_polygon_rounded_xld (Contour, [50,100,100,50,50], [50,50,150,150,50], [6,6,6,6,6], 1)//创建带圆角的多边形轮廓,座标和圆角可以通过数组的形式指定。输入Row[50,100,100,50,50]、Col[50,50,150,150,50]、角度[6,6,6,6,6],座标数组的第一个值和最后一个值相同,用以形成一个封闭的多边形轮廓,故而五个座标形成的是一个四边矩形,输出XLD轮廓绘contour*模板匹配时,可以自己创建一个多边形轮廓来创建匹配模板
gen_image_const (Image, 'byte', 200, 150)//生成一幅固定灰度值的图像,大小为200×150
paint_xld (Contour, Image, ImageModel, 128)//将先前建立的XLD轮廓绘制到图像上,128是灰度值
create_aniso_shape_model (ImageModel, 'auto', -rad(10), rad(20), 'auto', 0.9, 1.7, 'auto', 0.9, 1.1, 'auto', 'none', 'use_polarity', 'auto', 20, ModelID)//为各向异性尺度不变匹配准备一个轮廓模型
get_shape_model_contours (ModelContours, ModelID, 1)//返回一个轮廓模型的轮廓表示
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')//设置显示字体
* 在图片中查找SMD电容的模型并显示找到模型的数量和时间以及模型的比例

* 这里的比例是指实际图形与建立的简单模型的比例大小

* 按照已知的图片数量进行循环

for J := 1 to 4 by 1
    read_image (Image, 'smd/smd_capacitors_' + J$'02d')
    dev_display (Image)
    count_seconds (S1)//测量一次时间
    find_aniso_shape_model (Image, ModelID, -rad(10), rad(20), 0.9, 1.7, 0.9, 1.1, 0.7, 0, 0.5, 'least_squares', 0, 0.8, Row, Column, Angle, ScaleR, ScaleC, Score)//在一个图像中找出一个各向异性尺度不变轮廓的最佳匹配。
    count_seconds (S2)//测量一次时间
    Time := (S2 - S1) * 1000//设置一个变量为两次测量时间的差值
    Num := |Score|//获取匹配模型的数量
    * 显示找到的模型与匹配模型花费的时间信息
    disp_message (WindowHandle, Num$'d' + ' models found in ' + Time$'5.2f' + ' ms', 'window', 12, 12, 'black', 'true')
    MeanColumn := mean(Column)//获取找到的矩形列的平均值
    for I := 0 to Num - 1 by 1
        *显示找到的模型
        hom_mat2d_identity (HomMat2D)//生成相同二维变换的同质变换矩阵
        hom_mat2d_scale (HomMat2D, ScaleR[I], ScaleC[I], 0, 0, HomMat2D)//为一个同质二维变换矩阵添加一个缩放
        hom_mat2d_rotate (HomMat2D, Angle[I], 0, 0, HomMat2D)//依照角度旋转二维矩阵
        hom_mat2d_translate (HomMat2D, Row[I], Column[I], HomMat2D)//为一个同质变换矩阵添加一个旋转
        affine_trans_contour_xld (ModelContours, ContoursTrans, HomMat2D)//对XLD轮廓(contour)进行一个任意二维仿射变换
        dev_display (ContoursTrans)//在当前窗口显示变换后的图形
        * 
        * Display the model's scale next to the found model
        ScaleRowStr := 'ScaleRow=' + ScaleR[I]$'5.3f'//在找到的模型旁边显示模型的比例
        ScaleColStr := 'ScaleCol=' + ScaleC[I]$'5.3f'
        get_string_extents (WindowHandle, ScaleRowStr, AscentStr, DescentStr, WidthStr, HeightStr)//获取一个字符串的空间大小
        if (Column[I] <= MeanColumn)//显示建模的比例信息
            disp_message (WindowHandle, [ScaleRowStr,ScaleColStr], 'image', Row[I] - 20, Column[I] - 60 - WidthStr, 'green', 'false')
        else
            disp_message (WindowHandle, [ScaleRowStr,ScaleColStr], 'image', Row[I] - 20, Column[I] + 60, 'green', 'false')
        endif
    endfor
    * Deactivate the following lines to run the programm without breaks
    if (J < 4)//不激活以下代码程序将不中断的运行
        disp_continue_message (WindowHandle, 'black', 'true')
        stop ()
    endif
endfor
* 重置uint2图像的有效位数为未知
set_system ('int2_bits', -1)


gen_contour_polygon_xld 意思_u013407012的专栏-CSDN博客 https://blog.csdn.net/u013407012/article/details/103167476


Halcon算子_create_aniso_shape_model-CSDN博客 https://blog.csdn.net/coolbee19990/article/details/68058881

create_aniso_shape_model (ImageModel, 'auto', -rad(10), rad(20), 'auto', 0.9, 1.7, 'auto', 0.9, 1.1, 'auto', 'none', 'use_polarity', 'auto', 20, ModelID)//为各向异性尺度不变匹配准备一个轮廓模型

输入对象:ImageModel
金字塔层数:自动确定
对象可允许旋转范围:[-0.174,0.349],此处是转换为了弧度,-rad(10)=-0.174
旋转步长:自动选择
行方向允许缩放率范围:[0.9,1.7]
缩放步长:自动确定
列方向允许缩放率范围:[0.9,1.1]
缩放步长:自动确定
优化:不需要减少模型点
匹配指标:模板与图形必须有相同的对比度
对比度阈值:自动确定
最小对比度:20,图像允许在20个灰度值内波动

模板句柄:ModelID

1° = π / 180 ≈ 0.01745 rad1rad = 180 / π = 57.30°角度制


总结:该例子在模板匹配时,自己创建一个多边形轮廓来创建匹配模板。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章