欢迎光临
我们一直在努力

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

一, 条形码


1,创建条形码句柄

create_bar_code_model ([], [], BarCodeHandle)

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

set_bar_code_param (BarCodeHandle, 'element_size_min', 8)

3,条形码的最小宽度

set_bar_code_param (BarCodeHandle, 'element_size_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)
 

赞(0)
未经允许不得转载:171主机测评 » Halcon条形码与二维码识别全攻略
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址