Halcon(一) 机器视觉二维码识别 搞定各种二位码识别问题

机器视觉绕不开二维码的识别,因为需要将生产中的数据识别出来,然后传输到MES系统。
Halcon识别二维码步骤总结。
Halcon已经封装好了算子,只要是下面两个算子,直接使用就行,非常方便。

核心步骤,就是下面三个算子:
*创建一个二维码数据class模型
1.create_data_code_2d_model (‘QR Code’,‘default_parameters’, ‘maximum_recognition’,DataCodeHandle)
*-检测和读取图像中的二维数据代码符号或训练二维数据代码模型。
2.find_data_code_2d (GrayImage,SymbolXLDs,DataCodeHandle, ‘train’, ‘all’,ResultHandles, DecodedDataStrings)
*删除2D数据代码模型并释放分配的内存。
3.clear_data_code_2d_model(DataCodeHandle)

我们经常会碰到的问题

1.Halcon算子默认情况下,只识别一个。如果需要识别多个二位码,修改下面参数:
find_data_code_2d (Image2, SymbolXLDs, DataCodeHandle, ‘stop_after_result_num’, 3, ResultHandles, DecodedDataStrings) 表示识别图片中3个二位数。按照要求修改。
2.关于二维码的类型:

create_data_code_2d_model算子的第一个参数,就是二位码类型,如果想做成通用的二位码类型,就需要枚举每个类型了。
2d_codeMode:=[‘Aztec Code’, ‘Data Matrix ECC 200’, ‘GS1 Aztec Code’, ‘GS1 DataMatrix’, ‘GS1 QR Code’, ‘Micro QR Code’, ‘PDF417’, ‘QR Code’]

3.图像预处理和二维码增强(图片本身问题调整)
对比度太低:scale_image(Scale the gray values of an image),增强图像的对比度。白话的意思是让黑的地方更黑,亮的地方更亮
图像模糊:emphasize锐化图像,使二维码看起来更清晰。
关于这两个算子,将在下面章节介绍。

4.如果整张图信息太多,则可以先把二维码区域挖出来,使用reduce_domain和crop_domain算子,这样不仅可以降低解码难度,还可以减少解码时间。

5、当二维码很小的时候,可以尝试用zoom_image_factor放大了二维码图像。

6、create_data_code_2d_model (‘QR Code’, [], [], DataCodeHandleQR)

创建模型时,[ ]中不填内容,实际默认属性名是‘default_parameters’,默认属性值是‘standard_recognition’。
如果想大幅度提高解码成功率,可以将属性值置为‘enhanced_recognition’或者‘maximum_recognition’。注意:解码能力越强,解码时间越长。

最后还有几个算子也值得注意一下:

set_data_code_2d_param :设置解码时的参数

get_data_code_2d_param :获取解码时的参数(如果没有设置过,则获得的是默认值)

get_data_code_2d_results :获得解码后的一些结果

以上是关于二维码识别的相关情况的总结,实际工程项目中,还需要将二维码识别数据显示出来和传递出去。


*计数器
_index:=0
*读码超时时间
_timeOut:=1000
*读码类型
_codeType:=[]
*读码数据
_codeData:=[]
*已解码的区域
gen_empty_obj (_EmptyObject)
*系统运行时间
_Runtime:=0
*系统编码格式
_coding:='utf8'
 
*create_data_code_2d_model ('Data Matrix ECC 200', [], [], DataCodeHandle1)
 
dev_close_window ()
*设置系统编码
set_system ('filename_encoding', _coding)
read_image (Image, 'C:/Users/Administrator/Desktop/微信图片_20210411095340.jpg')
get_image_size(Image, Width, Height)
*dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
dev_display (Image)
rgb1_to_gray (Image, GrayImage)
_codeMode:=['Aztec Code', 'Data Matrix ECC 200', 'GS1 Aztec Code', 'GS1 DataMatrix', 'GS1 QR Code', 'Micro QR Code', 'PDF417', 'QR Code']
*创建二维码数据class模型
count_seconds (T1)
for i := 0 to |_codeMode|-1 by 1
    create_data_code_2d_model (_codeMode[i],[], [],DataCodeHandle)
    *设置超时时间
    set_data_code_2d_param (DataCodeHandle, 'timeout', _timeOut)
    *防止误识别设置,因为某些二维码模型没有这个属性,会报错所以try以下
    try
        set_data_code_2d_param (DataCodeHandle, 'strict_quiet_zone', 'yes')
    catch (Exception)
        continue
    endtry
    *开始识别 
    find_data_code_2d (GrayImage,SymbolXLDs,DataCodeHandle, 'stop_after_result_num',1000,ResultHandles, DecodedDataStrings)
    dev_display (SymbolXLDs)
    count_obj (SymbolXLDs, Number)
    if (Number)
        *存读码类型
        for j := 1 to Number by 1
            *存解码类型
            _codeType[_index]:=_codeMode[i]
            *存解码数据
            _codeData[_index]:=DecodedDataStrings[j-1]
            _index:=_index+1
            select_obj (SymbolXLDs, ObjectSelected, j)
            *存二维码区域
            concat_obj (_EmptyObject, ObjectSelected, _EmptyObject)
        endfor
    endif
    *清除识别缓存
    *clear_data_code_2d_model(DataCodeHandle) 
endfor
count_seconds (T2)
_Runtime:=T2-T1
 
dev_clear_window ()
dev_display (Image)
dev_set_color ('green')
set_display_font (WindowHandle, 30, 'mono', 'true', 'false')
write_string (WindowHandle, '总耗时:'+_Runtime)

for Index := 0 to |_codeData|-1 by 1
    select_obj (_EmptyObject, ObjectSelected, Index+1)
    dev_display (ObjectSelected)
    area_center_xld (ObjectSelected, Area, Row, Column, PointOrder)
    dev_disp_text (_codeData[Index], 'window', Row, Column, 'black', [], [])
    
endfor


get_data_code_2d_results (DataCodeHandle, 'all_candidates', 'status', ResultValues)
  • 10
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三只可爱猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值