一、图像预处理和条码增强

对比度太低:scale_image(或使用外部程序scale_image_range),增强图像的对比度。

图像模糊:emphasize锐化图像,使条码看起来更清晰。

深色背景上读取浅色条码:invert_image反转图像。

二、解码涉及的主要算子

read_image :读图

create_bar_code_model :创建条码模型

find_bar_code :查找条码

clear_bar_code_model :清除条码模型

如果条码非常简单,那么顺次执行上面4个算子就可以完成解码了。另外还有几个算子也很重要:

set_bar_code_param :设置解码时的参数

decode_bar_code_rectangle2 :在指定的矩形区域内解码

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

get_bar_code_result :获得解码后的结果,例如可以获得条码的类型(Code 128、Code 39等等)

get_bar_code_object :获得解码时的一些对象,例如可以获得解码后的条码区域

三、提高解码能力的其他措施

如果条码图像预处理以后,仍旧解码困难或者解码率不高,那么可以通过以下措施进一步提高解码能力:

1、如果整张图信息太多,则可以先把条码区域挖出来,使用reduce_domain和crop_domain算子,这样不仅可以降低解码难度,还可以减少解码时间。也可使用decode_bar_code_rectangle2在指定的矩形区域内解码。

2、可以尝试把条码图像转正再解码。(这种操作未经严格验证,不知道是否可以有效提高解码率)

3、当条码很密或者很小的时候,可以尝试用zoom_image_factor放大了条码图像。

4、find_bar_code中将“CodeType”设置为“auto”可以读取多种类型的条码,但是会增加运行时间,且可能会降低解码的可靠性。最好只扫描预知的条形码类型。

5、如果对于质量很差的条码,可以模拟日常手机扫码时的操作,即多次改变曝光,多次解码的方式,参考文章:

https://www.cnblogs.com/xh6300/p/9809692.html

6、通过set_bar_code_param算子设置解码时的参数,可以有效提高解码能力。(见下文)

四、set_bar_code_param算子的参数解析

'element_size_min'

条码的最小尺寸,指条码宽度和间距,大码应设大一点,减少处理时间

'element_size_max'

条码的最大尺寸,不能过小也不能过大

'check_char'

是否验证校验位,'absent'不检查校验和,'present'检查校验和

'persistence'

设置为1,则会保留中间结果,评估条码印刷质量时会用到

'num_scanlines'

解码时所用扫描线的最大数目,设置为0表示自动确定,一般设置为2-30

'start_stop_tolerance'

容许误差值,可设置为'low'或者'high',设置为'high'可能造成误判

'orientation'、'orientation_tol'

分别指条码的方向和方向容差,设置准确可大大提高解码效率

'element_height_min'

条码的最小高度,默认值-1表示自动推测条码高度,该参数对速度影响大

'stop_after_result_num'

设置要解码的个数,0表示全部找出,设置为2表示找到2个就不找了

有多个参数需要设置时,也可以把多个参数放在一句话里面,例如:

set_bar_code_param (BarCodeHandle,['check_char','element_size_min','element_size_max'], ['present',5,30])

下面用一个完整的条码解码程序来演示一下:

 1 dev_set_draw ('margin')
dev_set_line_width ()
set_font (, '-Courier New-18-*-*-*-*-1-') list_files ('pic', ['files','follow_links'], ImageFiles)
tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)
for Index := to |ImageFiles| - by
read_image (Image, ImageFiles[Index])
gen_rectangle1 (Rectangle, , , 765.5, )
reduce_domain (Image, Rectangle, Image)
* crop_domain (ImageReduced, Image) *优化条码图像
emphasize (Image, Image, , , )
scale_image_range (Image, ImageScaled, , ) *创建条码模型
create_bar_code_model ([], [], BarCodeHandle) *设置解码参数
set_bar_code_param (BarCodeHandle, 'element_size_min', )
set_bar_code_param (BarCodeHandle, 'element_size_max',)
set_bar_code_param (BarCodeHandle,'check_char','present')
set_bar_code_param (BarCodeHandle, 'persistence', )
set_bar_code_param (BarCodeHandle, 'num_scanlines', )
set_bar_code_param (BarCodeHandle, 'start_stop_tolerance', 'high')
set_bar_code_param (BarCodeHandle, 'orientation', )
set_bar_code_param (BarCodeHandle, 'orientation_tol', )
set_bar_code_param (BarCodeHandle, 'element_height_min', )
set_bar_code_param (BarCodeHandle, 'stop_after_result_num', ) *解码
**decode_bar_code_rectangle2的解码能力似乎不如find_bar_code,漏掉了一个码
* smallest_rectangle2 (Rectangle, Row1, Column1, Phi, Length1, Length2)
* decode_bar_code_rectangle2 (Image, BarCodeHandle, ['Code 128','Code 39'], Row1, Column1, Phi, Length1, Length2, DecodedDataStrings) * ['Code 128','Code 39']这么写表示既可以解128码,也可以解39码
find_bar_code (Image, SymbolRegions1, BarCodeHandle, ['Code 128','Code 39'], BarCodeStrings) get_bar_code_param (BarCodeHandle, 'element_size_min', GenParamValues)
get_bar_code_object (BarCodeObjects, BarCodeHandle, 'all', 'symbol_regions')
get_bar_code_result (BarCodeHandle, 'all', 'decoded_types', BarCodeResults)
get_bar_code_result (BarCodeHandle, , 'quality_isoiec15416', Quality)
disp_message (, BarCodeResults + '码:' + BarCodeStrings, 'image', , , 'black', 'true') *清除条码模型
clear_bar_code_model (BarCodeHandle)
stop ()
endfor

参考资料:

1、Halcon解决方案指南(16)一维码识别

2、基于Halcon的一维条码识别技巧

Halcon的一维条码解码步骤和解码技巧的更多相关文章

  1. Halcon的二维码解码步骤和解码技巧

    一.二维码简介 1 . 类型多样,常见的有QR Code二维码. Data Matrix二维码等. 2.高密度编码,信息容量大. 3.容错能力强,具有纠错功能:二维码因穿孔.污损等引起局部损坏时,照样 ...

  2. Halcon一维码和二维码的解码步骤和技巧——第11讲

    针对Halcon中一维码和二维码的解码,我分别写了两篇文章,参见: <Halcon的一维条码解码步骤和解码技巧>:https://www.cnblogs.com/xh6300/p/1048 ...

  3. 【视频开发】GPU编解码:GPU硬解码---DXVA

    GPU编解码:GPU硬解码---DXVA 一.DXVA介绍 DXVA是微软公司专门定制的视频加速规范,是一种接口规范.DXVA规范制定硬件加速解码可分四级:VLD,控制BitStream;IDCT,反 ...

  4. iOS-地图定位 && 解码与反解码

             前段时间,公司开发的App用到了地图和定位,所以记录一下,作为回顾总结.     对于地图和定位,苹果公司提供给了两个框架: MapKit:用于地图展示 Core Location ...

  5. FFmpeg编解码处理2-编解码API详解

    本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10584925.html FFmpeg编解码处理系列笔记: [0]. FFmpeg时间戳详 ...

  6. 基于Halcon的一维条码识别技巧

    Bar Code 条形码 1.clear_all_bar_code_models    清除所有条形码模型释放内存clear_all_bar_code_models( : : : )2.clear_b ...

  7. java转换字符串编码格式 (解码错误,重新解码)

    字符集概念:规定了某个文字对应的二进制数字存放方式(编码)和某串二进制数值代表了哪个文字(解码)的转换关系. 我们在计算机屏幕上看到的是实体化的文字,而在计算机存储介质中存放的实际是二进制的比特流. ...

  8. FFmpeg(9)-解码器解码代码演示(FFmpeg调用MediaCodec实现硬解码、多线程解码、及音视频解码性能测试)

    一.AVFrame 用来存放解码后的数据. [相关函数] AVFrame *frame = av_frame_alloc();                       // 空间分配,分配一个空间 ...

  9. 玩转X-CTR100 l STM32F4 l U-Blox NEO-6M GPS卫星定位-nmealib解码库移植解码

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ]      本文介绍X-CTR100控制器 扩展GPS ...

随机推荐

  1. 使用promisify来流程化异步操作

    现代js包括nodejs中有很多函数都是异步执行的, 我们总是需要写一个回调函数并且作为最后以一个参数传入,而我希望的是能像写promise这样的回调 promise .then() .then() ...

  2. Python - Django - 使用 Pycharm 连接 MySQL 数据库

    在 Pycharm 的右上方找到 Database 点击 依次点击,选择 MySQL 数据库 点击 Download 下载驱动文件 下载完成后对数据库的相关信息进行填写 填写完成后点击“Test Co ...

  3. Fork-Join 原理深入分析(二)

      本文是将 Fork-Join 复杂且较为庞大的框架分成5个小点来分析 Fork-Join 框架的实现原理,一个个点地理解透 Fork-Join 的核心原理. 1. Frok-Join 框架的核心类 ...

  4. vb 水晶报表打印

    vb里面的水晶报表打印控件:CrystalReportViewer 用到的dll文件: 水晶报表打印其实很简单,只要创建报表对象,再对其传递数据就可以打印出来.当然所传递的数据要与水晶报表设计里面的数 ...

  5. License分类 + 引入开源软件时License的注意事项

    License分类 GPL: linux.openJDK,openJFX,mysql 融合感染,单独子模块不感染(自己的模块与引入模块的通信方式是socket) openJDK(GNU General ...

  6. ganglia

    A.lamp界面快速搭建---------------------------------------------------------------------------------------- ...

  7. 今天练手了下mysqlbinlog,标记下

    1 首先查看是否开启了 bin log 登录mysql后  使用命令 show variables like "log_%"; show binary logs; 2  确认开启了 ...

  8. Amazon AWS S3 操作手册

    Install the SDK The recommended way to use the AWS SDK for Java in your project is to consume it fro ...

  9. ajax 遍历json一维数组

    $.each(data,function(index,value){}data必须是Object类型index是数组的下标value可以是一个对象 function myonclick() { var ...

  10. django-allauth 使用

    参考: http://www.honkerzhou.com/post/3/ https://www.jianshu.com/p/41335d861a8d https://django-allauth. ...