HALCON例程:二维码质量检测·一:ecc200

您所在的位置:网站首页 halcon条形码 HALCON例程:二维码质量检测·一:ecc200

HALCON例程:二维码质量检测·一:ecc200

2023-08-31 17:19| 来源: 网络整理| 查看: 265

二维码质量等级参数        

        基于ISO/IEC 15415:2011标准,演示ECC200数据代码打印质量等级的示例程序。

        该程序调查所有提到的元素,除了整体质量和解码。对于其他六个打印质量元素,程序在几个迭代步骤中调整图像以模拟各种质量。然后为每个迭代步骤计算并显示用于评估打印质量的等级(从最低:0到最高:4)和相应的原始值。

Labels: * - Overall quality * - Contrast * - Modulation * - Fixed pattern damage * - Decode * - Axial non-uniformity * - Grid non-uniformity * - Unused error correction * - Reflectance Margin * - Print Growth * - Contrast Uniformity * - Aperture *显示设置,进行简短描述 dev_update_off () dev_close_window () * read_image (Image, 'datacode/ecc200/ecc200_print_quality_01') dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle) dev_set_color ('green') dev_set_line_width (3) set_display_font (WindowHandle, 14, 'mono', 'true', 'false') * Message := 'This program demonstrates the print quality' Message[1] := 'grades of ECC200 data codes based on the' Message[2] := 'standard ISO/IEC 15415:2011.' Message[3] := 'Successively images with various qualities' Message[4] := 'are generated and the respective print' Message[5] := 'quality grades queried. The grades are' Message[6] := 'values from 0 (lowest) to 4 (highest).' dev_disp_text (Message, 'window', 'top', 'left', 'black', [], []) dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], []) stop ()

* Constants for quality grade access * The grades correpond to the position of the elements in the tuple *质量等级访问的常量 *等级对应于元组中元素的位置 GRADE_CONTRAST := 1 GRADE_MODULATION := 2 GRADE_FIXED_PATTERN_DAMAGE := 3 GRADE_DECODE := 4 GRADE_AXIAL_NON_UNIFORMITY := 5 GRADE_GRID_NON_UNIFORMITY := 6 GRADE_UNUSED_ERROR_CORRECTION := 7 GRADE_UNUSED_REFECTANCE_MARGIN := 8 GRADE_UNUSED_PRINT_GROWTH := 9 GRADE_UNUSED_CONTRAST_UNIFORMITY := 10 Wait := .5 * * Create a model of a 2D data code class //创建模型 create_data_code_2d_model ('Data Matrix ECC 200', [], [], DataCodeHandle) * * Set the parameters to enhanced recognition mode//设置'enhanced_recognition'参数,提高识别率 set_data_code_2d_param (DataCodeHandle, 'default_parameters', 'enhanced_recognition') * Get the grade labels of the print quality elements (e.g., 'Contrast') *获取打印质量元素的等级标签(例如“Contrast”) get_data_code_2d_results (DataCodeHandle, 'general', 'quality_isoiec15415_labels', Labels) * ModuleWidth := 10

1、Contrast——对比度

     逐渐降低对比度,对比度越低,等级越低

Contrast: 最小和最大像素强度之间的范围 for Index := 1 to 10 by 1 * Minimize the contrast in each iteration step a little more * by scaling the gray values of the image *通过缩放图像的灰度值来最小化每个迭代步骤中的对比度 scale_image (Image, ImageScaled, 1.0 / Index * 1.15, Index * 20 - 50)//灰度缩放 *逐渐降低对比度,识别二维码 * Find the 2d data code symbol in the image with reduced contrast find_data_code_2d (ImageScaled, SymbolXLDs, DataCodeHandle, [], [], ResultHandles, DecodedDataStrings) * * Get the current grades of assessment of the print quality elements * and the respective raw values//获得当前印刷质量要素的考核等级和各自的原始值 get_data_code_2d_results (DataCodeHandle, ResultHandles, 'quality_isoiec15415', Quality) get_data_code_2d_results (DataCodeHandle, ResultHandles,'quality_isoiec15415_values', QualityValues) dev_display (ImageScaled) dev_display (SymbolXLDs) * * Compute and display a message with the current assessment * grade for contrast and the respective raw value. *计算并显示带有当前评估等级对比和各自原始值的消息 *显示函数 grade_message_text (Labels, Quality, QualityValues, GRADE_CONTRAST, Message) dev_disp_text (Message, 'window', 'top', 'left', 'black', [], []) wait_seconds (Wait) endfor dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], []) stop ()

 2、Modulation and Contrast Uniformity——调制和对比度均匀性(一致性)

        在同一个条码内,可能既有高对比度又有低对比度的区域(通常是由于墨分布不均)。整个符号的对比度一致性称为调制。

Modulation and Contrast Uniformity: *调制度量符号内模块振幅的均匀性调制等级高 意味着振幅大,模块分配更好。 *对比度均匀性是在任何模块中发现的最小调制值。 *对比度均匀度是可选参数,不影响整体等级。 *定义一个矩形,在其中模拟图像中的缺陷 gen_rectangle1 (Defect, 160, 220, 320, 335) * for Offset := 0 to 110 by 10 * Brighten the image in each iteration step a little more *在每个迭代步骤中稍微提亮图像 scale_image (Image, ImageScaled, 1, Offset) dev_display (ImageScaled) * * 将增亮图像的域缩小到预定义的矩形,然后将其灰度值绘制到原始图像中。 *这将生成一个包含一个矩形的图像,其中灰度值在每一个迭代步骤中变得越来越亮 reduce_domain (ImageScaled, Defect, ImageReduced) *将一个图像的灰度值绘制到另一个图像中。 paint_gray (ImageReduced, Image, ImageModulation) * Find the data code symbols in the generated image//识别二维码 find_data_code_2d (ImageModulation, SymbolXLDs, DataCodeHandle, [], [], ResultHandles, DecodedDataStrings) * * Get the current grades of assessment of the print quality elements * and the respective raw values//获得当前印品质量要素的评定等级和各自的原始值 get_data_code_2d_results (DataCodeHandle, ResultHandles, 'quality_isoiec15415', Quality) get_data_code_2d_results (DataCodeHandle, ResultHandles, 'quality_isoiec15415_values', QualityValues) * * Display the image with the defect//显示有缺陷的图像 dev_display (ImageModulation) dev_set_color ('green') dev_display (SymbolXLDs) dev_display_data_code_2d_print_quality_results (DataCodeHandle, ResultHandles, 'reflectance_margin_module_grades', 'isoiec15415', [], [], []) set_line_style (WindowHandle, [2,4]) gen_contour_region_xld (Defect, Contours, 'border') dev_set_color ('red') dev_display (Contours) set_line_style (WindowHandle, []) * * Compute and display a message with the current assessment * grade for modulation and the respective raw value. *计算并显示带有当前调制评估等级和各自原始值的消息。 grade_message_text (Labels, Quality, QualityValues, GRADE_MODULATION, MessageModulation) * * Compute and display a message with the current assessment * grade for contrast uniformity and the respective raw value. *计算并显示带有对比均匀性的当前评估等级和各自原始值的消息。 grade_message_text (Labels, Quality, QualityValues, GRADE_UNUSED_CONTRAST_UNIFORMITY, MessageContrastUniformity) dev_disp_text ([MessageModulation,MessageContrastUniformity], 'window', 'top', 'left', 'black', [], []) wait_seconds (Wait) endfor dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], []) stop ()

3、Fixed Pattern Damage——固定图案损坏

        二维码有定位图案(L)及时钟图案(边框交替出现黑色和白色的单元格)等,任何对这些必备元素的障碍都将被视为固定模式的损坏等级。

Fixed Pattern Damage: *评估固定模式或各自安静区域的退化/损坏,从而描述在图像中定位和识别符号的可靠性 *(1)生成和调查图像与损坏的安静区 for NumModules := 0 to 10 by 1 * * 首先创建一个平行于坐标轴的矩形,然后将其以灰度值0绘制到图像中,生成一个有受损安静区的图像 gen_rectangle1 (Defect, 388, 171, 398, NumModules * ModuleWidth + 171) paint_region (Defect, Image, ImageDefect, 0, 'fill') * Find the data code symbol in the image with damaged quiet zone//识别二维码 find_data_code_2d (ImageDefect, SymbolXLDs, DataCodeHandle, [], [], ResultHandles, DecodedDataStrings) * 获得对应值 get_data_code_2d_results (DataCodeHandle, ResultHandles, 'quality_isoiec15415', Quality) get_data_code_2d_results (DataCodeHandle, ResultHandles,'quality_isoiec15415_values', QualityValues) * * Display the image with the defect//显示有缺陷的图像 dev_display (ImageDefect) dev_set_color ('green') dev_display (SymbolXLDs) set_line_style (WindowHandle, [2,4]) gen_contour_region_xld (Defect, Contours, 'border') dev_set_color ('red') dev_display (Contours) set_line_style (WindowHandle, []) dev_display_data_code_2d_print_quality_results (DataCodeHandle, ResultHandles, 'bad_modules', 'isoiec15415', [], [], []) * grade_message_text (Labels, Quality, QualityValues, GRADE_FIXED_PATTERN_DAMAGE, Message) Message[1] := 'Damaged quiet zone' dev_disp_text (Message, 'window', 'top', 'left', 'black', [], []) wait_seconds (Wait) endfor dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], []) stop ()

 

(2)生成并研究在查找器模式的L型处有损坏的图像 for NumModules := 0 to 10 by 1 * * 通过首先在查找器模式处创建水平矩形,然后将其以灰度值0绘制到图像中,生成具有查找器模式损坏的l型图像 gen_rectangle1 (Defect, 375, 171, 385, NumModules * ModuleWidth + 171) paint_region (Defect, Image, ImageDefect, 255, 'fill') * Find the data code in the image with damaged finder pattern find_data_code_2d (ImageDefect, SymbolXLDs, DataCodeHandle, [], [], ResultHandles, DecodedDataStrings) * get_data_code_2d_results (DataCodeHandle, ResultHandles, 'quality_isoiec15415', Quality) get_data_code_2d_results (DataCodeHandle, ResultHandles, 'quality_isoiec15415_values', QualityValues) * * Display the image with the defect dev_display (ImageDefect) dev_set_color ('green') dev_display (SymbolXLDs) set_line_style (WindowHandle, [2,4]) gen_contour_region_xld (Defect, Contours, 'border') dev_set_color ('red') dev_display (Contours) set_line_style (WindowHandle, []) dev_display_data_code_2d_print_quality_results (DataCodeHandle, ResultHandles, 'bad_modules', 'isoiec15415', [], [], []) grade_message_text (Labels, Quality, QualityValues, GRADE_FIXED_PATTERN_DAMAGE, Message) Message[1] := 'Damaged L-shape of finder pattern' dev_disp_text (Message, 'window', 'top', 'left', 'black', [], []) wait_seconds (Wait) endfor dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], []) stop ()

 

(3)生成并研究在查找器模式交替一侧有损坏的图像 for NumModules := 0 to 10 by 1 * * 通过首先在交替一侧创建一个垂直的矩形,然后将灰度值为0的矩形绘制到图像中,生成具有查找器模式损坏的交替一侧的图像 gen_rectangle1 (Defect, 226, 376, NumModules * ModuleWidth + 226, 386) paint_region (Defect, Image, ImageDefect, 255, 'fill') * Find the data code in the image with damaged alternating side find_data_code_2d (ImageDefect, SymbolXLDs, DataCodeHandle, [], [], ResultHandles, DecodedDataStrings) * get_data_code_2d_results (DataCodeHandle, ResultHandles, 'quality_isoiec15415', Quality) get_data_code_2d_results (DataCodeHandle, ResultHandles, 'quality_isoiec15415_values', QualityValues) * * Display the image with the defect dev_display (ImageDefect) dev_set_color ('green') dev_display (SymbolXLDs) set_line_style (WindowHandle, [2,4]) gen_contour_region_xld (Defect, Contours, 'border') dev_set_color ('red') dev_display (Contours) set_line_style (WindowHandle, []) dev_display_data_code_2d_print_quality_results (DataCodeHandle, ResultHandles, 'bad_modules', 'isoiec15415', [], [], []) grade_message_text (Labels, Quality, QualityValues, GRADE_FIXED_PATTERN_DAMAGE, Message) Message[1] := 'Damaged alternating side of the\nfinder pattern' dev_disp_text (Message, 'window', 'top', 'left', 'black', [], []) wait_seconds (Wait) endfor dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], []) stop ()

 

 4、Axial non-uniformity——轴向不均匀性

        测量符号整体宽高比。大多数二维码由单个方块组成,如果这些单元由于太高或太宽看起来更像长方形,那么包含它们的符号在轴向不均匀性方面将会得到很低的评级。

Axial non-uniformity:宽高比的畸变导致轴向不均匀性的退化 IterationIndex := 0 for Scale := 1 to 1.2 by 0.02 *仅通过缩放图像的高度来生成符号纵横比失真的图像 affine_trans_image (Image, ImageDeformed, [Scale,0,(-Scale + 1) * 140,0,1,0], 'weighted', 'false')//对图像应用仿射二维变换 * Find the data code in the image with distorted aspect ratio//识别二维码 find_data_code_2d (ImageDeformed, SymbolXLDs, DataCodeHandle, [], [], ResultHandles, DecodedDataStrings) * get_data_code_2d_results (DataCodeHandle, ResultHandles, 'quality_isoiec15415', Quality) get_data_code_2d_results (DataCodeHandle, ResultHandles, 'quality_isoiec15415_values', QualityValues) * * Display the image with the distortion dev_display (ImageDeformed) dev_set_color ('green') dev_set_line_width (2) dev_display (SymbolXLDs) dev_set_line_width (1) dev_display_data_code_2d_print_quality_results (DataCodeHandle, ResultHandles, 'grid', 'isoiec15415', [], [], []) * grade_message_text (Labels, Quality, QualityValues, GRADE_AXIAL_NON_UNIFORMITY, Message) dev_disp_text (Message, 'window', 'top', 'left', 'black', [], []) wait_seconds (Wait) endfor dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], []) stop ()

 

 5、Grid non-uniformity——网格不均匀性

测量网格交叉点与理想位置的最大适量偏差,即符号的斜向拉伸程度

Grid non-uniformity: 除了仿射畸变,透视或其他畸变也会降低网格的非均匀性质量。 for Diff := 0 to 4 by 1 R := [40,40,210,210] C := [30,200,200,30] R2 := R + [0,0,Diff,0] C2 := C + [0,0,Diff,0] * * 通过对计算出的变换矩阵的图像应用射影变换,生成一个模块偏离其理想网格的图像(对于每个迭代增加偏差)。 *利用给定的点对应关系计算一个射影变换矩阵 vector_to_proj_hom_mat2d (R, C, R2, C2, 'normalized_dlt', [], [], [], [], [], [], HomMat2D, Covariance) *对图像应用射影变换 projective_trans_image (Image, ImageDeformed, HomMat2D, 'bilinear', 'false', 'false') * 识别二维码 find_data_code_2d (ImageDeformed, SymbolXLDs, DataCodeHandle, [], [], ResultHandles, DecodedDataStrings) * get_data_code_2d_results (DataCodeHandle, ResultHandles, 'quality_isoiec15415', Quality) get_data_code_2d_results (DataCodeHandle, ResultHandles, 'quality_isoiec15415_values', QualityValues) * * Display the image with the distortio dev_display (ImageDeformed) dev_set_color ('green') dev_set_line_width (2) dev_display (SymbolXLDs) dev_set_line_width (1) dev_display_data_code_2d_print_quality_results (DataCodeHandle, ResultHandles, 'grid', 'isoiec15415', [], [], []) * grade_message_text (Labels, Quality, QualityValues, GRADE_GRID_NON_UNIFORMITY, Message) dev_disp_text (Message, 'window', 'top', 'left', 'black', [], []) wait_seconds (Wait) endfor dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], []) stop ()

 

 6、Unused error correction——未使用纠错

Unused error correction: 尚未使用的纠错容量反映了解码过程的可靠性 for NumModules := 1 to 18 by 1 * * for NumModules := 1 to 18 by 1 * * 通过在图像内部创建一个白色矩形,为每次迭代生成一个具有更多缺陷的图像,这样在每次迭代中未使用的错误修正量就会减少。 gen_rectangle1 (Defect, 270, 171, 310, NumModules * ModuleWidth + 171) paint_region (Defect, Image, ImageDefect, 255, 'fill') * find_data_code_2d (ImageDefect, SymbolXLDs, DataCodeHandle, [], [], ResultHandles, DecodedDataStrings) * get_data_code_2d_results (DataCodeHandle, ResultHandles, 'quality_isoiec15415', Quality) get_data_code_2d_results (DataCodeHandle, ResultHandles, 'quality_isoiec15415_values', QualityValues) * dev_display (ImageDefect) dev_set_color ('green') dev_set_line_width (2) dev_display (SymbolXLDs) set_line_style (WindowHandle, [2,4]) gen_contour_region_xld (Defect, Contours, 'border') dev_set_color ('red') dev_display (Contours) set_line_style (WindowHandle, []) dev_display_data_code_2d_print_quality_results (DataCodeHandle, ResultHandles, 'bad_modules', 'isoiec15415', [], [], []) * grade_message_text (Labels, Quality, QualityValues, GRADE_UNUSED_ERROR_CORRECTION, Message) dev_disp_text (Message, 'window', 'top', 'left', 'black', [], []) wait_seconds (Wait) endfor dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], []) stop ()

 

 7、Print Growth——印刷增长(打印单元格增大):

度量模块是否在标称大小的基础上增长或缩小

Print Growth: for Erosion := 1 to 17 by 2 * 在每个迭代步骤中稍微削弱图像 zoom_image_factor (Image, ImageZoomed, 4, 4, 'bilinear')//按给定因子缩放图像 *确定所选掩码内的最小灰度值 gray_erosion_shape (ImageZoomed, ImageZoomedErosion, Erosion, Erosion, 'octagon') zoom_image_factor (ImageZoomedErosion, ImageErosion, 0.25, 0.25, 'bilinear') dev_display (ImageErosion) * 识别二维码 find_data_code_2d (ImageErosion, SymbolXLDs, DataCodeHandle, [], [], ResultHandles, DecodedDataStrings) * get_data_code_2d_results (DataCodeHandle, ResultHandles, 'quality_isoiec15415', Quality) get_data_code_2d_results (DataCodeHandle, ResultHandles, 'quality_isoiec15415_values', QualityValues) dev_set_color ('green') dev_display (SymbolXLDs) * grade_message_text (Labels, Quality, QualityValues, GRADE_UNUSED_PRINT_GROWTH, Message) dev_disp_text (Message, 'window', 'top', 'left', 'black', [], []) wait_seconds (Wait) endfor * for Dilation := 1 to 17 by 2 * 在每个迭代步骤中稍微扩大图像 zoom_image_factor (Image, ImageZoomed, 4, 4, 'bilinear') gray_dilation_shape (ImageZoomed, ImageZoomedDilation, Dilation, Dilation, 'octagon') zoom_image_factor (ImageZoomedDilation, ImageDilation, 0.25, 0.25, 'bilinear') dev_display (ImageDilation) * find_data_code_2d (ImageDilation, SymbolXLDs, DataCodeHandle, [], [], ResultHandles, DecodedDataStrings) * get_data_code_2d_results (DataCodeHandle, ResultHandles, 'quality_isoiec15415', Quality) get_data_code_2d_results (DataCodeHandle, ResultHandles, 'quality_isoiec15415_values', QualityValues) dev_set_color ('green') dev_display (SymbolXLDs) * grade_message_text (Labels, Quality, QualityValues, GRADE_UNUSED_PRINT_GROWTH, Message) dev_disp_text (Message, 'window', 'top', 'left', 'black', [], []) wait_seconds (Wait) endfor dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], []) stop ()

 

 8、Reflectance Margin——反射率裕度

        检查整体亮和暗的全局阈值,并确定亮或暗符号将如何正确识别的可能性。它不衡量强度差异,而是衡量对比度问题(或反射在代码表面的光线问题)会导致错误的可能性。

Reflectance Margin: 测量每个模块如何正确区分为亮和暗 *低反射率边际等级增加了模块被错误识别的概率。 *定义一个模仿图像缺陷的矩形 gen_rectangle1 (Defect, 160, 220, 320, 335) * for Offset := 50 to 90 by 6 * 在每个迭代步骤中稍微提亮图像 scale_image (Image, ImageScaled, 1, Offset) dev_display (ImageScaled) * * 将增亮图像的域缩小到预定义的矩形,然后将其灰度值绘制到原始图像中。这将生成一个包含一个矩形的图像,其中灰度值随着每一个迭代步骤变得越来越亮。 reduce_domain (ImageScaled, Defect, ImageReduced) paint_gray (ImageReduced, Image, ImageReflectanceMargin) * find_data_code_2d (ImageReflectanceMargin, SymbolXLDs, DataCodeHandle, [], [], ResultHandles, DecodedDataStrings) * get_data_code_2d_results (DataCodeHandle, ResultHandles, 'quality_isoiec15415', Quality) get_data_code_2d_results (DataCodeHandle, ResultHandles, 'quality_isoiec15415_values', QualityValues) * dev_display (ImageReflectanceMargin) dev_set_color ('green') dev_display (SymbolXLDs) set_line_style (WindowHandle, [2,4]) gen_contour_region_xld (Defect, ContoursContrast, 'border') dev_set_color ('red') dev_display (ContoursContrast) set_line_style (WindowHandle, []) dev_display_data_code_2d_print_quality_results (DataCodeHandle, ResultHandles, 'reflectance_margin_module_grades', 'isoiec15415', [], [], []) * grade_message_text (Labels, Quality, QualityValues, GRADE_UNUSED_REFECTANCE_MARGIN, Message) dev_disp_text (Message, 'window', 'top', 'left', 'black', [], []) wait_seconds (Wait) endfor * for NumModules := 1 to 10 by 1 * * 通过在图像内部创建一个白色矩形,为每次迭代生成一个具有更多缺陷的图像 gen_rectangle1 (Defect, 270, 171, 310, NumModules * ModuleWidth + 171) paint_region (Defect, ImageReflectanceMargin, ImageDefect, 255, 'fill') * find_data_code_2d (ImageDefect, SymbolXLDs, DataCodeHandle, [], [], ResultHandles, DecodedDataStrings) * get_data_code_2d_results (DataCodeHandle, ResultHandles, 'quality_isoiec15415', Quality) get_data_code_2d_results (DataCodeHandle, ResultHandles, 'quality_isoiec15415_values', QualityValues) * dev_display (ImageDefect) dev_set_color ('green') dev_display (SymbolXLDs) set_line_style (WindowHandle, [2,4]) gen_contour_region_xld (Defect, ContoursDefect, 'border') dev_set_color ('red') dev_display (ContoursDefect) dev_display (ContoursContrast) set_line_style (WindowHandle, []) dev_display_data_code_2d_print_quality_results (DataCodeHandle, ResultHandles, 'reflectance_margin_module_grades', 'isoiec15415', [], [], []) * grade_message_text (Labels, Quality, QualityValues, GRADE_UNUSED_REFECTANCE_MARGIN, Message) dev_disp_text (Message, 'window', 'top', 'left', 'black', [], []) wait_seconds (Wait) endfor dev_disp_text (' End of program ', 'window', 'bottom', 'right', 'black', [], [])

 

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3