Halcon二维码扫描算法总结

       近期要往一个大型软件里面增加一个扫码工具,想到基于halcon算子进行开发,记录一下开发过程中的采坑和要点。

        刚开始拿到现场的二维码数据集,基于halcon进行测试,发现根本识别不了,无法有效获得二维码信息。基于halcon识别二维码的核心算子为下面两个:

create_data_code_2d_model ('Data Matrix ECC 200', 'default_parameters','enhanced_recognition', Handle)
find_data_code_2d (Image2, QRXLDs, QRHandle, 'stop_after_result_num', 4, ResultHandles, PositionStrings)

在这里卡住了很久,对创建的识别二维码的模型设置各类参数,也无法有效识别,对halcon二维码的识别一度产生怀疑。

后来,在想是不是需要对图片加一些预处理,调整带有二维码图片的灰度分布,再来识别,把同事加预处理识别二维码程序搞过来了,如下:

    read_image (Image, ImageFiles[Index])
    dev_close_window ()
    dev_open_window (0, 0, 800, 600, 'black', WindowHandle)
    rgb1_to_gray (Image, GrayImage) 
    create_data_code_2d_model ('Data Matrix ECC 200', 'default_parameters', 'enhanced_recognition', QRHandle)
    *******************识别出二维码
    Length := 0
    PositionStrings := []
    for min_gray := 0 to 30 by 3
      for max_gray := 255 to 180 by -7
         *灰度线性映射
         Mult:=255.0/(max_gray-min_gray)
         Add:=-Mult*min_gray
         scale_image (GrayImage, Image2, Mult, Add)
         find_data_code_2d (Image2, QRXLDs, QRHandle, 'stop_after_result_num', 4, ResultHandles, PositionStrings)
         tuple_strlen (PositionStrings, Length)
         *字符串大于5就是识别出来了
         if (Length > 5)
           break
         endif       
      endfor
      if (Length > 5)
         break
      endif 
    endfor
    ********释放内存
    clear_data_code_2d_model(QRHandle)

终于可以识别部分二维码图片,但也是只针对小部分图片,大部分图片无法有效识别。

但到这里,还是看到了识别的希望,接下来放大招,能够稳定有效地识别图片中的二维码,先说下识别思路。

对图片进行通道分解,基于RGB和HSV通道分解得到六个通道的图片,基于这六张图片进行二维码识别,测试结果表明基于S通道的图片二维码识别,在图片保证清晰的情况下,识别率将近99%以上。以下是halcon代码:

read_image (Image, ImageFiles[Index])
    *分解图片为三通道
    decompose3 (Image, ImageR, ImageG, ImageB)
    *分解成HSV通道
    trans_from_rgb (ImageR, ImageG, ImageB, ImageH, ImageS, ImageV, 'hsv')
    rgb1_to_gray (Image, GrayImage)
    get_image_size (GrayImage, Width, Height)
    dev_open_window (0, 0, 800, 600, 'black', WindowHandle)
    InputImage:=Image
    create_data_code_2d_model ('Data Matrix ECC 200', 'default_parameters', 'enhanced_recognition', DataCodeHandle)
    set_data_code_2d_param (DataCodeHandle, 'polarity', 'dark_on_light')
    set_data_code_2d_param (DataCodeHandle, 'symbol_shape', 'rectangle')
    *set_data_code_2d_param (DataCodeHandle, 'timeout', delayTime)
    *set_data_code_2d_param (DataCodeHandle, 'symbol_size_min', minSize)
    *set_data_code_2d_param (DataCodeHandle, 'symbol_size_max', maxSize)
    *set_data_code_2d_param (DataCodeHandle, 'mirrored', 'no')
    *set_data_code_2d_param (DataCodeHandle, 'contrast_min', minContrast)
    *开始找码
    find_data_code_2d (ImageS, SymbolXLDs, DataCodeHandle, 'stop_after_result_num', 4, ResultHandles, DecodedDataStrings)
    disp_message (WindowHandle, '识别结果:'+DecodedDataStrings, 'window', 20, 20, 'red', 'true')
    clear_data_code_2d_model (DataCodeHandle)

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

beyond951

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

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

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

打赏作者

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

抵扣说明:

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

余额充值