* 创建一个条形码处理模型,这里使用默认参数。
create_bar_code_model([], [], BarCodeHandle)
* 设置参数,使得在找到第一个条形码后停止搜索,因为我们期望每张图像中只有一个条形码。
set_bar_code_param(BarCodeHandle, 'stop_after_result_num', 1)
* 关闭任何已打开的窗口,以确保新窗口可以被正确创建。
dev_close_window()
* 打开一个新的图形窗口,用于显示处理结果。
* 参数分别是:窗口的左上角坐标 (0, 0),宽度 (120),高度 (300),背景颜色 ('black'),以及返回的窗口句柄 (WindowHandle)。
dev_open_window(0, 0, 120, 300, 'black', WindowHandle)
* 设置显示字体大小为14,字体类型为等宽字体 ('mono'),加粗 ('true'),斜体 ('false')。
set_display_font(WindowHandle, 14, 'mono', 'true', 'false')
* 设置绘图模式为边距 ('margin'),这意味着绘制的元素将与窗口边缘保持一定的距离。
dev_set_draw('margin')
* 设置线条宽度为3,这将影响绘制的线条或形状的粗细。
dev_set_line_width(3)
* 开始循环,迭代8次,每次处理一张不同的条形码图像。
for I := 1 to 8 by 1
* 构造图像文件路径并读取图像,这里的I是一个变量,代表当前迭代的次数。
* 文件名格式为'barcode/25interleaved/25interleaved' + (I$'.2'),例如,第一次迭代时会读取'25interleaved01'。
read_image(Image, 'barcode/25interleaved/25interleaved' + (I$'.2'))
* 获取图像的尺寸,以便正确设置显示窗口的范围。
get_image_size(Image, Width, Height)
* 设置窗口的显示区域,使图像完整地填充窗口。
dev_set_window_extents(0, 0, Width - 1, Height - 1)
* 在窗口中显示图像。
dev_display(Image)
* 设置绘制颜色为绿色。
dev_set_color('green')
* 配置为不考虑校验字符进行条形码读取。
set_bar_code_param(BarCodeHandle, 'check_char', 'absent')
* 尝试找到并解码条形码,返回解码后的字符串。
find_bar_code(Image, SymbolRegions, BarCodeHandle, '2/5 Interleaved', DecodedDataStrings)
* 显示解码后的字符串。
disp_message(WindowHandle, DecodedDataStrings, 'window', 12, 12, 'black', 'false')
* 计算解码字符串的最后一个字符的位置。
LastChar := strlen(DecodedDataStrings) - 1
* 显示最后一个字符,假设这是校验字符,并用森林绿颜色标记。
disp_message(WindowHandle, sum(gen_tuple_const(LastChar,' ')) + DecodedDataStrings{LastChar}, 'window', 12, 12, 'forest green', 'false')
* 暂停程序执行,让用户有时间查看结果。
stop()
* 现在配置为使用校验字符验证结果。
set_bar_code_param(BarCodeHandle, 'check_char', 'present')
* 再次尝试找到并解码条形码,这次包括校验字符的验证。
* 如果校验字符不正确,条形码读取将会失败。
find_bar_code(Image, SymbolRegions, BarCodeHandle, '2/5 Interleaved', DecodedDataStrings)
* 显示解码后的字符串(不包括校验字符)。
disp_message(WindowHandle, DecodedDataStrings, 'window', 36, 12, 'black', 'false')
* 如果不是最后一张图片,则暂停,等待用户继续。
if (I < 8)
stop()
endif
endfor
这段代码是用HALCON编写的,用于读取2/5 Interleaved(交错2/5)类型的条形码。它创建了一个条形码处理模型,并设置了参数以确保能够正确解码该类型的条形码。以下是代码的详细解释和
### 功能解释
1. **初始化**:
- 创建一个条形码处理模型 `BarCodeHandle`。
- 设置参数 `stop_after_result_num` 为1,表示在找到第一个条形码后停止搜索。
2. **图形界面准备**:
- 关闭所有已打开的窗口,并创建一个新的黑色背景的窗口 `WindowHandle`。
- 设置显示字体、绘图模式和线条宽度,以便后续可以在窗口中正确显示文本和图形。
3. **循环处理图像**:
- 进入一个循环,该循环将运行8次,每次处理一张不同的2/5 Interleaved条形码图像。
- 使用 `read_image` 函数读取指定路径下的图像文件,文件名格式为 `'25interleaved' + (I$'.2')`,其中 `I` 是当前迭代的次数,`I$'.2'` 表示将数字 `I` 格式化为两位数(如01, 02, ..., 08)。
4. **第一次条形码读取**:
- 尝试忽略校验字符来读取条形码,即即使校验字符不正确,也会尝试解码条形码。
- 解码成功后,会在图像上用绿色高亮显示解码出的字符串,并特别标注最后一个字符(假设这是校验字符),用森林绿色显示。
5. **暂停**:
- 在每次读取后暂停程序,允许用户查看结果。
6. **第二次条形码读取**:
- 重新配置为使用校验字符验证结果,这次如果校验字符不正确,条形码读取将会失败。
- 再次尝试解码条形码,但这次包括校验字符的检查,并在图像上用黑色显示解码后的字符串(不包括校验字符)。
7. **最终暂停**:
- 如果不是最后一张图片,则再次暂停,等待用户决定是否继续。
8. **循环结束**:
- 当所有八张图片都处理完毕后,程序自然结束。
### 总结
这段代码通过循环遍历八张包含2/5 Interleaved条形码的图像,首先尝试忽略校验字符读取条形码,然后再次读取并启用校验字符检查。每个步骤之后都有一个 `stop()` 命令,允许用户查看结果并决定是否继续。这种双重读取的方法可以帮助评估条形码的质量和读取的可靠性。