第16章 一维码识别_BarCode
create_bar_code_model创建条形码模型。返回的句柄提供有关条形码结构的所有必要信息。
find_bar_code读取条形码。可以指定要搜索的模型和条形码类型。返回指定类型的所有条码区域和解码字符串。
clear_bar_code_model销毁条码模型。
16.1 识别条码
读取下图所示的EAN 13条形码。
create_bar_code_model创建条形码模型。find_bar_code(CodeType设置为'EAN-13')返回找到的条形码的区域和解码的字符串。clear_bar_code_model销毁条形码模型。
read_image (image, 'barcode/ean13/ean1301') create_bar_code_model ([], [], BarCodeHandle) find_bar_code (image, SymbolRegions, BarCodeHandle, 'EAN-13', DecodedDataStrings) clear_bar_code_model (BarCodeHandle) |
16.1.1 预处理图像
如果条形码图像有点模糊,则可以使用emphasize来增强图像的高频区域,从而使其看起来更清晰。
zoom_image_factor放大了太小而无法读取的条形码。
scale_image缩放灰度值范围(或使用外部程序scale_image_range),可以增强图像的对比度。
HALCON希望条形码在浅色背景上打印为深色。要在深色背景上读取浅色条形码,必须先使用操作符invert_image反转图像。
16.1.2 校正图像
条形码阅读器可以在一定程度上处理透视变形。对于非常强烈的失真,需要在应用条形码阅读器之前纠正图像。
CD上环形打印的条形码进行校正,示例程序circular_barcode.hdev。
16.1.3 创建条码模型
可以调整参数(如元素大小的范围)('element_size_min','element_size_max'),以获得更好的结果。可以在此处更改所有可用参数,也可以在稍后的步骤中使用set_bar_code_param更改。
16.1.4 配置条码模型参数
在大多数情况下,使用HALCON读取条形码不需要调整参数。但是,如果条形码读取失败,则可以在应用find_bar_code之前使用算子set_bar_code_param调整以下参数。
(1) 调整条形码与元素大小
可以使用参数调整条形码大小和条形码元素宽度的范围
• ’barcode_width_min’,
• ’barcode_height_min’,
• ’element_size_min’,
• ’element_size_max’
barcode_typical_cases.hdev显示了元素大小的调整如何改善解码率。
(2) 确定校验字符
对于具有校验字符的码类型,可以指定校验字符是用于检测结果还是作为已解码字符串的一部分返回。('check_char')
(3) 调整提取元素边缘的阈值
两个阈值参数控制扫描线识别条码边缘。'meas_thresh'为一个相对阈值,一般取值[0.05 , 0.2]。除非图像包含大量噪音,否则'meas_thresh'效果很好。当灰度值范围较小时,可能会检测到错误边缘。
'meas_thresh_abs'为所有图像设置了5.0的绝对阈值。这意味着元素边界的最亮和最暗值之间的差异必须大于5.0才能被归类为边缘。因此,在具有小动态范围的图像中不会检测到错误边缘。有时需要设置为低阈值,例如,当照明不均匀,图像即具有高动态范围也具有低动态范围。需要在减小'meas_thresh'的值之前将'meas_thresh_abs'设置为0.0。
(4) 加速
有两种情况可以改善性能。
第一种情况,每个错误候选者使用默认值10扫描线扫描,而有效条形码本身通常在一次或两次扫描后被解码。因此,减少扫描线的数量会明显加速。请注意,如果在减少扫描线数量后无法检测到条形码,则必须再次增加该数量。
第二种情况涉及带有堆叠条形码的图像(目前是RSS-14 Stacked,RSS-14 Stacked Omnidirectional和RSS Expanded Stacked)。阅读器默认的扫描线数量,RSS-14 Stacked为20,RSS Expanded Stacked为55,可能高于必要值。RSS Expanded Stacked码可能没有最大的扫描数,则使用参数'num_scanlines'指定扫描行数很有用(阅读器每行使用5条扫描线)。因此,性能提高了。示例barcode_param_num_scanlines.hdev。
如果已知每个图像的条形码数量,则可以通过set_bar_code_param或set_bar_code_param_specific的参数’stop_after_result_num’指定该数量来减少解码时间。
(5) 提高条码检测的鲁棒性
'min_identical_scanlines'认定成功解码所需的最少扫描线数。例:barcode_param_scanning_control.hdev
如果未设置此参数,则在第一个扫描线成功解码后,条形码被视为已解码。
'majority_voting' 选择解码结果的模式。如果未设置该参数,满足上所述最小解码扫描线的数量,则成功解码条形码。如果此参数设置为“true”,在不同扫描线数之间进行选择,并且整个结果由多数扫描线解码。示例barcode_param_majority_voting.hdev。
(6) 强制检测空白区域
即使两侧空白区存在干扰,HALCON也能读取条形码。但是,参数'quiet_zone'可用于更严格地处理空白区违规(默认为false)。示例barcode_quiet_zone.hdev。
(7) 调整匹配的容忍度