Halcon条形码与二维码识别全攻略

一, 条形码


1,创建条形码句柄

create_bar_code_model ([], [], BarCodeHandle)

2, 设置条形码的参数 条形码的最小单位,黑条之间的最小间距

set_bar_code_param (BarCodeHandle, 'element_size_min', 8)

3,条形码的最小宽度

set_bar_code_param (BarCodeHandle, 'barcode_width_min', 8)

4, 设置条形码查找的精度 0快 ,1 精确

set_bar_code_param (BarCodeHandle, 'persistence', 0)

5,设置条形码的对比度

set_bar_code_param (BarCodeHandle, 'contrast_min',8)

6, 查找条形码

1 输入图片 2输出的区域 3 条形码句柄 4 条形码类型 5转成字符串

find_bar_code (Image, SymbolRegions, BarCodeHandle, 'auto', DecodedDataStrings)

7, 获取条形码的结果

'decoded_types' 条形码类型 code39

decoded_strings 转码字符串

get_bar_code_result (BarCodeHandle, 'all', 'decoded_types', BarCodeResults)

get_bar_code_result (BarCodeHandle, 'all', 'decoded_strings', BarCodeResults1)


二,识别多种条形码


【1】,没有检测到条形码的判断 code39和code32的转换

【2】,code39 支持0-9字符还有A-Z 以及一些特殊符号
【3】,code32 支持0-9数字和部分字符

1,识别多种条形码

【1】,前期准备

dev_get_window (WindowHandle)
query_font (WindowHandle, Font) //当前支持的字体
tuple_find (Font,'新宋体', Indices) // 判断当前是否支持新宋体
if (Indices>=0)
set_display_font (WindowHandle, 16, '新宋体', 'true', 'false')
endif

count_seconds (Seconds) //7772.08 开机时间

【2】,读取图片

*tuple_regexp_select 根据正则表达式进行筛选
* .* 匹配所有资源
* .(jpg|bmp|png) 后缀名为jpg bmp png

list_files ('条形码图片', 'files', Files)

tuple_regexp_select (Files, '.(jpg|bmp|png)', Selection)

【3】, 创建条形码句柄

  • 第二行:把条码的最小宽度设为 200 个像素
  • 第三行:把条码的最小高度设为 8 个像素

create_bar_code_model ([], [], BarCodeHandle)
set_bar_code_param (BarCodeHandle, 'barcode_width_min', 200)
set_bar_code_param (BarCodeHandle, 'barcode_height_min', 8)

dev_set_draw ('margin')

【4】, 进行循环

第 1 个参数:Image这是输入图像

第 2 个参数:SymbolRegions这是输出区域

第 3 个参数:BarCodeHandle这是你之前创建并设置好的条码识别工具,

第 4 个参数:'auto'意思是自动识别条码类型

第 5 个参数:DecodedDataStrings这是最终解码出来的条码内容

find_bar_code (Image, SymbolRegions, BarCodeHandle, 'auto', DecodedDataStrings)

gen_empty_obj (EmptyObject) // 定义一个空对象
for Index := 0 to |Selection|-1 by 1
read_image (Image, Selection[Index])
find_bar_code (Image, SymbolRegions, BarCodeHandle, 'auto', DecodedDataStrings)
test_equal_obj (EmptyObject, SymbolRegions, IsEqual) //对比俩个参数是否为空
if (IsEqual) // true 证明没找到条形码区域
dev_display (Image)
dev_disp_text ('未找到条形码', 'window', 'top', 'left', 'black', [], [])
else //false 证明找到到条形码区域
dev_display (Image)
dev_display (SymbolRegions)
get_bar_code_result (BarCodeHandle, 'all', 'decoded_types', BarCodeResults) //类型
get_bar_code_result (BarCodeHandle, 'all', 'decoded_strings', BarCodeResults1)//字符串
if (BarCodeResults=='Code 39')
convert_decoded_string_code39_to_code32 (BarCodeResults1, ConvertedDataStringCode32)
dev_disp_text ('Code39转成Code32:'+ConvertedDataStringCode32, 'window', 100, 100, 'black', [], [])
endif
dev_disp_text ('找到条形码:'+ BarCodeResults+':'+BarCodeResults1, 'window', 'top', 'left', 'black', [], [])
endif
stop ()
endfor


三,二维码检测


1,创建二维码对象

'default_parameters' 默认参数设置

'maximum_recognition' 最大的识别度

**create_data_code_2d_model ('Data Matrix ECC 200', ['default_parameters'], ['maximum_recognition'], DataCodeHandle) // Data Matrix ECC 200 数据矩阵码 简称D码

create_data_code_2d_model ('QR Code', [], [], DataCodeHandle1) //创建QR码对象
create_data_code_2d_model ('PDF417', [], [], DataCodeHandle2) //创建PDF417码对象 二维码堆叠的条形结构**

2,设置句柄的解析数据的字符类型

*set_data_code_2d_param (DataCodeHandle, 'string_encoding', 'utf8')

3,循环遍历

list_image_files ('二维码', 'default', [], ImageFiles)

for Index := 0 to |ImageFiles|-1 by 1

read_image (Image, ImageFiles[Index])

find_data_code_2d (Image, SymbolXLDs, DataCodeHandle, [], [], ResultHandles, DecodedDataStrings) //查找D码
count_obj (SymbolXLDs, Number)
if (Number>0)
dev_disp_text ('找到的是D码:'+DecodedDataStrings, 'window', 'top', 'left', 'black', [], [])
else
find_data_code_2d (Image, SymbolXLDs1, DataCodeHandle1, [], [], ResultHandles1, DecodedDataStrings1)
if (|DecodedDataStrings1|>0)
dev_disp_text ('找到的是QR码:'+DecodedDataStrings1, 'window', 'top', 'left', 'black', [], [])
else
find_data_code_2d (Image, SymbolXLDs2, DataCodeHandle2, [], [], ResultHandles2, DecodedDataStrings2)
if (|DecodedDataStrings2|>0)
dev_disp_text ('找到的是PDF417码:'+DecodedDataStrings2, 'window', 'top', 'left', 'black', [], [])
else
dev_disp_text ('没找到的是二维码:', 'window', 'top', 'left', 'black', [], [])
endif
endif
endif
stop ()
endfor


四, 一张图片多个二维码的检测


1,创建二维码对象

*'default_parameters' 默认参数设置
*'maximum_recognition' 最大的识别度

create_data_code_2d_model ('QR Code', ['default_parameters'], ['maximum_recognition'], DataCodeHandle)

list_image_files ('二维码', 'default', [], ImageFiles)

for Index := 0 to |ImageFiles|-1 by 1

read_image (Image, ImageFiles[Index])

* 'stop_after_result_num' 批量识别参数 找到16 个二维码后立即停止,提升效率

find_data_code_2d (Image, SymbolXLDs, DataCodeHandle, 'stop_after_result_num', 16, ResultHandles, DecodedDataStrings) //查找QR码

count_obj (SymbolXLDs, Number)

gen_region_contour_xld (SymbolXLDs, RegionQrCode, 'margin')
area_center (RegionQrCode, Area, Row, Column)

if (Number>0)
*dev_disp_text ('找到的是QR码:'+DecodedDataStrings, 'image', Row, Column, 'black', [], [])
else
*dev_disp_text ('没找到的是二维码:', 'window', 'top', 'left', 'black', [], [])
endif
stop ()

endfor


五,OCR字符提取


1, 提取字符每一个区域

2 ,读取内置的分类器或者自定义分类器 read_ocr_class_mlp()
3 ,获取读取的结果
4 ,处理结果释放句柄

5,分类器

* NoRej 不拒绝,如果一个字符串没有匹配到 返回一个类似的字符
* Rej 拒绝 如果一个字符串没有匹配到 返回一个reject

6,内置的分类器

*Document_0-9_NoRej.omc 、OCRA_A-Z+_Rej.omc
*自定义分类器 通过ocr助手进行设置

*字体是最好是黑色字体白色的背景


1,前期处理

read_image (Image, 'engraved')

get_image_size (Image, Width, Height)
dev_set_draw ('margin')
dev_set_color ('green')

2,矩形范围内阈值修改 使用7*7的矩阵 ,把里面像素最大值减去最小值,得到值作为图新值

gray_range_rect (Image, ImageResult, 7, 7)
invert_image (ImageResult, ImageInvert)

threshold (ImageResult, Region, 128,255)
connection (Region, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 1000, 99999)
sort_region (SelectedRegions, SortedRegions, 'first_point', 'true', 'column')

shape_trans (SortedRegions, RegionTrans, 'rectangle1')
area_center (RegionTrans, Area, Row, Column)

3,读取OCR

read_ocr_class_mlp ('新建文本文档.omc', OCRHandle)
count_obj (RegionTrans, Number)

dev_display (Image)
for Index := 1 to Number by 1
select_obj (SortedRegions, ObjectSelected, Index) //选择一个字符区域

【1】, 获取单独结果

do_ocr_single_class_mlp (ObjectSelected, ImageInvert, OCRHandle, 1, Class, Confidence)
dev_disp_text (Class, 'image', Row[Index-1], Column[Index-1], 'black', [], [])
dev_display (RegionTrans)
stop ()
endfor

【2】,一次性读取完

do_ocr_multi_class_mlp (SortedRegions, ImageInvert, OCRHandle, Class1, Confidence1)

相关推荐
老鱼说AI2 小时前
大模型学习与面试精讲第六期:损失函数篇
人工智能·深度学习·神经网络·学习·机器学习·语言模型
安科瑞小许2 小时前
零碳园区的“神经网络”——能源数据如何高效传输与监控
人工智能·零碳园区
Codebee2 小时前
Apex 技能安装过程深度技术揭秘
人工智能
dev派2 小时前
【LangChain】Context与Runtime:运行时数据注入完全指南
人工智能
AI+程序员在路上2 小时前
新手进入嵌入式行业方法与方向选择
c语言·开发语言·单片机·嵌入式硬件
dovens2 小时前
GO 快速升级Go版本
开发语言·redis·golang
芦芭荞2 小时前
QT之TCP/IP通讯
开发语言·qt·tcp/ip
拓端研究室2 小时前
2026年医疗趋势报告:医保改革、创新药、国产替代|附230+份报告PDF、数据、可视化模板汇总下载
大数据·人工智能