HALCON示例find_aniso_shape_model 注释翻译与解析


* find_aniso_shape_model 这个例子展示了如何使用HALCON的 shape-base(形状基础) 匹配方式
* 去寻找SMD电容元器件, 这些SMD电容元器件在具有10位深度的图像(类型为uint2的图像)中在行和列方向上呈现独立的尺寸变化。
* 
dev_update_off ()
dev_close_window ()
* 
* 为了能够可视化显示, 我们指定uint2图像中有效位的数量。
* 之所以这样做是因为信息不能够存储在图像文件自身中

*设置格式
set_system ('int2_bits', 10)
*读取图片
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')
*显示“按F5继续运行”信息
disp_continue_message (WindowHandle, 'black', 'true')
*程序会在这里停止
stop ()
*关闭窗口
dev_close_window ()
*打开窗口
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
*设置颜色
dev_set_color ('green')
*设置线宽
dev_set_line_width (3)


* 为SMD电容器创建一个合成模型。这里就只是一个圆角矩形。

*根据多边形角点创建一个XLD轮廓
gen_contour_polygon_rounded_xld (Contour, [50,100,100,50,50], [50,50,150,150,50], [6,6,6,6,6], 1)
*创建一个固定灰度值的图像
gen_image_const (Image, 'byte', 200, 150)
*将先前建立的XLD轮廓绘制到图像上,128是灰度值
paint_xld (Contour, Image, ImageModel, 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
        *显示找到的模型
        * Display the found model.
        
        *生成相同二维变换的同质变换矩阵
        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)
        *对XLD轮廓(contour)进行一个任意二维仿射变换
        affine_trans_contour_xld (ModelContours, ContoursTrans, HomMat2D)
        *在当前窗口显示变换后的图形
        dev_display (ContoursTrans)
        * 
        *在找到的模型旁边显示模型的比例
        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
    
    * 不激活以下代码程序将不中断的运行
    if (J < 4)
        disp_continue_message (WindowHandle, 'black', 'true')
        stop ()
    endif
    
    *在四张图片中寻找电容的程序结束
endfor
*清除简单形状模型
clear_shape_model (ModelID)
*重置uint2图像的有效位数为未知
set_system ('int2_bits', -1)


HALCON示例find_aniso_shape_model 注释翻译与解析_第1张图片

你可能感兴趣的:(影像相关,HALCON,图像识别,图形匹配)